如何在结束后追加到 std::fstream(std::fstream::eof() 为真)

How to append to a std::fstream after you got to the end (std::fstream::eof() is true)

我这样打开一个文件(因为它是练习的一部分,可能需要覆盖文件):

#include <fstream>            //std::fstream.
std::fstream file("file.txt", std::ios::in | std::ios::out);

假设我读了一个文件直到结尾(到达文件末尾)。

std::string tmp_buff;
while(std::getline(file, tmp_buff)) {}
file.seekp(file.tellg());

现在我已经到了流的末尾,如何从这里附加到文件。因为如果我只是尝试像定期那样写,它会失败(实际上不会写):

file << "Text";

我找到的唯一解决方案是在文件末尾重新打开文件:

if(file.eof())
    {
        file.close();
        file.open("file.txt", std::ios::in | std::ios::out | std::ios::app);
        file << '\n';
    }

如有任何帮助,我们将不胜感激。

首先,在使用 fstream 时不需要声明 std::ios::instd::ios::out,因为它们在构造函数中有默认值。 (更确切地说,实际上是std::ios_base::in/outstd::iosstd::basic_ios<char>)继承自std::ios_base
所以 std::fstream file(filename) 效果相同。

这里的问题是 C++ 流的工作方式。
当文件被完全读取时,eofbit 被设置。之后,发生另一次读取,这将触发 failbit,因为没有可读取的内容,并且流的 bool 转换运算符 returns false 并退出循环。

将保持打开状态,直到它们被清除。当它们打开时,流不会执行任何操作。
所以要清除它们:

file.clear();

会完成工作的。之后就可以使用流了。