Freopen不是多余的吗?
答案 0 :(得分:5)
根据POSIX(请参阅应用程序使用部分),freopen
最初添加到C中,以便将stdin
和stdout
更改为二进制模式。我怀疑如果你仔细阅读ANSI / ISO基本原理文档,你可以找到对该声明的支持。作为POSIX文档,这种用法在POSIX系统上是无意义的(其中文本和二进制模式需要表现相同),并且由于规范中的错误导致文件截断,如果严格遵守,则实际上是有害的。
至于实际用途,我可以想到以下几点:
stdin
,stdout
和stderr
- 但我不清楚POSIX是否要求freopen
重用相同的文件描述符编号作为原始FILE
有没有,所以我不确定这是否有效。为此,我始终只使用open
和dup2
。FILE *
的日志库可能会使用freopen
将其置于附加模式,以确保即使另一个程序写入日志文件也会在结尾写入所有数据。 / LI>
FILE *
指针到程序中的许多组件,你发现自己后来需要支持交换文件(例如,记录日志轮换),{ {1}}比跟踪存储freopen
的所有地方要容易得多,并且在代码中进行黑客攻击以更新每个实例或将FILE *
包装在您自己的结构中,以便将其交换出来。所有这些的有用性受到不良行为或FILE *
失败的限制; freopen
变得无效且无法恢复,因此如果程序的任何部分可能仍在使用它,则必须找到阻止进一步访问的方法或立即FILE *
。同样,出于同样的原因,exit
不是线程安全的;如果失败,从任何其他线程访问该文件会导致未定义的行为。
答案 1 :(得分:4)
不 - freopen()
不是多余的。它允许您打开文件作为标准输入,例如,否则您不能依赖于实现。
如果你必须调用一个函数(你没有源代码,因此你无法修复它)读取特定文件流(通常是标准输入)或写入特定文件流(通常标准输出)但你不希望函数读取或写入程序中连接的文件,然后你可以使用freopen()
来修复事情,以便函数看到它所期望的但得到的来自您想要的信息 - 或者将其写在您想要的地方。