This question already has answers here:
Closed 2 years ago.
Difference between fclose and close
(4个答案)
我想将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()起作用?
谢谢。

最佳答案

STDOUT_FILENO是一个数字文件描述符(通常为1)。使用close时,释放描述符,然后使用dup2重新分配它。该描述符的任何输出现在都将转到新文件。
另一方面是一个包含文件描述符的排序对象。将stdout格式输出到与FILE*相关联的缓冲区,然后将缓冲区转换到描述符(取决于缓冲模式)。当您printfaFILE时,它(通常)是底层描述符,并释放write对象。fclose不加压,因此FILE*失败。

关于c - fclose(stdout)vs close(STDOUT_FILENO)-C ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40834844/

10-11 01:53