0

重複の可能性:
なぜこの C コードにバグがあるのですか?
ストリームの終わりを決定するときの EOF の問題

バイナリ ファイルを 4 バイトのチャンクで読み込もうとしています。ただし、最初の実装 (以下を参照) では、最後のエントリが複製され、最後のエントリのみが複製されます。

FILE* f = fopen("test.a", "r+b");
char buffer[4];
while (!feof(f)) {
    fread(buffer, 4, 1, f);
    printf("read %x\n",*(int*)buffer);
}
fclose(f);

この代替実装には、その問題はありません。feof はいつ使用する必要がありますか? また、以前の実装で feof を使用すると、最後のエントリが 2 回読み取られるのはなぜですか? printf ステートメントで行ったように、ポインターをキャストするよりもバッファーを構築するためのより良い方法はありますか? このコードに他に何か問題はありますか?

FILE* f = fopen("test.a", "r+b");
char buffer[4];
while (fread(buffer, 4, 1, f)) {
    printf("read %x\n",*(int*)buffer);
}
fclose(f);
4

2 に答える 2

0

fread の戻り値:

正常に読み取られた要素の総数は、size_t オブジェクトとして返されます。

したがって、ファイルの終わりを探しているのではなく、最後の読み取りで何かが引き戻された場合は、もう一度読み取りを試みます。

于 2011-05-19T15:55:51.673 に答える
0

これは、ファイルから何も読み取れなくなると、ファイルに eof マークが設定されるためです。これにより、最後freadに「some」が読み取られますが、eof マークは確立されません。次に、次のループでfreadは何も読み取らず、eof マークがファイルに設定されます。fread はバッファーを変更していないため、最後の行が 2 回出力されます。

于 2011-05-19T15:56:49.243 に答える