c++ - 将屏幕输出重定向到文件可以更改 C++ 代码的结果吗?

标签 c++ io

我在使用 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/

相关文章:

Java:具有状态的 ASCII 随机行文件访问

c++ - treap 如何帮助更新这个有序队列?

c++ - 循环依赖性头痛

c++ - 如何找到包含在多态基类 vector 中的对象的类型?

java - Android应用程序写入文件,找不到结果

C++ ofstream 相当于 Win32 CreateFile with CREATE_NEW

java - 在字符串方法参数上同步 java 中的 io 操作?

Java 8 FilterOutputStream 异常

c++ - 在返回结构的函数中传递值 - const 错误

C++——子类析构函数是否应该显式调用基类析构函数?