![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
拡張子を.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ファイルでは音が出力されずエラーが出ます。
この原因はいったいなんでしょうか?
原因がわかる方がいましたら教えていただけないでしょうか?
よろしくお願いいたします。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?e8efa67)
No.2ベストアンサー
- 回答日時:
wavファイルについては詳しく判りませんので、想像ですが、本当にa.wav と b.wavの内容は同じなのでしょうか。
ファイルサイズは本当に4バイトなのでしょうか?念のため、コマンドプロンプトで、fcコマンドを使用し、ファイルの内容を比較してみてください。
fc /b a.wav b.wav
で比較ができます。
コマンドは両ファイルが存在するディレクトリ上で実行してください。
もし、その結果ファイルの内容が全て一致していた場合は、wavファイルの仕様ということになり、プログラムの問題ではなくなります。(ファイルの内容は同じだが他の何らかの属性が違っているため音がでないということが考えられるが、その場合はwavファイルについて詳しい方の回答を待つしかない。)
No.3
- 回答日時:
> (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では)なんですが。
具体的に、どんなエラー内容になったのですか?それによっても対処方法は違います。
No.1
- 回答日時:
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型で読み書きしたいのであっていると思います。
すみません。お手数おかけしますがよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(パソコン・周辺機器) Windows10パソコンで再生している音をWAVファイルとして録音、保存する方法は? 4 2023/06/15 18:34
- スピーカー・コンポ・ステレオ 高音質でCDに書き込みしたいです。 11 2022/04/05 14:45
- 画像編集・動画編集・音楽編集 wavファイルが持っているファイル長の変更 1 2022/07/11 17:43
- その他(コンピューター・テクノロジー) ギガファイル便で送ったzipファイルの中のwavファイルが空だと言われたのですがどういう可能性が考え 2 2022/04/24 22:29
- その他(コンピューター・テクノロジー) wavとmp3の拡張子の変更について 4 2022/05/31 23:42
- その他(AV機器・カメラ) FireTVstickで音楽ファイルが表示されません 1 2023/04/27 20:17
- Outlook(アウトルック) なんで?gmailで編集したファイル(wav?)が送れない!容量がデカいからか?(30MBくらいなの 3 2022/11/23 15:18
- その他(音楽・ダンス・舞台芸能) CDが200枚ほどあります。そろそろデジタル化して処分しようと思ってるのですが、 2 2023/08/17 08:44
- スピーカー・コンポ・ステレオ 位相が反転しているのか 2 2022/12/15 15:55
- その他(AV機器・カメラ) AmazonミューシックHDのハイレゾ曲をflac拡張子で、SDカードに保存したいのですが? 1 2022/09/16 13:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPでCSVの一部の行を編集したい
-
rubyで複数列のデータを一行に...
-
ヒアドキュメントの中のfor文
-
While文を使って配列の中身を全...
-
PHP SimpleXml unsetについて
-
複数行のデータのPOST処理に関して
-
stdClass Objectを連想配列のよ...
-
文字列の文字一文字ずつを解析...
-
自動で番号を振りたい
-
C言語でCSVファイルの行数を読...
-
別ファイルの構造体の値を読み...
-
csvの内容を行単位で削除したい
-
Resource id #3 と表示されま...
-
バイナリファイルの内容を、そ...
-
読み(あ行~わ行)ごとに分け...
-
Smartyでインクリメント
-
CArrayの要素としてCStringArra...
-
C言語の配列をPush(追加)する...
-
多次元配列の中で条件に合う要...
-
forとかで連番の変数を一気に格...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別ファイルの構造体の値を読み...
-
Resource id #3 と表示されま...
-
stdClass Objectを連想配列のよ...
-
CSVデータの行数カウントをした...
-
ヒアドキュメントの中のfor文
-
複数行のデータのPOST処理に関して
-
C言語でCSVファイルの行数を読...
-
While文を使って配列の中身を全...
-
行数が30万件ほどあるCSVから、...
-
CSVファイルの最終行のデー...
-
csvの内容を行単位で削除したい
-
バイナリファイルの内容を、そ...
-
doxygenを使用する環境について
-
PHPで、CSVファイルを、指定し...
-
FortranのOPEN文
-
csvファイルを読み込み→上書き...
-
PHPでCSVの一部の行を編集したい
-
ラジオボタンのチェックの付け方。
-
Ethnaでのsection使用法
-
CSVデータを正規表現で抜き出せ...
おすすめ情報