fopen和freopen有什么区别?

and*_*and 3 c

freopen不是多余的吗?

Jon*_*ler 6

不——freopen()并不多余。例如,它允许您将文件作为标准输入打开,否则您无法依赖它来实现。

如果您必须调用一个在特定文件流(通常是标准输入)上读取或在特定文件流(通常是标准输出)上写入的函数(您没有源代码,因此无法修复它) )但您不希望该函数读取或写入程序中连接的文件,那么您可以使用它freopen()来修复问题,以便该函数看到它所期望的内容,但从您想要的位置获取信息 - 或把它写在你想要的地方。


R..*_*R.. 5

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

至于实际用途,这里有一些我能想到的:

  • 替换stdin,stdout以及stderr在执行外部程序之前 - 但我不清楚POSIX是否需要freopen重用与原始程序相同的文件描述符编号FILE,所以我不确定这是否可以保证工作.我总是简单地使用opendup2为此目的.
  • FILE *从调用者获取a的日志库可能会使用freopen它将其置于附加模式,以确保即使另一个程序写入日志文件也会在结尾写入所有数据.
  • 如果您已经传递并存储FILE *指向程序中许多组件的指针,并且您发现自己以后需要支持交换文件(例如,记录日志轮换),freopen那么比在任何地方跟踪都要容易得多FILE *存储和黑客代码更新每个实例或包装FILE *在您自己的结构,让您交换它.

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