虽然我在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
标记打开它。然而,这似乎是荒谬的:为什么会有这样的限制?我们不能在技术上只是在阅读后覆盖文件吗?
答案 0 :(得分:4)
循环迭代,直到失败位置位。只需clear()
寻找之前的标志:
fs.clear();
如果您只想覆盖足够的起始位。如果还要明确截断流我close()
和open()
,open()
不会设置std::ios_base::in
。
答案 1 :(得分:1)
在阅读完整个文件后,fs
现在处于eof
状态。您需要清除状态,以便它可以执行以下IO操作。