2012-01-16 5 views
1

を編集は問題である:私はチャンク・サイズとSubChunk2Sizeを変更する必要が正確に、WAVEファイルのヘッダを変更する必要があります。C:ここではバイナリファイル

元:編集

RIFFđ WAVEfmt 

RIFF(} } fmt 

コード:

FILE *nova; 
nova=fopen ("nova.wav", "wb"); 

fseek (nova, 4, SEEK_SET); 
fwrite (&brojacC,4,1,nova); 
fseek (zvuk, 44, SEEK_SET); 
fwrite (&brojacCS2,4,1,nova); 
これらの値は、4バイトを使用するが、私が8つのバイトを上書きfwriteの使用していることをseemtという問題があります

編集済みファイルWAVEが上書きされます。 4バイト目から4バイト、WAVEから8バイト目が始まったので、何かが間違っていました。

私は少なくとも少しはっきりしていたと思います。これは他の方法で行うことができますか?

答えて

3

まあ、私のman fopen出力に応じて:aはに追加しながら言われていること

r  Open text file for reading. The stream is positioned at the 
      beginning of the file. 

    r+  Open for reading and writing. The stream is positioned at the 
      beginning of the file. 

    w  Truncate file to zero length or create text file for writing. 
      The stream is positioned at the beginning of the file. 

    w+  Open for reading and writing. The file is created if it does 
      not exist, otherwise it is truncated. The stream is positioned 
      at the beginning of the file. 

    a  Open for appending (writing at end of file). The file is cre‐ 
      ated if it does not exist. The stream is positioned at the end 
      of the file. 

    a+  Open for reading and appending (writing at end of file). The 
      file is created if it does not exist. The initial file position 
      for reading is at the beginning of the file, but output is 
      always appended to the end of the file. 

wは、ファイルを切り捨てるようですと、私は間違いなく、fopen("nova.wav", "r+b")のために行くだろう、とあなたが書き込む前に読んでいるがファイルの終わりを示し、ファイルの一部を書き換えたいとします。

2

このコードには、表示されるすべての行に少なくとも1つのバグがあります。

FILE *nova; 

あなたがopenwrite、むしろfopenよりlseekfwrite、およびfseekでこの種のものを行う場合には、エラーが正しい取り扱いを取得する方が簡単です。

nova=fopen ("nova.wav", "wb"); 

2番目の文字列は、そのファイルを切り捨てられません"r+b"の代わり"wb"でなければなりません。エラーをチェックする必要があります。

fseek (nova, 4, SEEK_SET); 

エラーを確認する必要があります。

fwrite (&brojacC,4,1,nova); 

fwrite常に第二引数1と書き込まれるデータのサイズに等しい第三の引数で呼び出されるべきです。それ以外の場合は、短い書き込みから回復することは不可能です。短い書き込みと書き込みエラーを確認する必要があります。

brojacCを初期化するコードは表示されないので、エンディアンまたはパディングの問題があるかどうか評価することはできません。

fseek (zvuk, 44, SEEK_SET); 

これは関係のないファイルハンドルzvukではなくnova上で動作します。エラーをチェックする必要があります。前の行のfseekコールがzvukに適用したので、4 + 4 = 8のオフセットで

fwrite (&brojacCS2,4,1,nova); 

が、これは意図したように、44をオフセットしない書き込みます。前のfwrite行のコメントもすべてこの行に適用されます。 (Psst:エラーをチェックする必要があります)

カンマの周りのスペースが不揃いなので、落雷であなたを打つように神を招待します。あなたのカッコの内側にスペースを入れています。

関連する問題