当我打开一个文件(RAM和ROM)时会发生什么

时间:2014-04-21 17:08:37

标签: c pointers memory-management file-io fopen

这个问题出现在我脑海中,因为我试图加快我的计划。

我从文件中读取数据,像往常一样,我使用经典:

FILE *fp;
fp=fopen("c:\\test.txt", "r");

FILE指针包含一个我不太了解的结构。

主要问题是:当我执行fopen时我把文件放到RAM中,或者每次我使用文件指针时都从HD读取它?

操作系统:Linux Mint,gcc编译器

1 个答案:

答案 0 :(得分:3)

返回的指针是指向黑盒结构的指针。你不应该理解实际的结构,只是如何使用它的指针。

至于发生了什么,fopen函数动态分配这个结构(通过e..g malloc)并返回一个指针。结构存储在虚拟内存中,可能位于RAM或交换中(如果已启用交换)。指针本身存储在编译器存储变量的地方(例如堆栈上的局部变量,其他地方的全局变量)。无论变量存储在何处,它都存储在虚拟内存中,就像结构一样,只是在另一个地方。

然后是文件处理操作。默认情况下,所有文件流都是缓冲,这意味着当您尝试从FILE指针读取任何内容时,您调用的函数将读入私有缓冲区,并返回给您一部分该缓冲区(或多个缓冲区副本,如果您想要读取超过内部缓冲区可以容纳)。此缓冲区也存储在虚拟内存中,未知位置。

在较低级别,操作系统也有自己的缓冲,但它存储在操作系统专用的内存中。操作系统甚至可能有多个缓冲区。

关于存储所有这些缓冲区的位置,它将存在于物理RAM中,但它不在您的控制之下,对于您作为应用程序编程人员而言,它并不重要。你创建自己的缓冲区,例如fread用文件中的数据填充它,这是您作为初学者真正需要知道的全部内容。