【问题标题】:fstream won't print to filefstream 不会打印到文件
【发布时间】:2012-02-23 09:28:13
【问题描述】:

以下代码将打印一些内容到文件中

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

调试时,我看了pkt-&gt;Addr(),它有一些值。 fout 行顺利通过。还会创建文件D_addr.txt。但是关闭文件后,文件大小为零!没有写入任何内容。

问题出在哪里?

【问题讨论】:

  • pkt->Addr()的返回类型是什么?
  • 它是typedef uint64_t Addr;
  • 尝试检查流状态。如果文件无法打开,构造函数设置failbit。您可以使用fstream::good 检查流是否已准备好进行 I/O 操作
  • @ChristianAmmer 你不使用fstream::good。打开后,通常使用fstream::is_open,但每个操作(或操作序列)之后的一般测试是ios_base::fail,或者使流像bool一样的重载运算符。你检查之后操作,而不是之前。
  • @JamesKanze:通常我使用重载的运算符并编写例如if (fout) {... 但是为什么使用good 来测试流是否准备好不太好——我以为它会检查所有错误标志?

标签: c++ g++ fstream flush


【解决方案1】:

我猜这不是你的实际代码,如果是,我会从你的 Addr() 函数开始。

注意fstream::close “关闭当前与对象关联的文件,将其与流解除关联。任何挂起的输出序列都将写入物理文件。” flush(fout); 可以省略。

您还应该指定std::fstream::out 标志。 “如果使用该参数中的任何值调用函数,则默认模式将被覆盖,而不是组合。”因此,您应该传递std::fstream::app 而不是std::fstream::app | std::fstream::out

【讨论】:

    【解决方案2】:

    我想知道您是否没有使用错误的类。如果要写入文件,请使用std::ofstream,而不是std::fstream。特别是std::ofstream的构造函数在调用rdbuf()-&gt;open时强制ios_base::out位; std::fstream 的构造函数没有(因此您打开文件时既没有读写访问权限)。

    您可能想检查错误状态:打开是否成功,在关闭(或刷新)之后,是否所有写入都成功了。通常的做法是:

    if ( fout ) {
        //  All OK...
    }
    
    if ( !fout ) {
        //  Something went wrong.
    }
    

    在打开(构造函数)之后,您可以使用fout.is_open(),它的优点是您要检查的内容更加明确。

    【讨论】:

    • "如果构造函数没有成功打开文件,尽管没有文件与流缓冲区关联并且设置了流的失败位,但仍会创建对象。" -他说文件D_addr.txt 已创建,它只是空的。如果构造函数失败,我猜这个文件不会被创建。
    • @LihO 也许吧。我不确定标准是否保证开放的原子性(尽管我希望它是一个好的实现)。如果您既不请求读取也不请求写入访问权限,该标准实际上并没有说明会发生什么。
    【解决方案3】:

    首先,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;
    }
    

    【讨论】:

    • 请注意,如果fout.close(); 在写入fout 后调用某些会导致程序终止的函数...
    • 当然。完全同意在许多情况下fout.close 在某些情况下可能很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2013-03-18
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多