2016-11-27 447 views
1

我想将STDOUT重定向到磁盘上的文件。重点是让我的程序中的printf写入文件而不是控制台。fclose(stdout)vs close(STDOUT_FILENO) - C

我看到他们过去在网络上的一些文章:

dup2(fileno(outputFile), STDOUT_FILENO); 

或者:他们使用

close(STDOUT_FILENO); 
dup(fileno(outputFile)); 

在每一个教学关闭()和它的实际工作。不过我很好奇,我试图用FCLOSE(标准输出)来代替,但有些错误发生了,当我试图用printf:

fclose(STDOUT_FILENO); 
dup(fileno(outputFile)); 

错误:

Bad file descriptor 

我的问题是,为什么FCLOSE做()不工作但close()呢?

谢谢。

+0

如果您只是想将stdout重定向到文件,请使用shell重定向。如果你想学习如何使用C重定向文件,你应该改写这个问题。 –

回答

3

STDOUT_FILENO是一个数字文件描述符(通常为1)。当您使用close时,您释放描述符,但随后使用dup2重新指定。任何输出到该描述符现在将转到新文件。

stdout另一方面是FILE*,它是一个包含文件描述符的排序对象。将printf格式输出到与FILE关联的缓冲区中,然后将write作为描述符的缓冲区(取决于缓冲模式)。当fclose a FILE*时,它(通常)close是底层描述符,并释放了对象FILEdup2不会保证stdout,所以printf失败。