我想将stdout和stderr重定向到一个函数并编写一个简单的代码。 fprintf没问题但是当我使用没有\ r的printf时,流传递给终端!
#include <stdio.h>
static ssize_t file_write(void *c, const char *buf, size_t size)
{
FILE * pFile;
pFile = fopen ("output.txt","w");
fprintf(pFile, "%s", buf);
fclose (pFile);
return size;
}
void redirect()
{
FILE *stream;
stream=fopencookie(NULL, "w", (cookie_io_functions_t) {(ssize_t) 0, file_write, 0, 0});
setbuf(stdout, NULL);
stdout = stream;
setbuf(stderr, NULL);
stderr = stream;
}
int main()
{
redirect();
fprintf(stderr,"1-stderr test\n");
fprintf(stdout, "2-stdout test\n");
printf("3-printf with r test\n\r");
printf("4-printf without r test\n");
return 0;
}
file&#34; output.txt&#34;:
1-stderr测试
2-stdout测试
带有r测试的3-printf
终端输出:
$ ./sample
没有r测试的4-printf
答案 0 :(得分:1)
您无法重定向&#34;标准输入,或标准输出到程序中的功能。
然而,您可以创建一对管道并用这些管道替换标准输入和输出,并且具有另一个功能(可能在另一个线程甚至子进程中)使用管道的另一端与该功能进行通信。 / p>
你当然可以使用例如setvbuf
将stdin
和stdout
的缓冲区更改为您提供的一对缓冲区,然后您可以像任何其他内存缓冲区(即数组)一样直接读取或直接写入缓冲区)。不过我推荐它,它很脆弱,容易出错。
但是在这种情况下,您似乎想要的是所有写入stdout
的内容都应该转到文件中。在这种情况下(如使用管道),没有标准的C方式来处理它,但您需要使用特定于操作系统的功能。然后,如果您在POSIX平台(如Linux或OSX)上,您可以告诉操作系统复制文件的基础文件描述符,并说STDOUT_FILNO
(这是用于{的文件描述符) {1}})是您打开的文件的文件描述符的副本。然后,对stdout
的所有写入都将写入您的文件。为此,您需要使用the dup2
system call。