在程序运行的时候可以获得程序的输出吗?

如果我有用c ++编写的Windows控制台程序,是否有可能在程序运行时检索该程序的标准输出? 如果不是,重写该程序的最好方法是什么? 我知道我可以输出到文件,并不断检查这些文件的更新。 有另一种方法吗? 有没有更好的办法?

Solutions Collecting From Web of "在程序运行的时候可以获得程序的输出吗?"

代码项目中有一些有趣的文章:

  • CommandLineHelper (C#)
  • 重定向任意控制台的输入/输出 (MFC / C ++)
  • 通用控制台重定向器 (MFC / C ++)

是的,如果你自己启动程序:

在CreateProcess中 ,您传递一个STARTUPINFO ,您可以在其中指定SDIN,STDOUT和STDERR的句柄。 请注意,一旦指定了STARTF_USESTDHANDLES标志, STARTF_USESTDHANDLES需要提供所有三个。

而且,这些句柄需要是可继承的(否则,子进程无法访问它们),所以SECURITY_ATTRIBUTES基本上至少需要这样看:

 SECURITY_ATTRIBUTES secattr = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE }; 

您可以打开包含输入和接收输出的磁盘文件的句柄。 或者,这可以是在控制台应用程序正在运行时可以逐步读取/写入的管道 。

如果它是一个随时可用的控制台可执行文件,则可以将其输出重定向到像这样的文件中:

c:> echo一些文本>文件

要么

c:> program>文件

如果你是这个意思? 因为你的问题不完全清楚。

\另一个程序

哦好的
但是我的第一个答案也习惯了。 由于还有另一种可能性,如:

c:> program1 | 程序2

它在控制台程序之间建立一个“管道”
程序2收到它stdin什么program1发送到标准输出
它在控制台程序中是普遍的老式的Unix方式实践。
而且用这种方法不需要重写程序来专门支持它。

如果你只对程序的stdout感兴趣,popen()使得这非常简单:

 FILE* program_output = popen("command line to start the other program"); //read from program_output as you would read a "normal" file //... pclose(program_output); 

您很可能需要使用管道来实现这一点,而且由于您使用的是Windows,所以这里有一个MSDN文章的链接,其中有一个示例,它似乎正是您想要的。