seekp和seekg不适用于fstream

时间:2013-08-12 12:42:36

标签: c++ fstream

我在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;
}

有人可以告诉我发生了什么,我该怎么做才能解决问题?

1 个答案:

答案 0 :(得分:2)

对于fstreamstd::basic_filebuf),单个文件位置由seekp()seekg()移动

无法独立跟踪putget位置。

班级模板std::basic_filebuf拥有单个档案位置

  

§27.9.1.1

     
      
  1. 类basic_filebuf将输入序列和   带文件的输出序列。

  2.   
  3. 读取和写入由...控制的序列的限制   class basic_filebuf的对象与read和   用标准C库文件写作。

  4.   
  5. 特别是:

         
        
    • 如果文件没有打开读取,则无法读取输入序列。
    •   
    • 如果文件未打开以进行写入,则无法写入输出序列。
    •   
    • 为输入序列和输出序列保持联合文件位置。
    •   
  6.