fstream不会打印到文件

时间:2012-02-23 09:28:14

标签: c++ g++ fstream flush

以下代码会将某些内容打印到文件

    std::fstream fout ("D_addr.txt", std::fstream::app);
    fout <<  pkt->Addr() << std::endl;
    flush(fout);
    fout.close();

调试时,我看了pkt->Addr()并且它有一些值。 fout行没有问题。此外,还创建了文件D_addr.txt。但是关闭文件后,文件大小为零!没有写到它。

问题出在哪里?

3 个答案:

答案 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;
}