是否有API(如dup)复制fstream所以它可以

时间:2013-01-24 21:52:40

标签: c linux

我想将流写入一个FILE * 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");
}

1 个答案:

答案 0 :(得分:1)

简短的回答是不,它是两个不同的文件指针,你一次只能写一个。实际上,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