同时输出到两个流

时间:2014-01-11 22:57:25

标签: c gcc

我被要求为大学任务实现两个通用动态集,作为功能集的一部分,我设计了一个相当粗略的基准,让我粗略地了解算法的执行效率。除了在控制台中显示基准测试结果外,我还想将结果保存到磁盘。到目前为止,我一直在使用printf并随后调用fprintf将相同的格式字符串保存到磁盘。

printf("Average time: %2.8f seconds || Total: %2.8f seconds\n", totalTime/50, totalTime);
fprintf(fp, "Average time: %2.8f seconds || Total: %2.8f seconds\n", totalTime/50, totalTime);

是否有可能在C中一次性完成所有操作?即将输出同时放在两个流上?我很感激任何提示。我的代码必须符合gnu90标准。

提前致谢!

3 个答案:

答案 0 :(得分:0)

printf(...)相当于fprintf(stdout,...),其中stdoutFILE指针。

这意味着您的程序基本上将数据写入两个不同的文件,因此需要执行两个单独的文件写入操作。

简而言之,答案是 - 不,你不能“一次性完成所有这一切”。

答案 1 :(得分:0)

没有内置功能完全符合您的要求;所以考虑写一个。 printf的一个有趣的方面是它是一个可变函数;幸运的是,printf系列旨在简化这类工作。类似的东西:

#include <stdio.h>
#include <stdarg.h>

int stdout_fprintf(FILE * restrict stream, const char * restrict format, ...) {
    va_list ap;
    va_start(ap, format);
    vprintf(format, ap);
    int result = vfprintf(stream, format, ap);
    va_end(ap);
    return result;
}

答案 2 :(得分:0)

我看了source code of a tee implementation。那里使用的方法是:

  • 保留文件描述符的链接列表以将输出复制到
  • 从源读取的每个输出块:
    • 遍历该列表,写入每个流

在您的情况下,创建包装函数更容易。这是一个例子:

#include <stdio.h>
#include <stdarg.h>

int bothprintf(FILE *stream, const char *format, ...) {
    va_list args;
    int ret;

    va_start(args, format);
    vfprintf(stream, format, args);
    va_end(args);

    va_start(args, format);
    ret = vprintf(format, args);
    va_end(args);

    return ret;
}

* v * printf系列与通常的printf相同,不同之处在于它以va_list的形式使用其参数,使其易于用于这类事情。

显然,您无法以简单的方式保留两个返回值。此示例使用(v)printf。

的返回值