我知道正确使用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);
}
答案 0 :(得分:6)
这对freopen documentation说:
如果文件成功重新打开,则该函数返回指针 作为参数“stream”传递,可用于识别重新打开 流。否则,返回空指针。在大多数图书馆 实现时,errno变量也设置为特定于系统 失败时的错误代码。
所以是的,你可以检查NULL的返回值,看看是否有错误,或者检查错误。
关于您的评论,文档说:
如果指定了新文件名,则该函数首先尝试关闭 任何已与流相关联的文件(第三个参数)和 解除它。然后,不管该流是否是 成功关闭与否,freopen打开指定的文件 文件名并将其与流关联,就像fopen一样 使用指定的模式。
基于“无论该流是否成功关闭”,如果出现错误,原始流可能会保持打开状态,或者处于未定义状态。在任何情况下,这都不会产生任何实际差异,因为无论如何你都不想在freopen失败后使用流。