我在使用 C++ 代码时遇到了这种非常奇怪的行为:在使用和不使用将屏幕输出重定向到文件(在 cygwin 和 linux 中可重现)的情况下运行时,它会给我不同的结果。我的意思是,如果我得到 same 可执行文件并像 ./run
一样运行它或像 ./run >out.log
一样运行它,我得到不同的结果!
我使用 std::cout 输出到屏幕,所有行都以 endl 结尾;我使用 ifstream 作为输入文件;我使用 ofstream 进行输出,所有行都以 endl 结尾。
我正在使用 g++ 4。
知道发生了什么吗?
更新:我对输入数据进行了硬编码,因此未使用“ifstream”,问题仍然存在。
更新 2:这越来越有趣了。我已经探测了三个最初计算的变量,这就是我在使用和不使用将输出重定向到文件时得到的结果
重定向到文件:0 -0.02 0
直接到屏幕:0 -0.02 1.04083e-17
所以在有和没有重定向输出的代码变量中存在舍入差异!
现在,为什么重定向会干扰代码的内部计算?
更新 3:如果我重定向到/dev/null,我会得到相同的行为,即直接输出到屏幕,而不是重定向到文件。
最佳答案
使用nohup
运行有很多效果,但最主要的是stdin,stdout 将被重定向到/dev/null。在大多数情况下,这意味着 stdout 将被完全缓冲而不是行缓冲(如果 stdout 是终端,它唯一的行被缓冲),因此输出的内容通常不会实际输出,直到您进行显式刷新。
编辑
进一步的更新使问题不太可能与 nohup 的不同行为直接相关。此时,我建议使用 valgrind 运行,因为最有可能怀疑是未初始化的局部变量或堆对象。这样的变量将具有不可预测的(但通常可重复的)值,该值取决于调用函数的环境——主要取决于先前调用的函数留在堆栈中的内容,这很可能取决于您所看到的 nohup
关于c++ - 将屏幕输出重定向到文件可以更改 C++ 代码的结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2963860/