2011-09-02 64 views
5

这似乎是一个计算系统101的问题,但我很难过。内部捕获/重定向标准输出?

我将C/C++项目A中的现有代码集成到我自己的项目B中.A和B都将链接到一个可执行的线程进程中。项目A的代码广泛使用printf来输出。这很好,但我也想将这个输出捕获到我自己的缓冲区中。有一种方法可以在printf调用写入之后从stdout中读取?我无法分叉进程或管道。我的poll()stdout或dup()它的努力没有成功(我可能在这里做错了什么)。

+0

你不能将A的输出输入B吗? ('$ commandprompt> ./A |。/ B')。我假设它们都是可执行文件,并且A可以在B –

+0

之前运行。听起来就像您希望将它们保存为单独的可执行文件,然后使用管道在运行时连接它们。 –

+0

不幸的是,没有。 A和B必须链接成一个exec。 – MapMaker

回答

4

您可以使用freopen改变描述符的管道。

#include<stdio.h> 

main(int argc, char** argv) { 
    FILE *fp = freopen("output.txt", "w", stdout); 
    printf("Hello\n"); 
    fclose(fp); 
} 

如果你运行你会看到在output.txt中并没有什么中的printf输出会去到你的屏幕。

您现在可以打开文件来读取数据,或者您甚至可以将它存入内存空间并以此方式进行处理。

0

一旦它熄灭了,它就消失了。如果你想把它编译成一个单一的可执行文件,你必须通过搜索来完成A的代码,并将所有这些printf调用变成你自己的流,然后将它们复制并传递给它们到标准输出。

+0

尼克,这确实是工作,围绕我实现,但希望我只是做与调查出了问题()和dup()。好吧,时间前进!感谢你的回答。顺便说一句,我喜欢你的图标:) – MapMaker

+0

这是冲洗和去做它的事情。管道和标准输出的全部想法是应用程序不会将这些东西保留下来;他们缓冲他们需要的数量,然后立即摆脱它。这样管道应用程序在一起并不需要太多的内存。如果你设计了一些东西,以至于以后的所有输出都会留在以后使用,那么没有办法得到。 –

+0

你总是可以做'#define printf(...)fprintf(myfile,__VA_ARGS __)' –

2

你的printf()之前,您可以关闭FD 1,和DUP2(),您已经创建成FD 1.

+0

...甚至不需要关闭fd 1 - 'dup2'会为你做。 – dragonroot

1

更不用说了:现在有一个方便的U-Streams C源代码库,可以使重定向stdout和stderr变得非常简单。你甚至可以很容易地将它们重定向到多个目的地。而且,您可以创建自己的流,除此之外,可以使用stdout和stderr的行为完全相同的方式。

寻找U-Streams C Library ...确实很方便。