检查C中freopen()的返回值

时间:2014-01-03 16:54:37

标签: c freopen

我知道正确使用freopen是为了省略分配,因此post

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

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

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

1 个答案:

答案 0 :(得分:6)

这对freopen documentation说:

  

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

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

关于您的评论,文档说:

  

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

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