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

C++ 将数组写入文件的相同代码在Linux上比Windows少写入1行,c++,linux,windows,visual-studio,C++,Linux,Windows,Visual Studio,编辑:问题已解决@sth问我是否忘记删除我用“新”创建的对象。他是对的!我差点忘了。解决这个问题确实解决了这个问题。我想这是VisualStudio为我做的事情,而Linux不是 编辑2:代码被删除,因为这是一个学校项目,并且可能存在剽窃问题,即使代码是我自己编写的。这个问题似乎与我的代码的细节无关,更多的是C++的新用例和删除用例。 完全相同的代码在Visual Studio 2013(安装在Windows上)和我所在学校的ssh服务器上的行为不同,我在那里使用g++编译代码。除第1部分外,代

编辑:问题已解决@sth问我是否忘记删除我用“新”创建的对象。他是对的!我差点忘了。解决这个问题确实解决了这个问题。我想这是VisualStudio为我做的事情,而Linux不是

编辑2:代码被删除,因为这是一个学校项目,并且可能存在剽窃问题,即使代码是我自己编写的。这个问题似乎与我的代码的细节无关,更多的是C++的新用例和删除用例。 完全相同的代码在Visual Studio 2013(安装在Windows上)和我所在学校的ssh服务器上的行为不同,我在那里使用g++编译代码。除第1部分外,代码编译时不会出错并按预期工作。当逐行将数组内容写入文件时,它会少写1行


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

您的代码包含避免在最后一行末尾换行的逻辑。这太傻了,感觉有点不对劲。您需要换行符。

您的代码包含避免在最后一行末尾写入换行符的逻辑。这太傻了,感觉有点不对劲。您需要换行符。

当我第一次看到您的代码时,我觉得奇怪的是您正在根据流的bool运算符关闭流。您可以了解布尔运算符的工作。并且,如上所述,即使流仍然打开,bool操作符也可以返回false。考虑基于此条件关闭流:

if (output.is_open ())
而不是

if (output)

当我第一次看到您的代码时,我认为您基于流的bool操作符关闭流是很奇怪的。您可以了解布尔运算符的工作。并且,如上所述,即使流仍然打开,bool操作符也可以返回false。考虑基于此条件关闭流:

if (output.is_open ())
而不是

if (output)

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

在您的情况下,每当包含的
文件管理器
被销毁时,
std::ofstream
就会被清除。这很可能不会发生。这可能是由于
文件管理器
动态分配了
,并且从未因
删除
而被销毁,或者程序异常终止,例如使用C库函数
退出()


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

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

在您的情况下,每当包含的
文件管理器
被销毁时,
std::ofstream
就会被清除。这很可能不会发生。这可能是由于
文件管理器
动态分配了
,并且从未因
删除
而被销毁,或者程序异常终止,例如使用C库函数
退出()


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

程序是否在没有正确清理
FileManager
对象的情况下以某种方式终止?在Linux上运行valgrind。您可能发现
文件管理器
实例正在泄漏。@sth我不确定是否可以检查它。代码执行时没有错误,ssh终端只要求我编写新命令。它没有给我任何信息。请用a来回答您的问题,或者您的程序是否调用了类似于
exit()
/
abort()
/。。。终止它自己?或者您是否使用
new
分配
FileManager
,但从不
delete
它?程序是否在没有正确清理
FileManager
对象的情况下以某种方式终止?在Linux上运行valgrind。您可能发现
文件管理器
实例正在泄漏。@sth我不确定是否可以检查它。代码执行时没有错误,ssh终端只要求我编写新命令。它没有给我任何信息。请用a来回答您的问题,或者您的程序是否调用了类似于
exit()
/
abort()
/。。。终止它自己?或者您是否将
文件管理器
分配给
新的
,但从不
删除它?我们收到一个“data.txt”文件,其中包含随机放置的整数。我想对这些整数进行排序,并创建一个“sorted.txt”文件,其中包含排序后的整数。原始的“data.txt”文件末尾没有行,所以我只是想模仿一下,只是为了演示。是否有任何理由认为最后一行是必要的?他为什么需要换行?
std::endl强制刷新流。Alf,输出流是否应该在被破坏时立即刷新?假设程序在退出时没有崩溃,也没有销毁。可能是一个更深层次的问题。@user4581301:是的,如果流对象被销毁,那么它将被刷新。对于它没有被破坏的情况,我不确定C++的级别。我们给出了一个“DATA。TXT”文件,它包含随机放置的整数。我想对这些整数进行排序,并创建一个“sorted.txt”文件,其中包含排序后的整数。原始的“data.txt”文件末尾没有行,所以我只是想模仿一下,只是为了演示。是