如何在结束后追加到 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::in
和 std::ios::out
,因为它们在构造函数中有默认值。 (更确切地说,实际上是std::ios_base::in/out
。std::ios
(std::basic_ios<char>
)继承自std::ios_base
)
所以 std::fstream file(filename)
效果相同。
这里的问题是 C++ 流的工作方式。
当文件被完全读取时,eofbit
被设置。之后,发生另一次读取,这将触发 failbit
,因为没有可读取的内容,并且流的 bool 转换运算符 returns false 并退出循环。
位 将保持打开状态,直到它们被清除。当它们打开时,流不会执行任何操作。
所以要清除它们:
file.clear();
会完成工作的。之后就可以使用流了。
我这样打开一个文件(因为它是练习的一部分,可能需要覆盖文件):
#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::in
和 std::ios::out
,因为它们在构造函数中有默认值。 (更确切地说,实际上是std::ios_base::in/out
。std::ios
(std::basic_ios<char>
)继承自std::ios_base
)
所以 std::fstream file(filename)
效果相同。
这里的问题是 C++ 流的工作方式。
当文件被完全读取时,eofbit
被设置。之后,发生另一次读取,这将触发 failbit
,因为没有可读取的内容,并且流的 bool 转换运算符 returns false 并退出循环。
位 将保持打开状态,直到它们被清除。当它们打开时,流不会执行任何操作。
所以要清除它们:
file.clear();
会完成工作的。之后就可以使用流了。