【发布时间】:2016-05-26 01:05:22
【问题描述】:
我对 bash 上的标准输出有疑问。 首先,我有一个名为 Channel_Flow 的程序,它是用 C++ 语言编写的。该程序基本上计算了计算流体动力学领域的一些数学。
当我使用这个时出现我的问题:$ ./Channel_Flow
对于我的程序。
重定向输出时输出不同,如:$ ./Channel_Flow > result.dat
差异真的很大,一些数学计算和行为不同。我以前从来没有遇到过这种错误。
我执行程序的方式有什么问题吗?有人对此有提示吗?
谢谢。如果我需要添加一些细节,我很乐意编辑问题。
(有关更多信息,我使用 makefile 编译带有 --c++11 标志和 -O2 优化标志和 g++ 5.3.1 编译器的文件)
编辑
我添加了后一个命令的一些输出:substep - 1
1 1 10 : -18693.7
2 1 10 : -18693.7
3 1 10 : -18693.7
4 1 10 : -18693.7
5 1 10 : -18693.7
6 1 10 : -18693.7
7 1 10 : -18693.7
8 1 10 : -18693.7
9 1 10 : -18693.7
从第一个命令,我得到了这个:
substep - 1
1 1 10 : 3.47858
2 1 10 : 3.47858
3 1 10 : 3.47858
4 1 10 : 3.47858
5 1 10 : 3.47858
6 1 10 : 3.47858
7 1 10 : 3.47858
8 1 10 : 3.47858
9 1 10 : 3.47858
代码很复杂,所以我仍在寻找问题的根源。我在这里问的是为什么当我将输出写入文件时会产生不同的结果?
正确的是控制台输出。
我试过这个:(正如第一个答案所暗示的那样)。
# have a specific error file
./Channel_Flow > result.dat 2>errors.log
#or all to the same:
./Channel_Flow > result.dat 2>&1
但是文件errors.log 是空的。第二个命令给出了完全相同的结果。
EDIT AGAIN
我使用 offstream 来打印我的结果,
std::ofstream testing("testing.dat");
if (k==0) {
testing << i << " " << j << " " << k << " : " << ux[i][j][k] << std::endl;
std::cout << i << " " << j << " " << k << " : " << ux[i][j][k] << std::endl;
}
我使用第一个命令:
$ ./Channel_Flow
输出:substep - 1
1 1 10 : -18693.7
2 1 10 : -18693.7
3 1 10 : -18693.7
4 1 10 : -18693.7
5 1 10 : -18693.7
6 1 10 : -18693.7
7 1 10 : -18693.7
8 1 10 : -18693.7
9 1 10 : -18693.7
(在流文件(testing.dat)和控制台界面上)
我使用第二个命令:
$ ./Channel_Flow > result.dat
输出:substep - 1
1 1 10 : 3.47858
2 1 10 : 3.47858
3 1 10 : 3.47858
4 1 10 : 3.47858
5 1 10 : 3.47858
6 1 10 : 3.47858
7 1 10 : 3.47858
8 1 10 : 3.47858
9 1 10 : 3.47858
(在流文件(testing.dat)和控制台界面上)
【问题讨论】:
-
你真的应该在你的问题中包含一些代码,至少是你认为问题所在的可行的 sn-p。您可以尝试重定向到 .txt 文件,以查看输出如何更改并使其可读。 (并不是说我认为这是问题所在,只是一个建议和可能有用的实验。)
-
您是否检查输入操作中的错误?您是否打印了输入值以进行比较?你能展示你在这两种情况下得到的结果吗?您是否尝试过减少代码以制作仍然显示问题的 MCVE (minimal reproducible example)?输入数据从何而来?您显示的运行程序的两种方式应该没问题。如果你也重定向标准错误,你很容易在两者之间得到不同的结果。你是在代码中的任何地方使用
fork(),还是使用多个线程? -
您将不得不提供更多详细信息,因为我很难想象这种情况甚至可能发生的情况。唯一想到的是未初始化的变量,但无论输出到哪里,这都会给您带来不一致的结果。
-
@NonCreature0714 我已经尝试过了,但它仍然存在。也许你可以看看我编辑的问题。
-
我无法立即想到是什么导致了您所看到的行为。你有
valgrind可用吗?如果是这样,请使用它。替代输出的明显一致性令人惊讶。如果没有更多代码,我认为我们将无法提供帮助。您需要创建一个 MCVE (minimal reproducible example)。您必须确认您已在读取数据后(在任何进一步处理之前)打印出数据,并且结果相同。