【问题标题】:Different output printing stdout on console/redirecting to a file控制台上的不同输出打印标准输出/重定向到文件
【发布时间】: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)。您必须确认您已在读取数据后(在任何进一步处理之前)打印出数据,并且结果相同。

标签: c++ bash math g++ stdout


【解决方案1】:

这可能是因为你有一些东西去stdout 和其他去stderr,并且你的重定向不同。

  • - 即标准输出是来自程序的正常输出。

  • - 即错误输出,我让你猜。

因此,在您的情况下,使用./Channel_Flow &gt; result.dat,您只需将stdout 重定向到result.dat,而将stderr 显示在控制台中。

如果您希望所有内容都转到文件中:

# have a specific error file
./Channel_Flow > result.dat 2>errors.log
#or all to the same:
./Channel_Flow > result.dat 2>&1

编辑

看看你的情况会发生什么

## and this latest would both log to console and write to file:
./Channel_Flow |tee result.dat 

【讨论】:

  • errors.log 为空,第二个命令仍然给我完全相同的结果。
  • 好的,抱歉帮不了你。感谢您添加我们需要的详细信息。
猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
相关资源
最近更新 更多