无法理解C中的文件范围

时间:2015-06-30 14:06:27

标签: c file scope

我无法绕过C中的文件,特别是范围和持续时间。假设我使用

创建一个文件
fopen("random.dat", "w");

此文件存在多长时间?一旦我的程序运行完毕,它会被删除,还是以某种方式重置?如果我在我的代码中进一步重新打开文件,只有这次使用“r”读取参数或“a​​”,我是否会有冲突的流,因为我打开一个技术上已经打开的文件?

2 个答案:

答案 0 :(得分:1)

它是一个普通文件,就像您计算机上的所有其他文件一样。它存在直到某些东西删除它,并且它的内容保持不变直到某些东西修改它。它不会自动删除或重置"程序结束时(如果C不能将数据保存到持续时间超过程序的文件,则C将无法用作编程语言。)

但是,因为您使用" w"打开文件。选项,如果文件已经存在,文件将被截断(重置为零长度) - 有效地,fopen删除现有文件并创建一个新的空文件。这意味着如果您再次运行程序,第一次运行的输出将被第二次运行的输出替换。

同时打开同一个文件多次的效果是特定于平台的。在Unix / Linux上它应该可以正常工作,但在Windows上它可能会失败(虽然我还没有检查过)。但是,如果您在再次打开文件之前关闭该文件(例如使用fclose),则该文件应该可以在任何系统上正常运行。

答案 1 :(得分:1)

在编译C程序期间使用术语文件范围。它与执行期间的某些事情无关。

实际上,该术语具有误导性;一个更好的短语是编译单元范围。它描述了在块(语句)之外定义的名称(变量,函数,结构,...)的可见性,即在最外层。

对于在程序执行期间打开的文件,它们实际上是打开的,直到明确关闭,独立于程序结构。但是,当您需要一个包含对该文件的引用的对象时,这会限制对您有权访问此引用的位置的可见性(对于stdlib文件函数FILE *),可以通过 scope ,或明确地将其传递给函数。

打开/写入/关闭的普通文件在程序关闭或其引用超出范围之后仍然不会停止存在(如何持久存储数据?),但仅在显式删除/取消链接或文件系统本身被删除时(例如,对于Linux tempfs,仅在操作系统关闭之前存在)。这称为生命周期,顺便说一句。