エラー:ストリームの終わりを超えて読み取ることはできません

このQ&Aのポイント
  • VB2008を使い始めたばかりの初心者です。以下のようなプログラムで、ちょうど下から5行目くらいの「右CHを最大個数まで読む」の行がエラーがでてしまいます。
  • WAVEファイルを読み込むプログラムで、最大数を3000として考えています。WAVEファイルは音声ファイルで、構成はRIFF、サイズ、WAVE、fmt、dataという順番になっています。
  • また、WAVEファイルはステレオで、2チャンネルあり、実際の音データは左、右と交互に入っています。プログラムの中の「右CHを最大個数まで読む」の部分でエラーが発生しています。原因が分かりません。
回答を見る
  • ベストアンサー

エラー:ストリームの終わりを超えて読み取ることはできません

VB2008を使い始めたばかりの初心者です。 以下のようなプログラム(一部省略)で、ちょうど下から5行目くらいの 「右CHを最大個数まで読む」の行がエラーがでてしまいます。すぐ上の「左CHを最大個数まで読む」ではエラーはでません。 原因が分からないため、教えてください!! WAVEファイルを読み込むプログラムです。 最大数を3000として考えています。 WAVEファイルは音声ファイルで、構成は以下のようになっています。 RIFF:4バイト サイズ:4バイト WAVE:4バイト fmt:4バイト fmtチャンクのデータ:20バイト←上の12バイトは読まなくて良いため、hdp=13としてここから読みはじめています data:4バイト dataサイズ:4バイト dataチャンクのデータ:ここが読み取りたい音声にあたるデータ また、WAVEファイルはステレオで、2チャンネルあり、実際の音データは(dataチャンクのデータ)左、右・・・と交互に入っています。 ---------------------------------------------------------------------- Const WD As Short = 30000 '最大のデータ数30000 Private l_wave(WD) As Integer '左チャンネルのデータ配列 Private r_wave(WD) As Integer '右チャンネルのデータ配列 Private dmax As Integer 'データ数の最大値 Private filename As String 'ファイル名 Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer     '-------ファイルを開く------------------------------------------------- OpenFileDialog1.Filter = "waveファイル(*.wav)|*.wav" If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then filename = OpenFileDialog1.FileName Else Exit Sub End If     '----------------------------------------------------------------------  Dim hID As New VB6.FixedLengthString(4) 'チャンクID、4文字分 Dim hdsize As Integer 'チャンクサイズ Dim hdp As Integer 'ポインタ=チャンクの位置 Dim fsize As Integer Dim i As Object dmax = WD '最大データ個数 fsize = FileLen(filename) 'ファイルサイズの取得 hdp = 13 'fmtチャンクの位置 FileOpen(1, filename, OpenMode.Binary) 'ファイルをバイナリモードで開く '****************ファイルの終わりまで繰り返す*********************************** Do Until hdp >= fsize FileGet(1, hID.Value, hdp) 'チャンクHIDの種類の取得 FileGet(1, hdsize)     'チャンクのサイズの取得              '------チャンクIDがfmtならその位置をIntegerで返す--------------------- If InStr(hID.Value, "fmt") Then TextBox1.Text = hID.Value FileGet(1, wavfmt) End If       '---------------------------------------------------------------------       '------チャンクIDがdataならその位置をIntegerで返す--------------------- If InStr(hID.Value, "data") Then TextBox1.Text = TextBox1.Text & vbCrLf & hID.Value   For i = 0 To 10 FileGet(1, l_wave(i)) '左chデータを最大個数まで読む FileGet(1, r_wave(i)) '右chデータを最大個数まで読む ***エラー箇所*** Next   End If       '----------------------------------------------------------------------- hdp = hdp + hdsize + 8       '次のチャンクへ8バイトポインタ移動 Loop '******************************************************************************** 

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Do ... Loop の設置方法がおかしいのでは ・・・ wavFmtまで読み込んだ後にDOループになるのでは ・・・ If hID.Value = "fmt " Then   TextBox1.Text = hID.Value   if hdsize< 16 then     MsgBox "no PCM DATA"     Exit Sub   end if   FileGet(1, wavfmt) End If dim ChSize as integer dim dummy as byte FileGet( 1, hID.Value ) FileGet( 1, ChSize ) Try   do while hID.value <> "data"     for n as integer = 1 to ChSize       FileGet(1,dummy)     next     FileGet( 1, hID.Value )     FileGet( 1, ChSize )   Loop   for i = 1 to ChSize step 2     FileGet( 1, l_wave(i))     FileGet( 1, r_wave(i))   next Catch ex Exception End Try FileClose(1) といった具合なのでは ・・・

sakyyy
質問者

お礼

本当です!Do Loopを変えたらできました!!ありがとうございます! あとお聞きしたいのですが、FileGet(1,dummy)とは、一度退避させるようなものですか?必ず必要なのでしょうか? あまり分からず、使わせていただきましたので・・・ ぜひご回答おねがいします!! ちなみに下から7行目が「For i = 0 To 10」じゃなくて、「For i = 0 To dmax-1」でしたね、すみません。テスト用に変更していました。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

  do while hID.value <> "data"     for n as integer = 1 to ChSize       FileGet(1,dummy)     next     FileGet( 1, hID.Value )     FileGet( 1, ChSize )   Loop の部分の FileGet(1,dummy)ということでしょうか? これは退避というより読み捨てです 今回取得したチャンクのシグネッチャーが『data』以外だったのでその長さ分読み捨てて次のチャンクを読み込むといった処理をしています

sakyyy
質問者

お礼

なるほど! そういう意味だったんですね!! わかりやすい説明ありがとうございます!!

関連するQ&A

  • EXCEL2007のVBAを使って、テキストファイルを読み込んで別のテ

    EXCEL2007のVBAを使って、テキストファイルを読み込んで別のテキストファイルを作って書き込むというコードを書きましたが、新しく出来たテキストファイルの末尾に、もともとのファイルには無かったスペースが追加されてしまいます。 原因と対策を教えて頂きたいです。 ------------------------------------------------------- Dim FileName1 As String Dim FileName2 As String Dim FileNumber1 As Integer Dim FileNumber2 As Integer Dim Data As String FileName1 = Application.GetOpenFilename("Text Files (*.txt), *.txt") FileName2 = Application.GetSaveAsFilename(, "Text Files (*.txt), *.txt") Data = Space(FileLen(FileName1)) FileNumber1 = FreeFile Open FileName1 For Binary As #FileNumber1 Get #FileNumber1, , Data Close #FileNumber1 'この間に"Data"内容を処理するコードを入れる予定 FileNumber2 = FreeFile Open FileName2 For Binary As #FileNumber2 Put #FileNumber2, , Data Close #FileNumber2 ------------------------------------------------------- このコードで1284バイトのテキストを読み込ませると末尾にスペースが追加されて1918バイトになってしまいました。 "Data"の内容を表示させてもスペースはなく、Len関数で大きさを調べても1284バイトです。

  • Visual Basic.NETのエラー("オブジェクト参照がオブジェクト インスタンスに設定されていません。")について

    DLLを読み込むプログラムで、以下のように宣言した関数"VCread_wave_file"を呼び出そうとすると、 "オブジェクト参照がオブジェクト インスタンスに設定されていません。" というエラーが出てしまうのですが、なぜなのでしょうか? プログラムは以下のようになっています。 Public Class Form1 Inherits System.Windows.Forms.Form Dim status As Integer Dim wavelength As Long Dim samplf As Double Private Declare Function VCread_wave_file Lib "Vcon.dll" (ByVal FileName As String, ByVal tmpFilename As String, ByVal wavelength As Long, ByVal samplingFrequency As Double) As Integer (中略) Private Sub ChangeStartButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChangeStartButton.Click status = VCread_wave_file("rectmp.wav", "rectmp.raw", wavelength, samplf) Label4.Text = status End Sub よろしくお願いいたします。

  • CommonDialog でエラー

    OSとExcelを再インストールしたところ、下記のところでエラーが出ました。 なぜでしょうか。解決策はあるでしょうか。 以前は、使用できておりました。 Excelのマクロは、ほとんど理解しておりません。 他人が作成したマクロになります。 OS:WindowsXp Excel:2003 よろしくお願いします。 Private Sub CommandButton3_Click() Dim strArg() As String Dim i As Integer CommonDialog1.filename = ""   ←ここでエラーがでてとまります。 CommonDialog1.ShowOpen strArg = Split(CommonDialog1.filename, "\")  ごにょごにょ演算など。 End Sub

  • OLEDragDropで フォームとSSTABの違いがわからない。

    VisualBasicを使っています。 OLEDragDropを使おうとしていますが、フォームの方は正しく動作しましたが、 SSTABの方はファイルをドロップさせても無反応でした。 使い方を間違えているのでしょうか? Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) Call PicConvert(Data) End Sub Private Sub SSTab1_OLEDragDrop(Data As TabDlg.DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) Call PicConvert(Data) End Sub

  • VB2008 2バイト文字の化け字は当然! Yes or No?

    Function FileGetChar(ByVal f As String, ByVal p As Integer) As String   Dim n As Integer = FreeFile()   Dim c As Char = “”   If File.Exists(f) Then     FileOpen(n, f, OpenMode.Random, OpenAccess.Read, , 1)     Seek(n, p)     If Not EOF(n) Then       FileGet(n, c)     End If     FileClose(n)   End If   Return c End Function このようにSeek関数とFileGet関数を利用する限りでは2バイト文字の化け字は避けられない! 一体、この私の判断は正しいのでしょうか? VB2008 Express Edition

  • VB2005でのファイル操作について

        Dim filedata As String Dim fileNum As Integer Dim fileName As String Dim i As Integer fileName = "C:\Paradata.txt" fileNum = FreeFile() FileOpen(fileNum, fileName, OpenMode.Output) For i = 0 To 9 filedata = data(i, 0) & "," & data(i, 1)・・・・・ PrintLine(fileNum, filedata) Next FileClose あるボタンを押しますと上記のようにテキストファイルにデータを保存しようとしているのですが、1回目のボタンクリックではエラーが無いのですが2回目以降は"別のプロセスで使用されているため、プロセスはファイル 'C:\Paradata.txt' にアクセスできません。"のエラーが発生してしまいます。いろいろと調べているのですがまだわからないのでどこがおかしいか教えてください。よろしくお願い致します。

  • デバッグエラー

    VBで、簡単なお絵かきツールを作りましたが、ボタン4(開くイベント)で、「開く」ではなく、キャンセルをクリックした際に、デバッグエラーが出ました。 プログラムを記載しておきますので、対処方法を教えていただけませんか。 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Dim filename As String OpenFileDialog1.AddExtension = True OpenFileDialog1.Filter = "すべてのファイル|*.*" OpenFileDialog1.ShowDialog() OpenFileDialog1.Title = "開くファイルを指定してください。" filename = OpenFileDialog1.FileName If filename <> "" Then b.Dispose() canvas.Dispose() canvas = Image.FromFile(filename) b = Graphics.FromImage(canvas) PictureBox1.Image = canvas End If End Sub です。 ちなみに、保存の際には出ません。

  • 数値データを、WAVEファイルにするソフトってありますか?

    wave2txtというソフトでWAVEファイルに変換し、そのデータに手を加えるという作業をしているのですが、このtextデータを、もう一度WAVEファイルに戻す方法が皆目見当がつきません。誰か助けてください。

  • Excel シートにボタンを作成するVBA

    ExcelシートのA列にWAVEファイルのフルパス名が書かれている状態で、 このWAVEファイルを再生するボタンをC列に作成するVBAを作りたいのですが、 ボタンが押されたときに実行されるプロシージャに引数がないときは、 コード1のようにすればできますが、 ボタンが押されたときに実行されるプロシージャに引数があるときは、 コード2のように記述してもエラーになりますが、 どのように記述すればよいのでしょうか。(Windows10,Excel2010) '-----------------コード1------------------------------------------ Sub test()  Dim row As Integer  Dim wave_file_path As String  row = 1  wave_file_path = ThisWorkbook.Worksheets("Sheet1").Cells(row, 1).Value  Call 再生ボタン作成(row, wave_file_path) End Sub Sub 再生ボタン作成(ByVal row As Integer, ByVal wave_file_path As String)  Dim cell_loc As String  cell_loc = ThisWorkbook.Worksheets("Sheet1").Cells(row, 3).Address  ThisWorkbook.Worksheets("Sheet1").Select  With ActiveSheet.Buttons.Add(Range(cell_loc).Left, _   Range(cell_loc).Top, _   Range(cell_loc).Width, _   Range(cell_loc).Height)   .name = "ボタン_" & cell_loc   .OnAction = "WAVE_PLAY"   .Characters.Text = "再生"  End With End Sub Sub WAVE_PLAY()  Dim wave_file_path As String  wave_file_path = "Z:\Document\4_Data\CD_DVD_USB\USB_20200222\REC\JBP001\JBP00101.WAV"  If Dir(wave_file_path) = "" Then   MsgBox wave_file_path & vbCrLf & "がありません。", vbExclamation   Exit Sub  End If  Shell "C:\Program Files\Windows Media Player\wmplayer.exe /play /close " & wave_file_path End Sub '------------------------------------------------------------------- '-------------------コード2---------------------------------------- Sub test()  Dim row As Integer  Dim wave_file_path As String  For row = 1 To 100   wave_file_path = ThisWorkbook.Worksheets("Sheet1").Cells(row, 1).Value   Call 再生ボタン作成(row, wave_file_path)  Next row End Sub Sub 再生ボタン作成(ByVal row As Integer, ByVal wave_file_path As String)  Dim cell_loc As String  cell_loc = ThisWorkbook.Worksheets("Sheet1").Cells(row, 3).Address  ThisWorkbook.Worksheets("Sheet1").Select  With ActiveSheet.Buttons.Add(Range(cell_loc).Left, _   Range(cell_loc).Top, _   Range(cell_loc).Width, _   Range(cell_loc).Height)   .name = "ボタン_" & cell_loc   .OnAction = "WAVE_PLAY " & wave_file_path ' <==== ◆ここでエラーになります◆   .Characters.Text = "再生"  End With End Sub Sub WAVE_PLAY(ByVal wave_file_path As String)  If Dir(wave_file_path) = "" Then   MsgBox wave_file_path & vbCrLf & "がありません。", vbExclamation  Exit Sub  End If  Shell "C:\Program Files\Windows Media Player\wmplayer.exe /play /close " & wave_file_path End Sub '-------------------------------------------------------------------

  • Accessファイルをコピーするとコードが消える

    まだAccessを触り初めてから日が浅いこともあり、すでに稼働しているファイルをコピーしてから 勉強用、変更用として利用することが多いのですが コピー後起動させてみるとコード内のVBAが省略?されていることがありイベントが実行されないという現象が起きています。 下のような状態です。 Private Sub ページフッターセクション_Format(Cancel As Integer, FormatCount As Integer) ↓ Private Sub ページフッタFormat(Cancel As Integer, FormatCount As Integer) コピーが原因かはわかりませんが、本日コピーを数回行って試したところ、すべてのコピーファイルで症状がでました。(単純に元ファイルが既におかしかったのかも) mdbファイルaccdbファイルともに同じ症状が起こる場合があります。 VBAがおかしくなった場合元データ、コピーデータ共におかしくなっていることがあります。 通常にファイルをコピーすることもできています。 こういった文字が省略された形でコピーされるというのは何が原因で起こる症状なのでしょうか? お分かりの方がいらっしゃいましたらご教授ください。 環境 windows7professional32bit Access2010

専門家に質問してみよう