電子書籍の厳選無料作品が豊富!

拡張子を.wavとしてあるa.wavというファイルがあります。

fopenとfread関数を用いて以下のように読込み、
fp = fopen("a.wav","rb");
fread(data[0],4,1,fp);

fopenとfwriteを用いてb.wavファイルに以下のように書き込みました。
fa= fopen("b.wav","wb");
fwrite(data[0],4,1,fa);

書き込んだb.wavファイルですが、
バイナリエディタStirlingでa.wavとb.wavファイルの中身を比較したら中身は同じでした。

しかし、a.wavファイルでは音が出力されるのに、b.wavファイルでは音が出力されずエラーが出ます。
この原因はいったいなんでしょうか?

原因がわかる方がいましたら教えていただけないでしょうか?
よろしくお願いいたします。

A 回答 (3件)

wavファイルについては詳しく判りませんので、想像ですが、本当にa.wav と b.wavの内容は同じなのでしょうか。

ファイルサイズは本当に4バイトなのでしょうか?
念のため、コマンドプロンプトで、fcコマンドを使用し、ファイルの内容を比較してみてください。
fc /b a.wav b.wav
で比較ができます。
コマンドは両ファイルが存在するディレクトリ上で実行してください。
もし、その結果ファイルの内容が全て一致していた場合は、wavファイルの仕様ということになり、プログラムの問題ではなくなります。(ファイルの内容は同じだが他の何らかの属性が違っているため音がでないということが考えられるが、その場合はwavファイルについて詳しい方の回答を待つしかない。)
    • good
    • 0
この回答へのお礼

ありがとうございます。fcコマンドでミスに気づきました。本当にありがとうございました。

お礼日時:2011/07/08 23:02

> (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では)なんですが。

具体的に、どんなエラー内容になったのですか?それによっても対処方法は違います。
    • good
    • 0
この回答へのお礼

丁寧なご回答ありがとうございます。恥ずかしながら、ただのプログラムミスでした。
方針等に間違いはありませんでした。

お礼日時:2011/07/08 22:39

dataの宣言はどうなってますか?


data[0]の中身は?
これでfread/fwriteされるのは、「data[0]の領域」ではなく、「(ポインタである)data[0]が指す領域]となりますが、それでいいですか?
4バイト読み書きするだけのようですけど、合ってますか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

(1)data[0]の宣言はchar data[1000][5];です。
(2)dataの中身はchar型の関数です。
(3)それで問題ないと考えています。ただ、初心者のため、難しいことはあまりわかっていません。「data[0]の領域」ではなく、「(ポインタである)data[0]が指す領域]とした場合の問題などがあれば教えてほしいです。
(4)4バイトのchar型で読み書きしたいのであっていると思います。

すみません。お手数おかけしますがよろしくお願いいたします。

お礼日時:2011/07/08 19:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!