使用 fstream 时,是否将文件的所有内容加载到内存中?

When using the fstream is all the file's content loaded into memory?

本文关键字:加载 内存 fstream 是否 文件 使用      更新时间:2023-10-16

我的观点是,当使用fstream::open打开文件时,所有文件的内容都加载到内存中?当你对一个文件进行读写时你实际上是在内存中做这些操作还是有很多磁盘访问?

一般来说,打开文件时不会将文件的全部内容读入内存。

例如,如果是这种情况,1gb的文件将自动加载到内存中。这需要一段时间。此外,您的平台还需要1GB的可用内存。

也可能是一种浪费。如果您只想要第一个文本行或前64个字节,那么在这种情况下,读取1GB文件将浪费时间和内存。

可能发生了一些缓冲。例如,驱动程序可以从硬盘驱动器读取目录表并存储到内存中。

让我们看另一种情况,如果我想打开一个文件进行写操作,是否有必要将整个文件读入内存?

很可能,驱动程序在打开文件时不会将整个文件读入内存。您需要告诉驱动程序读取数据并将数据放在哪里。

iostream库的一般设计有两种类型的io对象;流对象本身,以及流缓冲区对象。流对象主要关心格式;比如将long数转换为十六进制,被告知输出十六进制,等等;但是他们真的不太关心他们在哪里写。流缓冲区忽略格式方面,而关注与某些设备(文件、字符串、控制台等)的交互。流对象只是有指向适当的流缓冲区对象的指针,并在实际的io操作中遵从它们。在fstream对象的情况下,使用的流缓冲区对象是filebuf (basic_filebuf对char流的专门化)。

缓冲对象的整个设计都围绕着从缓冲区读取或写入缓冲区的概念,并及时将读取和写入事件挂钩到空缓冲区,尽管它们也可以以无缓冲的方式运行。这些缓冲区是c++本身定义的;如果由您的实现使用,则它们与总文件大小无关。如果它们保存整个文件,那只是因为文件适合它们选择的缓冲区长度。