0

我有一堆批处理文件,用程序 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。

4

1 回答 1

2

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

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

只是在 windows 中略有不同。UNIX 中的基本思想是 stdout 是文件描述符 1...更改打开的内容等同于重定向它。使用 dup,您可以先对其进行复制,以备不时之需。

不过,总的来说,我会使用 stderr 来获取进度消息……这就是它存在的原因。

于 2012-09-05T20:48:30.323 回答