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

时间:2015-10-15 15:51:08

标签: c++ linux windows visual-studio

编辑:问题已解决。 @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个整数。我的作业将在评分时在此服务器上编译,因此这可能是一个问题。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

当我第一次看到你的代码时,我认为你基于流的bool运算符关闭流是很奇怪的。您可以阅读bool运算符Here的内容。并且,如Here所述,即使流仍处于打开状态,bool运算符也可以返回false。考虑根据以下条件关闭流:

if (output.is_open ())

而不是

if (output)

答案 2 :(得分:1)

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

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

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