我可以一次写入两个不同的FILE指针吗?

时间:2019-01-09 18:13:59

标签: c file unix io

我有一个程序,想要在文本文件中将某些输出复制到stdout进行缓存。看起来像这样:

FILE* cache;
// Open file, check for errors, etc.
fprintf(stdout, "My data\n");
fprintf(cache, "My data\n");
for (int i = 0; i < 10; ++i)
{
    fprintf(stdtout, "%d ", i);
    fprintf(cache, "%d ", i);
}

是否有某种方法可以获取FILE *,如果我在其中写入,则可以同时在stdout和缓存文件中得到输出?

(仅在外壳中重定向它是行不通的;程序需要确定它,而不是调用者。)

1 个答案:

答案 0 :(得分:2)

FILE对象仅与一个文件相关联,因此您不能写入一个FILE,而不能将其写入两个物理文件。

但是,您可以做的是在fprintf周围创建一个包装,该包装需要两个FILE *并在那里进行复制。

void dup_fprintf(FILE *f1, FILE *f2, const char *format, ...)
{
    va_list args1;
    va_start(args1, format);
    vfprintf(f1, format, args1);
    va_end(args1);

    va_list args2;
    va_start(args2, format);
    vfprintf(f2, format, args2);
    va_end(args2);
}

然后您可以执行以下操作:

dup_fprintf(stdout, cache, "My data\n");
for (int i = 0; i < 10; ++i)
{
    dup_fprintf(stdtout, cache, "%d ", i);
}