这似乎有点像计算系统101的问题,但我很难过。
我正在将C / C ++项目A中的现有代码集成到我自己的项目B中.A和B都将链接到一个可执行的线程进程中。项目A的代码广泛使用printf进行输出。这很好,但我也希望将输出捕获到我自己的缓冲区中。一旦printf调用写入,我有没有办法从stdout读取?我不能分叉过程或管道。我对poll()stdout或者dup()的努力没有成功(我可能在这里做错了。)
答案 0 :(得分: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输出,什么都不会进入你的屏幕。
您现在可以打开文件来读取数据,或者甚至可以mmap将其放入您的内存空间并以此方式处理它。
答案 1 :(得分:2)
在printf()之前,您可以关闭fd 1,并将dup2()管道创建为fd 1。
答案 2 :(得分:1)
更不用说了:现在有一个方便的U-Streams C源代码库,它使重定向stdout和stderr非常简单。您甚至可以将它们轻松地重定向到多个目的地。并且,您可以创建自己的流,除此之外,可以使用与stdout和stderr完全相同的方式。
寻找U-Streams C库......确实很方便。
答案 3 :(得分:0)
一旦它消失了,它就消失了。如果你想将它全部编译成一个可执行文件,你必须通过搜索来检查A的代码并将其替换并将所有这些printf
调用更改为您自己的流,然后您可以在其中复制它们然后将它们传递给stdout。