2

我知道,鉴于这篇文章freopen,正确的用法是省略分配:

freopen("/dev/tty","r", stdin);

我的问题是,我还应该检查返回值吗?我正在重新打开标准输入并关闭它。例如:

if(freopen("/dev/tty","r", stdin)==NULL) {
  fprintf(stderr, "Unable to redirect stdin from file\n");
  exit(1);
}
4

1 回答 1

6

这个freopen 的文档说:

如果文件重新打开成功,该函数返回作为参数“stream”传递的指针,该指针可用于标识重新打开的流。否则,返回一个空指针。在大多数库实现中,errno 变量也设置为失败时特定于系统的错误代码。

所以是的,您可以对照 NULL 检查返回值以查看是否有错误,或者检查 errno。

关于您的评论,文档说:

如果指定了新文件名,该函数首先尝试关闭任何已与流(第三个参数)关联的文件并解除关联。然后,与该流是否成功关闭无关,freopen 打开由文件名指定的文件并将其与流相关联,就像 fopen 使用指定模式所做的那样。

基于“独立于该流是否成功关闭”,如果出现错误,原始流似乎可能保持打开状态或处于未定义状态。无论如何,这不会产生任何实际影响,因为无论如何您都不想在 freopen 失败后使用流。

于 2014-01-03T17:00:41.360 回答