seekp/g 和 tellp/g 无法正常工作

seekp/g and tellp/g does not work properly

提问人:Aiman_A 提问时间:8/17/2019 最后编辑:Aiman_A 更新时间:8/18/2019 访问量:216

问:

每当我尝试在对象上使用函数并使用该函数时,它都无法正常工作,并且不会在“cstr”变量中存储任何内容。并且它不会报告任何使流无效的问题,例如tellp/gseekp/gfstreamfstream::getline(cstr, bufsize)failbitbadbit

示例代码:它的作用是逐行读取它,每次读取时它都会跳转到文件的末尾,并打印下一行从文件开头开始的偏移量。

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

测试 .txt:

    abcd
    efg
    hi
    j

执行后的测试 .txt:

    abcd
    efg
    hi
    j
    5 6 7 8

但预期的是:

    abcd
    efg
    hi
    j
    5 9 12 14

shell 的输出是:

    abcd - 5
     - 6
     - 7
     - 8

请注意,c 变量中没有任何内容存储

但对 shell 的期望是:

    abcd - 5
    efg - 9
    hi - 12
    j - 14

我想指出的是,只有 and 函数错过了该函数。使用以下代码: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;
    }

注意:tellp/g() 和 seekp/g() 函数被剥离

shell 输出以下内容:

    abcd - 5
    efj - 9
    hi - 12
    j - 14

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

编辑:

我已将编译器更新到 GCC-8.2.0-3 并使用 -std=c++11/14/17 选项正常编译,但仍然面临同样的问题...... 任何建议将不胜感激

C++ IO Fstream IOstream 获取线

评论

0赞 Aiman_A 8/17/2019
忘了提,我在某处读到这可能是 gcc 中的编译器错误。我正在使用 g++ 6.3.0-1
1赞 Martin York 8/17/2019
它从来都不是编译器错误。它们发生了,但现在很少见,当它们发生时,人们会很兴奋。
0赞 Coral Kashri 8/17/2019
你想在这条线上做什么:?f << count;
0赞 Martin York 8/17/2019
@KorelK 他正在创建文件的索引,并将此索引放在文件的末尾。因此,该行将该行的索引写入文件末尾。f << count
0赞 Martin York 8/17/2019
对我有用。您使用的是哪个版本的 g++。更重要的是,您使用的是哪个版本的标准库?

答: 暂无答案