【问题标题】:Same code to write an array to a file writes 1 line less on Linux compared to Windows与 Windows 相比,将数组写入文件的相同代码在 Linux 上少写 1 行
【发布时间】:2015-10-15 15:51:08
【问题描述】:

编辑:问题已解决。 @sth 问我是否忘记删除我可能用“new”创建的对象。他是对的!我忘记了。解决这个问题确实解决了这个问题。我想这是 Visual Studio 为我做的事情,而 Linux 没有。

编辑 2: 尽管我自己编写了代码,但由于这是一个学校项目和潜在的抄袭问题,代码已被删除。此外,这个问题似乎与我的代码的细节无关,更多的是与 new 和 delete 的一般 c++ 用例有关。

完全相同的代码在 Visual Studio 2013(安装在 Windows 上)和我使用 g++ 编译代码的学校的 ssh 服务器上表现不同。代码编译没有错误,并按预期工作,除了 1 部分。将数组的内容逐行写入文件时,它会少写 1 行。

如果数组有 10 个元素,Visual Studio 编译代码会创建一个包含 10 行的“sorted.txt”文件,并且所有这些都恰好包含 1 个整数。没有空行。 SSH 编译的代码仍然创建 10 行,但最后一行是空的。所以我的“sorted.txt”文件中实际上缺少 1 个整数。我的作业在评分时将在此服务器上编译,所以这可能是个问题。

【问题讨论】:

  • 如果没有正确清理FileManager 对象,程序是否会以某种方式终止?
  • 在 Linux 上运行 valgrind。您可能会发现 FileManager 实例泄漏。
  • @sth 我不确定我是否可以检查。代码执行没有错误,ssh 终端只是要求我编写新命令。它没有给我任何信息。
  • 您的程序是否调用了类似exit()/abort() /... 的函数来终止自身?还是您将FileManager 分配给new,但从不分配delete

标签: c++ linux windows visual-studio


【解决方案1】:

您的代码包含避免在最后一行末尾写入换行符的逻辑。这很愚蠢,而且感觉有点被解释了。你需要换行符。

【讨论】:

  • 我们得到一个“data.txt”文件,其中包括随机放置的整数。我想对这些整数进行排序并创建一个包含排序整数的“sorted.txt”文件。原始的“data.txt”文件末尾没有一行,所以我只是想模仿它,只是为了演示。有什么理由需要最后一行吗?
  • 他为什么需要换行符?
  • std::endl; 强制刷新流。 Alf,输出流不应该在销毁时关闭吗?假设程序在退出时没有崩溃并且没有破坏。可能是更深层次的问题。
  • @user4581301:是的如果流对象被销毁然后它被刷新。对于没有被破坏的情况,我不确定 C++ 级别。
【解决方案2】:

std::ofstream 是一个缓冲流。如果没有正确关闭或刷新,一些缓冲数据可能不会写入磁盘。

在您的情况下,只要包含 FileManager 被销毁,std::ofstream 就会被清理。很可能这不会发生。可能是FileManagernew 动态分配,并且永远不会被delete 销毁,或者程序异常终止,例如使用C 库函数exit()

只有最后一行受此问题影响,因为std::endl 刷新流并强制将先前的数据写入磁盘。

【讨论】:

    【解决方案3】:

    当我第一次看到你的代码时,我觉得你根据流的布尔运算符关闭流很奇怪。您可以了解 bool 运算符的作用 Here。而且,如Here 所述,即使流仍处于打开状态,布尔运算符也可以返回 false。考虑基于此条件关闭流:

    if (output.is_open ())
    

    而不是

    if (output)
    

    【讨论】:

    • 调用output.close() 是多余的。 std::ofstream 的析构函数会处理这个问题。
    • 实际上两者都不需要。 fstream 将在销毁时关闭。
    • 好吧,我记得在过去,如果没有调用 stream.close (),就会遇到类似的问题。无法判断它发生在什么操作系统上。这就是为什么我认为 OP 也是如此。
    • @AlgirdasPreidžius 注意。感谢您的建议。
    猜你喜欢
    • 2012-03-21
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多