エラー:ストリームの終わりを超えて読み取ることはできません
- 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 '********************************************************************************
- sakyyy
- お礼率53% (7/13)
- Visual Basic
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
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) といった具合なのでは ・・・
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
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』以外だったのでその長さ分読み捨てて次のチャンクを読み込むといった処理をしています
お礼
なるほど! そういう意味だったんですね!! わかりやすい説明ありがとうございます!!
関連する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
- 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 よろしくお願いいたします。
- 締切済み
- Visual Basic
- 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
- 締切済み
- Excel(エクセル)
- 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
- ベストアンサー
- Visual Basic
- 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
- 締切済み
- Visual Basic
- 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' にアクセスできません。"のエラーが発生してしまいます。いろいろと調べているのですがまだわからないのでどこがおかしいか教えてください。よろしくお願い致します。
- 締切済み
- Visual Basic
- デバッグエラー
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 です。 ちなみに、保存の際には出ません。
- ベストアンサー
- Visual Basic
- 数値データを、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 '-------------------------------------------------------------------
- ベストアンサー
- Excel(エクセル)
- 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
- ベストアンサー
- オフィス系ソフト
お礼
本当です!Do Loopを変えたらできました!!ありがとうございます! あとお聞きしたいのですが、FileGet(1,dummy)とは、一度退避させるようなものですか?必ず必要なのでしょうか? あまり分からず、使わせていただきましたので・・・ ぜひご回答おねがいします!! ちなみに下から7行目が「For i = 0 To 10」じゃなくて、「For i = 0 To dmax-1」でしたね、すみません。テスト用に変更していました。