是否可以在程序运行时获得程序的输出?

时间:2009-11-06 12:18:14

标签: c++ windows console stdout

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

5 个答案:

答案 0 :(得分:2)

Code Project中有一些有趣的文章:

答案 1 :(得分:1)

如果是准备好的控制台可执行文件 你总是可以将输出重定向到这样的文件:

C:GT; echo一些文字>档案

C:GT;节目>文件

如果你的意思是? 因为你的问题不是很清楚。

\\进入另一个程序

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

C:GT; program1 |程序2

它在控制台程序之间制作“管道” program2接收stdin什么program1抛出到stdout
它在控制台程序中常见的老式Unix方式练习 并且以这种方式,NO需要重写程序以专门支持它。

答案 2 :(得分:1)

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

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

此外,句柄需要是可继承的(否则,子进程无法访问它们),因此SECURITY_ATTRIBUTES基本上至少需要看起来像这样:

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

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

答案 3 :(得分:0)

如果你只对程序的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);

答案 4 :(得分:0)

您最有可能需要使用管道来实现这一目标,并且由于您使用的是Windows,因此这里有一个指向MSDN article的链接,其示例似乎完全符合您的要求。