[英]Output into file and command line
我读到有关freopen
,该文章将所有printf
重定向到文件,但是我也希望将输出也打印在屏幕上。 有没有一种简单的方法可以将printfs重定向到文件并获取cmd行输出?
谢谢!
另一种选择是编写一个功能类似于printf
,但是将输出定向到两个不同的位置。 例如:
#include <stdio.h>
#include <stdarg.h>
void printf2(FILE *fp, char *format, ...)
{
va_list ap;
va_list ap2;
va_start(ap, format);
va_copy(ap2, ap);
vfprintf(fp, format, ap);
va_end(ap);
vprintf(format, ap2);
va_end(ap2);
}
然后,您可以printf2
调用fprintf
一样调用printf2
,输出将同时传递到传入的FILE
指针和stdout:
FILE *fp = fopen("/tmp/foo", "w");
printf2(fp, "This is a test.\n");
这种方法不使用子进程或管道,并且可以根据需要将其通用化为多个文件指针。
在程序外部,使用“ tee”:
# echo foo | tee foo.txt
foo
# cat foo.txt
foo
实际上,您可以将通道popen()到可写入文件的tee上,尽管这很累。 达到此效果的方法:
FILE *stream_to_write_to = popen( "tee filename.txt" );
fprintf( stream_to_write_to, "goes to filename.txt and stdout\n" );
我很好奇,看看是否有一种from-C的快速方法,因为在某种程度上,这涉及到复制数据。 使两个文件句柄写入相同的位置,使用dup()或类似方法很容易,但是相反的过程则比较棘手。 它可能涉及将模块推入(通常的示例是“ connld”到流上),尽管老实说我从未见过使用过它,所以我很想亲自看看一个有效的代码示例。
我能给的最好的参考是Stevens的“ UNIX环境中的高级编程”。
更新:
在下面说R时,上面的解决方案是一个稍微重一点的版本,它只是fork / exec-ing并将孩子的句柄重定向到其他地方。 两者都可以解决问题,尽管我更喜欢上面的内容,因为它更易于清理,但老实说,这两种解决方案都相当繁重。 Fork()不是轻量级函数。 如果问题的实质是在没有fork / exec的情况下这样做,那么我不确定,我也想知道。 如果fork / exec没问题,那么直接使用它或使用popen()都会对其进行破解。
对于重定向标准输出, freopen
不是一个好主意。 它不一定会重用相同的文件描述符号,因此子进程可能不会继承新的stdout(或者最终可能根本没有stdout)。 最好先使用open
然后使用dup2
或close(0)
然后使用open
创建一个新的stdout目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.