2

私は画像デコーダーを設計しています。最初のステップとして、ファイルを開いている cie を使用してコピーし、その内容を新しいファイルに書き込もうとしました。以下は私が使用したコードです。

while((c=getc(fp))!=EOF)
  fprintf(fp1,"%c",c);

ここで、fp はソース ファイル、fp1 は宛先ファイルです。プログラムはエラーなく実行されますが、イメージ ファイル (".bmp") が正しくコピーされません。コピーしたファイルのサイズが小さく、画像の 20% しか表示されず、それ以外はすべて黒であることがわかりました。単純なテキストファイルで試したところ、コピーが完了しました。

問題が何であるか知っていますか?

4

4 に答える 4

9

c変数の型がintではなく であることを確認してくださいchar。言い換えれば、より多くのコードを投稿してください。

これは、EOF定数の値が通常 -1 であるためです。文字をchar-size の値として読み取ると、すべてのバイトが0xffEOF 定数のように見えます。int;の余分なビットを使用します。2つを分離する余地があります。

于 2010-05-03T12:02:33.987 に答える
1

バイナリモードでファイルを開きましたか? あなたは何に渡していfopenますか?

于 2010-05-03T12:02:47.387 に答える
0

これは、最も「人気のある」Cの落とし穴の1つです。

于 2010-05-03T13:53:50.407 に答える
0

一度にブロックを使用freadして使用する必要がありますfwrite

FILE *fd1 = fopen("source.bmp", "r");
FILE *fd2 = fopen("destination.bmp", "w");
if(!fd1 || !fd2)
 // handle open error

size_t l1;
unsigned char buffer[8192]; 

//Data to be read
while((l1 = fread(buffer, 1, sizeof buffer, fd1)) > 0) {
  size_t l2 = fwrite(buffer, 1, l1, fd2);
  if(l2 < l1) {
    if(ferror(fd2))
      // handle error
    else
      // Handle media full
  }
}
fclose(fd1);
fclose(fd2);

より大きなブロックを読み取る方が大幅に高速であり、fread/fwrite はバイナリ データのみを処理するため、出力で \r\n に変換される可能性のある \n (Windows および DOS の場合) または \r ((old) の場合) に問題はありません。 MAC)

于 2010-05-03T18:52:41.413 に答える