C++ seekp/g和tellp/g工作不正常

C++ seekp/g和tellp/g工作不正常,c++,io,fstream,iostream,getline,C++,Io,Fstream,Iostream,Getline,每当我试图在fstream对象上使用tellp/g和seekp/g函数,并使用fstream::getline(cstr,bufsize)函数时,它就是不能正常工作,也不能在'cstr'变量中存储任何内容。并且它不会报告任何使流无效的问题,如failbit或badbit 示例代码:它所做的是逐行读取,每次读取时跳到文件的末尾,并打印下一行从文件开头的偏移量 int main() { // Prepare file fstream f("test.txt"

每当我试图在
fstream
对象上使用
tellp/g
seekp/g
函数,并使用
fstream::getline(cstr,bufsize)
函数时,它就是不能正常工作,也不能在'cstr'变量中存储任何内容。并且它不会报告任何使流无效的问题,如
failbit
badbit

示例代码:它所做的是逐行读取,每次读取时跳到文件的末尾,并打印下一行从文件开头的偏移量

    int main()
    {

      // Prepare file
      fstream f("test.txt", fstream::ate | fstream::in | fstream::out);

      // Prepare needed data for production
      auto end_mark = f.tellg();
      size_t count{0};
      char c[64];

      // Go back to the beginning 
      f.seekg(0, fstream::beg);

      while(f && f.tellg() != end_mark && f.getline(c, 64))
        {
          count += f.gcount();

          auto mark = f.tellg();
          // Go to the end
          f.seekp(0, fstream::end);

          f << count; // print the next line's offset
          if(mark != end_mark) f << " ";

          // print results on shell ..For debug purposes
          cout << c << " - " << count << endl;

          // Go back to the last read point
          f.seekp(mark);
        }
      return 1;
    }

执行后的test.txt:

    abcd
    efg
    hi
    j
    5 6 7 8
但人们所期望的是:

    abcd
    efg
    hi
    j
    5 9 12 14
外壳的输出为:

    abcd - 5
     - 6
     - 7
     - 8
    abcd - 5
    efg - 9
    hi - 12
    j - 14
注意c变量中没有存储任何内容

但人们对壳牌的期望是:

    abcd - 5
     - 6
     - 7
     - 8
    abcd - 5
    efg - 9
    hi - 12
    j - 14
我想指出,只有
tellp/g()
seekp/g()
函数遗漏了
fstream::getline()
函数。使用以下代码:

    int main()
    {
      // Prepare file
      fstream f("test.txt", fstream::in | fstream::out);

      size_t count{0};
      char c[64];

      while(f && f.getline(c, 64))
        {
          count += f.gcount();

          // print results on shell ..For debug purposes
          cout << c << " - " << count << endl;
        }
      return 1;
    }

有人能告诉我为什么它会这样吗?请告诉我,我正试图理解这种奇怪的行为 我正在使用GCC-6.3.0-1进行编译 如果有任何额外的细节你想让我知道

编辑: 我已经将我的编译器更新为GCC-8.2.0-3,并且正常编译并且使用-std=c++11/14/17选项,但是仍然面临相同的问题。。。
如果您有任何建议,我们将不胜感激。

忘了提及,我在某个地方读到,这可能是gcc中的编译器错误。我使用的是g++6.3.0-1,这绝不是编译器错误。你想在这行做什么:
f@KorelK他正在创建一个文件索引,并将该索引放在文件的末尾。所以这行
f适合我。您使用的是哪个版本的g++。更重要的是,您使用的是标准库的哪个版本?忘了提一下,我在某个地方读到它可能是gcc中的编译器错误。我使用的是g++6.3.0-1,这绝不是编译器错误。你想在这行做什么:
f@KorelK他正在创建一个文件索引,并将该索引放在文件的末尾。所以这行
f适合我。您使用的是哪个版本的g++。更重要的是,您使用的是标准库的哪个版本?