在freopen'd之后访问旧的stdout?

时间:2012-09-05 20:38:56

标签: c++ visual-studio-2010

我有一堆批处理文件可以通过程序A执行类似的操作:

A > log.txt ; grep 'result:' log.txt > result.txt || raise_hell.sh

我要做的是修改A,这样它就会打印出一堆中间结果。但是,它并不像您想象的那么容易,因为A执行以下操作:

  • 调用_freopen(“somefile”,“w”,stdout),然后
  • 在一百万个地方调用printf(及其变体)并期望输出结束于某个文件中。

改变项目中的每一个printf对我来说并不实际。更改每个批处理文件也不切实际,所以我真的不知道我的输出被重定向到哪里。

理想情况下,我想通过某种方式获取stdout 的“原始价值”,然后在那里写一下。 但是如何?我甚至可以用其他东西替换对freopen的调用,只要输出仍然在应该的位置结束。

换句话说,我希望printf以文件结尾,并以其他方式将内容打印到标准输出。

我尝试了很多东西,部分是基于对这个问题变体的回答。但是,这些都不起作用,因为它们仍然最终写入某个文件。欢迎提供帮助。

编辑:为了清楚起见,这是在Windows上,使用Visual Studio 2010。

1 个答案:

答案 0 :(得分:2)

好吧,我不是Windows的人,但只是作为特定问题的答案:如何搞乱stdout。在UNIX中,我们使用dup / dup2,根据:

http://www.suacommunity.com/dictionary/dup-entry.php

在Windows中略有不同。 UNIX中的基本思想是stdout是文件描述符1 ...更改打开的内容相当于重定向它。使用dup,你可以先复制它,以防你想把它放回去。

但是,一般情况下,我会使用stderr来获取进度消息......这就是它存在的原因。