使用funopen或fwopen提供自己的写入多个FILE*s 的写入函数.
例:
FILE *files[2] = ...;
FILE *f = fwopen((void *)files, my_writefn);
// ... use f as you like ...
int my_writefn(void *cookie, const char *data, int n) {
FILE **files = (FILE **)cookie;
fwrite(data, n, 1, files[0]);
return fwrite(data, n, 1, files[1]);
}
Run Code Online (Sandbox Code Playgroud)
(省略错误处理.)
请注意,funopen并fwopen在标准的Linux和BSD没有.我不知道是否有与Linux兼容的等价物.
用户 laalto 是正确的,但在 Linux 上,您正在寻找的函数称为fopencookie。纠正 Linux 的 laalto 示例会导致:
int my_writefn(void *cookie, const char *data, int n) {
FILE **files = (FILE **)cookie;
fwrite(data, n, 1, files[0]);
return fwrite(data, n, 1, files[1]);
}
int noop(void) { return 0; }
cookie_io_functions_t my_fns = {
(void*) noop,
(void*) my_writefn,
(void*) noop,
(void*) noop
};
FILE *files[2] = ...;
FILE *f = fopencookie((void *)files, "w", my_fns);
// ... use f as you like ...
Run Code Online (Sandbox Code Playgroud)
当您写入时f,系统将执行您的my_writefn函数,并将传递给的数据传递给它fwrite。为了使事情变得更容易,您可能还希望将文件流的缓冲更改为面向行:
setvbuf(f, NULL, _IOLBF, 0);
Run Code Online (Sandbox Code Playgroud)
这将缓冲传递到的数据,fwrite直到输出换行符或从附加到进程的任何流(例如 stdin)读取任何数据。 注意:您必须在任何数据写入流之后但之前 sevbuf调用。fopencookie
我使用行缓冲是因为我通常使用fopencookie将 stderr 重定向到 syslog,或者通过网络套接字,并且处理面向行的数据更容易、更高效。