我想将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()呢?
感谢。
答案 0 :(得分:3)
STDOUT_FILENO
是一个数字文件描述符(通常为1
)。使用close
时,释放描述符,然后将其重新分配给dup2
。现在,该描述符的任何输出都将转到新文件。
stdout
是一个FILE*
,一个包含文件描述符的排序对象。执行printf
格式输出到与FILE
关联的缓冲区,然后write
缓冲区到描述符(取决于缓冲模式)。当您fclose
FILE*
时,它(通常)close
是基础描述符,并释放FILE
对象。 dup2
没有确定stdout
,因此printf
失败。