【发布时间】:2016-06-11 06:20:16
【问题描述】:
我想将 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;
}
文件“输出.txt”:
1-stderr 测试
2-stdout 测试
带 r 测试的 3-printf
终端输出:
$ ./sample
4-printf 没有 r 测试
【问题讨论】:
-
1.整理缩进 2. 为什么不检查
fopen的返回值 3.fprintf(pFile,buf);- 希望buf中不包含%! -
您使用
buf作为格式字符串。如果它包含任何%字符,这将非常可怕地失败。要么使用fprintf(pFile, "%s", buf),要么调用fwrite而不是fprintf。 -
你也可以打电话给
fputs而不是fprintf。这可能是最简单的。 -
不要尝试这样做!即使它在一个系统上工作,它也不能在另一个系统上工作或与另一个版本的标准库一起工作。我的建议是在这种情况下始终使用 fprintf-fputs,并在您不想重定向时让流成为标准输出。
标签: c function redirect stdout