- ベストアンサー
バイナリ書き込みでエラーが出る原因とは?
- バイナリファイルの読み込みと書き込みの方法について説明されています。
- a.wavファイルとb.wavファイルの中身を比較した結果、同じであるにもかかわらず、b.wavファイルでは音が出力されないエラーが発生しています。
- 原因がわかる方は教えていただけないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
wavファイルについては詳しく判りませんので、想像ですが、本当にa.wav と b.wavの内容は同じなのでしょうか。ファイルサイズは本当に4バイトなのでしょうか? 念のため、コマンドプロンプトで、fcコマンドを使用し、ファイルの内容を比較してみてください。 fc /b a.wav b.wav で比較ができます。 コマンドは両ファイルが存在するディレクトリ上で実行してください。 もし、その結果ファイルの内容が全て一致していた場合は、wavファイルの仕様ということになり、プログラムの問題ではなくなります。(ファイルの内容は同じだが他の何らかの属性が違っているため音がでないということが考えられるが、その場合はwavファイルについて詳しい方の回答を待つしかない。)
その他の回答 (2)
- kmee
- ベストアンサー率55% (1857/3366)
> (2)dataの中身はchar型の関数です。 宣言を見ると、関数ではないです。配列です。 char data[1000][5]; と宣言したなら、 data[0],data[1]...はそれぞれ、char [5]の配列です。 > 「data[0]の領域」ではなく、「(ポインタである)data[0]が指す領域]とした場合の問題などがあれば教えてほしいです。 こう書いたのは、dataの宣言がなかったので、判断できなかったからです。 たとえば int data[100] ; と宣言されていた場合、 data[0]はint型です。 ここで、fread(data[0],4,1,fp); とすると、data[0]に値が入るのではなく、data[0]の値を先頭アドレスと考えた領域に読み込まれる、ということです。読む前のdata[0]の値によっては、他の変数の領域を破壊したり、エラーで止ったりします。 (実際には、エラーでコンパイルできないでしょうが) 今回はchar data[1000][5];だったの、data[0]はchar[5]の配列(≒charへのポインタ)だったので、「(ポインタである)data[0]が指す領域]で正しいです。 > (4)4バイトのchar型で読み書きしたいのであっていると思います。 最終的にファイル全部を読んで書いているのですね?質問に書かれているのだけでは、4バイトしか読み書きしてないように見えます。 > バイナリエディタStirlingでa.wavとb.wavファイルの中身を比較したら中身は同じでした。 Stirlingを使ったことないのでわからないのですが、この比較とは全体を比較した結果ですね?表示されてるページだけ、ってのは無いですね? あと、ファイルサイズは一致してますか?(プロパティやDIRコマンドでバイト単位で同じか調べてください) ファイルサイズが一致していて、中身もバイナリーで同じで拡張子も一緒なら、同じ動作をするはず(特にWindowsでは)なんですが。 具体的に、どんなエラー内容になったのですか?それによっても対処方法は違います。
お礼
丁寧なご回答ありがとうございます。恥ずかしながら、ただのプログラムミスでした。 方針等に間違いはありませんでした。
- kmee
- ベストアンサー率55% (1857/3366)
dataの宣言はどうなってますか? data[0]の中身は? これでfread/fwriteされるのは、「data[0]の領域」ではなく、「(ポインタである)data[0]が指す領域]となりますが、それでいいですか? 4バイト読み書きするだけのようですけど、合ってますか?
お礼
ご回答ありがとうございます。 (1)data[0]の宣言はchar data[1000][5];です。 (2)dataの中身はchar型の関数です。 (3)それで問題ないと考えています。ただ、初心者のため、難しいことはあまりわかっていません。「data[0]の領域」ではなく、「(ポインタである)data[0]が指す領域]とした場合の問題などがあれば教えてほしいです。 (4)4バイトのchar型で読み書きしたいのであっていると思います。 すみません。お手数おかけしますがよろしくお願いいたします。
お礼
ありがとうございます。fcコマンドでミスに気づきました。本当にありがとうございました。