fclose(stdout)vs close(STDOUT_FILENO) - C.

时间:2016-11-27 22:52:09

标签: c

我想将STDOUT重定向到磁盘上的文件。关键是要让我的程序上的printf写入文件而不是控制台。

我在网上看到了一些他们使用的文章:

dup2(fileno(outputFile), STDOUT_FILENO);

或者:

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

在每个教程中,他们使用close(),它实际上是有效的。但我很好奇,我尝试使用fclose(stdout),但是当我尝试使用printf时发生了一些错误:

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

错误:

Bad file descriptor

我的问题是,为什么fclose()不起作用但close()呢?

感谢。

1 个答案:

答案 0 :(得分:3)

STDOUT_FILENO是一个数字文件描述符(通常为1)。使用close时,释放描述符,然后将其重新分配给dup2。现在,该描述符的任何输出都将转到新文件。

另一方面,

stdout是一个FILE*,一个包含文件描述符的排序对象。执行printf格式输出到与FILE关联的缓冲区,然后write缓冲区到描述符(取决于缓冲模式)。当您fclose FILE*时,它(通常)close是基础描述符,并释放FILE对象。 dup2没有确定stdout,因此printf失败。