0

バイナリ ファイルから「ブロック」を読み取るクラスがあります。私はこのように使用します:

while(log.HasNextBlock()) {
    block = log.GetNextBlock();
}

私の問題は、ファイルの最後にいる場合、関数 HasNextBlock() の内部をチェックする必要があることです。その場合、false を返します。それを確認するためにfeof()を使用しようとしていますが、feof()を呼び出す前に読み取り操作を実行する必要があることを読みましたが、私の場合、読み取り操作はGetNextBlock()で、つまりfeofの呼び出し後に行われます().

「コンテキスト」を変更する操作を実行せずにバイナリファイルの最後にいるかどうかを確認する方法はありますか (つまり、ファイル内の現在の位置やその他の変数を変更しません)。

ご協力いただきありがとうございます !:)

4

5 に答える 5

5

ループを開始する前に、 を呼び出しfseekてファイルの最後に移動し (つまり をSEEK_END使用)、 を使用ftellして現在の位置を見つけます。これにより、 がどこにあるかがわかりEOFます。次に、 を使用fseekしてファイルの先頭に戻りSEEK_SET、ループを続行します。にいるかどうかを知る必要がある場合はEOF、呼び出しftellて、ループに入る前に保存したファイルのサイズと位置を比較します。

于 2013-05-13T13:31:31.420 に答える
2

ファイルを開くときに、ファイルの末尾までシークし、ファイルの位置を取得してから、ファイルの先頭に再度シークすることができます。

次に、ファイルにさらに読み取るものがあるかどうかを知る必要がある場合は、現在のファイルの位置を確認して、最後の位置と比較するだけです。

于 2013-05-13T13:31:42.243 に答える
1

一つの方法は

while ((c = getchar()) != EOF)

ここですべての方法を見つけることができます

追加情報 C のバイナリ ファイルとテキスト ファイルの違い

これらの方法は、私がインターネットから収集したものです。使用する前に試してみる必要があります。

于 2013-05-13T13:31:36.867 に答える
1

次のブロックを取得した後、1 文字を読み取り、EOF かどうかを確認します。もしそうなら、壊れてください。そうでない場合は、次のように fseek を 1 バイト戻します: http://linux.die.net/man/3/fseek

ストリームを読み込んでいるファイルに設定し、offset を -1 に設定し (文字を読み込んでいる場合)、whence を SEEK_CUR に設定します。

これにより、EOF が存在する場合は表示されます。存在しない場合は、通常どおり続行します。

于 2013-05-13T13:32:54.490 に答える