fopen和freopen有什么区别?

时间:2010-11-12 21:38:09

标签: c

Freopen不是多余的吗?

2 个答案:

答案 0 :(得分:5)

根据POSIX(请参阅应用程序使用部分),freopen最初添加到C中,以便将stdinstdout更改为二进制模式。我怀疑如果你仔细阅读ANSI / ISO基本原理文档,你可以找到对该声明的支持。作为POSIX文档,这种用法在POSIX系统上是无意义的(其中文本和二进制模式需要表现相同),并且由于规范中的错误导致文件截断,如果严格遵守,则实际上是有害的。

至于实际用途,我可以想到以下几点:

  • 在执行外部程序之前替换stdinstdoutstderr - 但我不清楚POSIX是否要求freopen重用相同的文件描述符编号作为原始FILE有没有,所以我不确定这是否有效。为此,我始终只使用opendup2
  • 从调用方获取FILE *的日志库可能会使用freopen将其置于附加模式,以确保即使另一个程序写入日志文件也会在结尾写入所有数据。 / LI>
  • 如果你已经传递了FILE *指针到程序中的许多组件,你发现自己后来需要支持交换文件(例如,记录日志轮换),{ {1}}比跟踪存储freopen的所有地方要容易得多,并且在代码中进行黑客攻击以更新每个实例或将FILE *包装在您自己的结构中,以便将其交换出来。

所有这些的有用性受到不良行为或FILE *失败的限制; freopen变得无效且无法恢复,因此如果程序的任何部分可能仍在使用它,则必须找到阻止进一步访问的方法或立即FILE *。同样,出于同样的原因,exit不是线程安全的;如果失败,从任何其他线程访问该文件会导致未定义的行为。

答案 1 :(得分:4)

不 - freopen()不是多余的。它允许您打开文件作为标准输入,例如,否则您不能依赖于实现。

如果你必须调用一个函数(你没有源代码,因此你无法修复它)读取特定文件流(通常是标准输入)或写入特定文件流(通常标准输出)但你不希望函数读取或写入程序中连接的文件,然后你可以使用freopen()来修复事情,以便函数看到它所期望的但得到的来自您想要的信息 - 或者将其写在您想要的地方。