6

Debian x64 PC で実行している C++ プログラムに奇妙な動作があります。

最初にファイルを読み取ってから、別の値を書き込んでからこれらの値を読み取ることができません。私は、stackoverflow に関する質問を含む多くの情報を読み、seekp と seekg の両方を変更する必要があることを (これも実験によって) 知りました。すべてが機能します...ストリームから何かを読み取るまで。読み取り操作の後、ファイルの先頭をシークしてから tellg()、tellp() を呼び出すと、両方とも「-1」が返されます。

テストコード:

void testFstreamSeekp() {
    fstream in("file", ios::in | ios::out);

    cout << "g: " << in.tellg() << endl;
    cout << "p: " << in.tellp() << endl;

    in.seekp(0, ios_base::end);

    cout << "endp g: " << in.tellg() << endl;
    cout << "endp p: " << in.tellp() << endl;

    in.seekp(0, ios_base::end);
    in.seekg(0, ios_base::end);

    cout << "end g: " << in.tellg() << endl;
    cout << "end p: " << in.tellp() << endl;

    in.seekp(0, ios_base::beg);
    in.seekg(0, ios_base::beg);

    cout << "beg g: " << in.tellg() << endl;
    cout << "beg p: " << in.tellp() << endl;

        // Everything is fine until here (that is tellp() == 0, tellg() == 0)
    int a, b;
    in >> a >> b;
    cout << "a: " << a << endl << "b: " << b << endl;

        // tellg() == -1, tellp() == -1 ?????????!!!!!!!!!!
    cout << "read g: " << in.tellg() << endl;
    cout << "read p: " << in.tellp() << endl;

    in.seekp(0, ios_base::beg);
    in.seekg(0, ios_base::beg);

        // tellg() == -1, tellp() == -1 ?????????!!!!!!!!!!
    cout << "beg g: " << in.tellg() << endl;
    cout << "beg p: " << in.tellp() << endl;
}

何が起こったのか、問題を解決するために何ができるのか誰か教えてもらえますか?

4

1 に答える 1

5

fstream( ) の場合std::basic_filebuf、1 つのファイルの位置は と の両方seekp()で移動します。seekg()

putおよびget位置を個別に追跡することはできません。

クラス テンプレートstd::basic_filebufは単一のファイル位置を保持します

§ 27.9.1.1

  1. クラス basic_filebuf は、入力シーケンスと出力シーケンスの両方をファイルに関連付けます。

  2. クラス basic_filebuf のオブジェクトによって制御されるシーケンスの読み取りと書き込みに関する制限は、標準 C ライブラリ FILE での読み取りと書き込みの場合と同じです。

  3. 特に:

    • ファイルが読み取り用に開かれていない場合、入力シーケンスを読み取ることはできません。
    • ファイルが書き込み用に開かれていない場合、出力シーケンスを書き込むことはできません。
    • ジョイント ファイルの位置は、入力シーケンスと出力シーケンスの両方で維持されます。
于 2013-08-12T13:09:08.650 に答える