读取整个文件,然后覆盖相同的std :: fstream中的所有文件

时间:2016-12-21 14:05:12

标签: c++ file-io fstream readfile

虽然我在SO上发现了很多关于std::fstream的内容,但我仍然无法理解它是如何运作的。让我们看看这个最小的例子:

#include <fstream>
#include <string>

int main()
{
  std::fstream fs{ "somefile.txt", std::fstream::out | std::fstream::in };
  std::string line;

  while (std::getline(fs, line))
  {
    // reads the whole file
  }

  // the purpose is to overwrite the whole file
  fs.seekp(0, std::ios_base::beg); // moves at the beginning
  fs << "Hello world!" << std::endl; // writes in the file

  // possibly other read/write
}

这不起作用,似乎不能先读取,然后根据我读到的所有内容写入相同的流。 我知道关闭文件的解决方法,然后使用std::ios_base::trunc标记打开它。然而,这似乎是荒谬的:为什么会有这样的限制?我们不能在技术上只是在阅读后覆盖文件吗?

2 个答案:

答案 0 :(得分:4)

循环迭代,直到失败位置位。只需clear()寻找之前的标志:

fs.clear();

如果您只想覆盖足够的起始位。如果还要明确截断流我close()open()open()不会设置std::ios_base::in

答案 1 :(得分:1)

在阅读完整个文件后,fs现在处于eof状态。您需要清除状态,以便它可以执行以下IO操作。