将stdout/stderr重定向到C中的函数

将stdout/stderr重定向到C中的函数,c,function,redirect,stdout,C,Function,Redirect,Stdout,我想将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);

我想将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;
}
#包括
静态ssize\u t文件写入(void*c,const char*buf,size\u t size)
{
文件*pFile;
pFile=fopen(“output.txt”,“w”);
fprintf(pFile,“%s”,buf);
fclose(pFile);
返回大小;
}
无效重定向()
{
文件*流;
stream=fopencookie(NULL,“w”,(cookie_io_函数_t){(ssize_t)0,file_write,0,0});
setbuf(标准输出,空);
stdout=流;
setbuf(stderr,NULL);
stderr=流;
}
int main()
{
重定向();
fprintf(stderr,“1-stderr测试”);
fprintf(标准输出,“2-标准输出测试”);
printf(“带r测试的3-printf\n\r”);
printf(“4-printf,无r测试”);
返回0;
}
文件“output.txt”:

1-标准试验
2-标准试验
带r测试的3-printf

终端输出:

美元/样本
4-printf不带r测试

不能将标准输入或标准输出“重定向”到程序中的函数

但是,您可以创建一对管道,用这些管道替换标准输入和输出,并让另一个函数(可能在另一个线程中,甚至在子进程中)使用管道的另一端与该函数通信

当然,您可以使用,例如,将
stdin
stdout
的缓冲区更改为您提供的一对缓冲区,然后您可以像任何其他内存缓冲区(即数组)一样直接读取或写入缓冲区。但我并不推荐它,它很脆弱,而且容易出错


然而,在这种情况下,似乎您想要的是,所有对
stdout
的写入都应该转到该文件。在这种情况下(如使用管道),没有标准的C处理方法,但需要使用操作系统特定的功能。然后,如果您在POSIX平台(如Linux或OSX)上,您可以告诉操作系统复制文件的底层文件描述符,并说
STDOUT\u FILNO
(用于
STDOUT
)的文件描述符与您打开的文件的文件描述符是重复的。然后所有写入
stdout
的内容都将写入您的文件。为此,您需要使用。

1。整理缩进2。为什么不检查
fopen
3的返回值呢<代码>fprintf(pFile,buf)-希望
buf
中不包含
%
!您正在使用
buf
作为格式字符串。如果它包含任何
%
字符,则会非常糟糕地失败。使用
fprintf(pFile,“%s”,buf)
或调用
fwrite
而不是
fprintf
。您也可以调用
fputs
而不是
fprintf
。这可能是最简单的。甚至不要尝试这样做!即使它可以在一个系统上工作,它也不能在另一个系统或标准库的另一个版本上工作。我的建议是在这种情况下始终使用fprintf fputs,当您不想重定向时,让流成为stdout。