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),单个文件位置由两者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 回答