我想同时将一个流写入一个文件*fp,该流也应该复制到另一个fp上。有没有更好的方法通过删除一个fprintf来编写调试函数?

const int logflag=1;
#define debug(args ...) if (logflag) { FILE *flog = fopen("test.log", "a+"); fprintf( flog, args); fclose(flog); } fprintf(stderr, args);

int main()
{

    debug("test"); // writes test into both stderr and flog
    debug("test2");
}

最佳答案

简短的回答是不,这是两个不同的文件指针,一次只能写一个。实际上,dup仍然没有帮助您,因为它关闭了重复的文件描述符:

"dup2() makes newfd be the copy of oldfd, closing newfd first if necessary"

from the dup2 man-pages

但是,如果您的目标是同时拥有一个到屏幕和一个文件的日志,那么使用Linux已经提供的工具会更好地为您服务。一般来说,一个好的做法(我不记得它的来源)是让程序将其输出和调试输出到stdout/stderr并让调用用户决定如何处理输出。
在此之后,如果所有输出都转到stderr,则在执行程序时可以执行以下操作:
$ ./program 2>&1 | tee file.log

关于c - 是否有API(例如dup)复制fstream,以便,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14511484/

10-11 16:18