【问题标题】:What happens when I fopen a file (RAM and ROM matter)当我打开文件时会发生什么(RAM 和 ROM 很重要)
【发布时间】:2014-04-21 17:08:36
【问题描述】:

我想到了这个问题,因为我正在努力加快我的程序。

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

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

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

主要问题是:当我执行 fopen 时,我以某种方式将文件放入 RAM,或者每次使用文件指针时它都会从 HD 读取它?

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

【问题讨论】:

  • 当然取决于它的操作系统。您可以查看以下链接:stackoverflow.com/a/22745741/2724703
  • 可以专门把文件放到你的虚拟地址空间,调用是mmap()。但是即使使用mmap(),您也不能保证代表系统立即采取行动,它可能不会从磁盘读取任何内容,直到您实际尝试从落入映射内存区域的地址中读取。

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


【解决方案1】:

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

至于发生了什么,fopen 函数动态分配这个结构(例如malloc)并返回一个指针。该结构存储在虚拟内存中,可能在 RAM 或交换中(如果您启用了交换)。指针本身存储在编译器存储变量的任何位置(例如堆栈上的局部变量,其他地方的全局变量)。不管变量存储在哪里,它和结构一样存储在虚拟内存中,只是在另一个地方。

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

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

至于所有这些缓冲区的存储位置,它会在物理 RAM 中的某一点或另一点存储,但它不在您的控制之下,对于作为应用程序程序员的您来说并不重要。您创建自己的缓冲区,例如询问fread 用文件中的数据填充它,这就是您作为初学者真正需要知道的全部内容。

【讨论】:

  • 我要评论 fopen 本身不读取数据(这是 OP 假设的);但后来我意识到即使标准库会这样做,那么在您发出故意的fread/fgetc(等等)之前,您仍然无法“有效”访问这些数据.也就是说,即使库函数可能“提前考虑”,如果你所做的只是fclose(fopen(..));,那也没用。
猜你喜欢
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 2012-07-31
  • 2011-08-25
  • 1970-01-01
  • 2021-05-02
  • 2013-04-29
  • 2014-10-18
相关资源
最近更新 更多