问如何安排同时将输出发送到两个地方,例如发送到屏幕和文件?
答你不能直接做到这一点,但你可以编写自己的printf变体,它会打印两次。这是一个示例logprintf函数,它会打印到两者stdout和预先打开的日志文件
#include <stdio.h> #include <stdarg.h> extern FILE *logfp; void logprintf(char *fmt, ...) { va_list argp; va_start(argp, fmt); vfprintf(stdout, fmt, argp); va_end(argp); va_start(argp, fmt); vfprintf(logfp, fmt, argp); va_end(argp); }现在,每当你调用logprintf(你可以像使用格式字符串一样调用它printf),它会同时打印到stdout和logfp,你可能已经将其打开到所需的日志文件。安排此事的另一种方法是
void f2printf(FILE *fp1, FILE *fp2, char *fmt, ...) { va_list argp; va_start(argp, fmt); vfprintf(fp1, fmt, argp); va_end(argp); va_start(argp, fmt); vfprintf(fp2, fmt, argp); va_end(argp); }其中f2printf就像fprintf一样,除了它接受两个文件指针(例如stdout和logfp),它会同时打印到两者。
这两种技术显然都需要你显式调用logprintf或f2printf。在标准 C 中,没有已知的方法可以隐式(即通过类似于freopen的调用)安排一个流,你通过正常的调用(例如fprintf)打印一次,同时打印到两个地方。[脚注]
另请参阅问题 15.5。