最佳答案
用户laalto是正确的,但在Linux上,您正在寻找的功能称为fopencookie.纠正laalto的Linux示例导致:
int my_writefn(void *cookie,const char *data,int n) {
FILE **files = (FILE **)cookie;
fwrite(data,n,1,files[0]);
return fwrite(data,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 ...
当您写入f时,系统将执行my_writefn函数,并将传递给fwrite的数据传递给它.为了简化操作,您可能还希望将文件流的缓冲更改为面向行:
setvbuf(f,NULL,_IOLBF,0);
这将缓冲传递给fwrite的数据,直到输出换行或从连接到进程的任何流(例如stdin)读取任何数据.注意:您必须在fopencookie之后但在将任何数据写入流之前调用sevbuf.
我使用行缓冲,因为我通常使用fopencookie将stderr重定向到syslog,或通过网络套接字,并且处理面向行的数据更容易,更有效.