繁体   English   中英

输出到文件和命令行

[英]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然后使用dup2close(0)然后使用open创建一个新的stdout目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM