c++ - 在 freopen 之后访问旧的标准输出?

标签 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 对我来说并不实际。更改每个批处理文件也不实际,所以我真的不知道我的输出被重定向到哪里。

理想情况下,我希望有一些方法可以获取标准输出的“原始值”,然后直接写在那里。 但是怎么做呢?我什至可以用其他东西替换对 freopen 的调用,只要输出仍然在它应该的地方结束。

换句话说,我希望 printf 最终出现在一个文件中,并以其他方式将内容打印到标准输出。

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

编辑:需要说明的是,这是在 Windows 上使用 Visual Studio 2010。

最佳答案

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

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

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

不过,一般来说,我会将 stderr 用于进度消息...这就是它存在的原因。

关于c++ - 在 freopen 之后访问旧的标准输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12289380/

相关文章:

c++ - 来自 Arduino 库的包含文件冲突

c++ - 关于在 C++ 中将数组存储在 std::vector 中的问题

c# - Visual Studio 2010 - 修复 "using"功能?

c++ - 断点未命中静态链接库中的全局静态初始化类

c++ - 即使我一次使用编译指示,也会出现C++错误C2535

c++ - qt中什么时候应该将子对象声明为其父类的成员变量?

c++ - Visual Studio 2015 社区版中发出 cpp-netlib-0.9.4 构建错误

c++ - 与 chrono::duration<float> 一起使用时条件变量不会唤醒

c++ - 错误 : not. exe 已停止工作 - 尝试构建 LLVM 时

c# - PInvoke 不改变对象