C语言 在打开的文件中查找 0 是否比关闭文件然后再次打开它更快?

  • 本文关键字:文件 然后 是否 语言 查找 c file
  • 更新时间 :
  • 英文 :


假设我已经打开了一个文件。我想在其中写入一些新内容(覆盖文件中的任何旧内容(。我希望无论文件的大小如何,此操作都能高效运行。

在已打开的文件中寻求 0 是否比关闭文件然后再次打开它更快?

在我们讨论哪个更快之前,首先我们必须证明它们是等效的。他们不是。

仅寻求 0 不足以确保覆盖所有内容。如果新内容更短怎么办?您必须寻找并截断才能确定。

没有截断打开的文件的标准方法。POSIX有ftruncate,Windows有SetEndOfFilefopen(filename, "w")是标准 C。因此,搜索和截断会带来兼容性问题。

请参阅是否有一种有保证且安全的方法可以从 ANSI C FILE 指针截断文件?和如何在 C 中截断文件?。


文件删除还有另一个微妙的区别。在 Unix 上,如果删除文件,任何打开的文件句柄都保持打开状态。数据将一直保留,直到关闭所有文件句柄。这通常被利用来拥有安全的临时文件:打开临时文件进行读取和写入,立即删除该文件,然后继续读取和写入打开的文件句柄。不可见的临时文件。

假设您的文件在文件句柄打开时被删除。如果查找并截断,则仍在使用相同的数据,但没有文件。如果您fopen,则正在写入新文件。这可能会产生行为和安全隐患。

文件重命名也存在类似的问题。如果在文件句柄打开时重命名了文件,则查找和截断将处理重命名的文件(有多种非可移植方法可以从文件句柄获取文件名(。fopen将打开一个具有旧名称的文件。


哪个更快?可能搜索并截断。 无论如何,fopen都必须这样做,再加上查找与文件名关联的数据、检查权限等的开销......

您可以轻松对此进行基准测试。您还可以使用strace或操作系统的等效项来查看基础系统调用。

相关内容

最新更新