以下代码会将某些内容打印到文件
std::fstream fout ("D_addr.txt", std::fstream::app);
fout << pkt->Addr() << std::endl;
flush(fout);
fout.close();
调试时,我看了pkt->Addr()
并且它有一些值。 fout
行没有问题。此外,还创建了文件D_addr.txt
。但是关闭文件后,文件大小为零!没有写到它。
问题出在哪里?
答案 0 :(得分:4)
我猜这不是你的实际代码,如果是,我会从你的Addr()
函数开始。
请注意fstream::close “关闭当前与该对象关联的文件,将其与流取消关联。任何待处理的输出序列都将写入物理文件。” flush(fout);
可以省略。
您还应指定std::fstream::out
标志。 “如果使用该参数中的任何值调用该函数,则会覆盖默认模式,而不是组合。”因此,您应该通过std::fstream::app
而不是std::fstream::app | std::fstream::out
。
答案 1 :(得分:2)
我想知道你是不是在使用错误的课程。如果要写入文件,请使用std::ofstream
,而不是std::fstream
。特别是std::ofstream
的构造函数在调用ios_base::out
时强制rdbuf()->open
位; std::fstream
的构造函数没有(所以你打开的文件既没有读取也没有写入访问权限。)
您可能想要检查错误状态:打开成功,关闭(或刷新)后,所有写入都成功。通常的做法是:
if ( fout ) {
// All OK...
}
if ( !fout ) {
// Something went wrong.
}
在打开(构造函数)之后,您可以使用fout.is_open()
,其优势在于您要检查的内容更加明确。
答案 2 :(得分:2)
首先,flush()
和fout.close()
不会造成任何伤害,但这里不需要,因为当fout
被销毁时,文件将被关闭(并刷新)作为一部分fstream
析构函数。
其次,您应该使用ofstream
或者将标记std::ios::out
添加到openmode
参数。
尝试以下方面的内容:
{
uint64_t x = 42;
std::fstream of("test.txt", std::ios::app);
of << x << std::endl;
}