3

バイナリファイルをバイトごとに読み取っています。eofに到達したかどうかを判断する必要があります。

feof()は、「存在しないバイトの読み取り要求が行われた場合にのみeofが設定される」ため機能しません。したがって、次のようなカスタムcheck_eofを使用できます。

if ( fread(&byte,sizeof(byte),1,fp) != 1) {
    if(feof(fp))
    return true;
}
return false;

ただし、問題は、eofに達しない場合に、ファイルポインタが1バイト先に移動することです。したがって、解決策は、使用ftell()fseek()てから正しい位置に配置することです。

別の解決策は、一時的なストレージにバイトをバッファリングすることです。

より良い解決策はありますか?

4

5 に答える 5

6

一度に 1 バイトずつ読み取る場合、これを行う慣用的な方法は次のfgetcとおりです。

int c;
while ((c = fgetc(fp)) != EOF) {
   // Do something.
}

に対処する必要はありませんfeof

于 2010-04-13T23:56:03.360 に答える
3

私は通常、次のようなことをします。

int get_next_char(FILE* fp, char *ch)
{
    return fread(ch, sizeof(char),1, fp) == 1;
}

// main loop
char ch;
while (get_next_char(fp, &ch))
    process_char(ch);

if (!feof(fp))
    handle_unexpected_input_error(fp);
于 2010-04-13T23:27:32.940 に答える
2

一部のデータを読み取ろうとし、ファイルの終わりに達したために読み取りが成功しない場合は、そこで処理するようにコードを構造化するのが最善です(つまり、Kristopher Johnsonの回答を参照してください)。

これが絶対に嫌いな場合は、を使用ungetcして1つの文字をストリームに戻すことができ、次の読み取り呼び出しで使用できるようになります。

int c = fgetc(fp);
if (c == EOF)
{
    // handle eof / error
}
else
{
    ungetc(c, fp);

    // the next read call is guaranteed to return at least one byte

}
于 2010-04-14T00:10:59.883 に答える
0

はっきりしていませんが、バイトを読み取る前にEOFに達しているかどうかを知りたい場合は、feof()テストをfread()の後ではなく前に置いてください。
実際、私が正しく読んだら、あなたはフレッドをやりたくないのです:

return feof(fp) ? true : false;
于 2010-04-13T23:24:58.977 に答える
0

私は使用することをお勧めします:

fseek(myFile, 0, SEEK_END);
fileLen = ftell(myFile);
fseek(myfile, 0, SEEK_SET);

最初にファイルを開いて長さを決定するとき。次に、最後を読み上げないように読み取りループを設定します。を使用ftellして自分がどこにいるかを把握し、fileLenと比較して、さらに先に進む必要があるかどうかを把握できます。

于 2010-04-13T23:25:34.770 に答える