5

fstream の末尾から位置 x に get ポインターを設定する方法を探しています。

私は試した

file.seekg(-x, ios_base::end);

しかし、この質問によると、この行は未定義の動作です。

  • どうすれば、fstream の最後から x の位置を探すことができますか?
4

2 に答える 2

8

この問題はテキスト モードに関連しており、ファイル内の特定のバイト シーケンスが異なるサイズのシーケンスに変換される場合があります。

ウィンドウの下のテキストモードを例にとります。ここで、ディスク上のファイルのバイト シーケンス'\r' '\n'は、読み取り時に に変換され'\n'ます。ファイルがあるとします。

Hello\r\n
World\r\n

file.seekg(-1, ios_base::end);結果がどうあるべきかが明確でないため、結果に自分自身を配置する場合は未定義です。

  • 単に配置する必要があります'\n'か?ただし、この場合、ファイルを逆の順序で読み取ることは、ファイルを正しい順序で読み取ることと矛盾します。
  • 1 バイトとして理解されるように'\r'、に配置する必要がありますか? '\r' '\n'しかし、この場合、ポジショニングはバイトごとに行う必要があり、万が一の場合に備えて、ライブラリはバイトごとに前のものをチェックする必要があります。

seekg()ちなみに、これは、以前に取得したポジションにのみ直接アクセスする必要がある理由でもありますtellg()

この種の位置付けを最後から本当に行う必要がある場合、ios::binaryなぜならファイルを開くと、最後から数えても最初から数えても、バイトは常にバイトであることが保証されます。

于 2015-07-21T12:38:45.187 に答える