与Windows相比,将数组写入文件的相同代码在Linux上少写1行

Same code to write an array to a file writes 1 line less on Linux compared to Windows

本文关键字:代码 Linux 1行 文件 相比 Windows 数组      更新时间:2023-10-16

编辑:问题解决了。 @sth问我是否忘记删除我可能用"new"创建的对象。他是对的!我忘了。修复它确实解决了问题。我想这是Visual Studio为我做的事情,而Linux不是。

编辑2:由于这是一个学校项目和潜在的抄袭问题,即使我自己编写了代码,代码也被删除了。此外,该问题似乎与我的代码细节无关,而更多的是新建和删除的一般c ++用例。

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

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

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

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

在您的情况下,每当包含FileManager被销毁时,都会清理std::ofstream。所以这很可能不会发生。可能是FileManager是用new动态分配的,永远不会被delete破坏,或者程序被异常终止,例如使用 C 库函数 exit()

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

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

if (output.is_open ())

而不是

if (output)