我的观点是,当用fstream :: open打开文件时,所有文件的内容都被加载到内存中了吗?当您正在读取或写入文件时,您实际上是在内存中执行这些操作,或者是否正在进行大量磁盘访问?
答案 0 :(得分:1)
iostream库的一般设计有两种类型的io对象;流对象本身和流缓冲对象。流对象主要担心格式化;比如将longs转换为hex,被告知输出hex,等等;但他们真的不在乎他们写作的地方。流缓冲区忽略了格式化方面,并且关注与某些设备的交互 - 文件,字符串,控制台等。流对象只是指向适当的流缓冲区对象的指针,并将它们推迟到实际的io。对于fstream对象,正在使用的流缓冲区对象是filebuf(char流的basic_filebuf的特化)。
缓冲对象的整个设计以读取或写入缓冲区的概念为中心,并及时将读取和写入事件挂接到空缓冲区,尽管它们也可以以无缓冲的方式运行。这些缓冲区是由C ++本身定义的缓冲区;如果您的实现使用它们,则它们与总文件大小无关。如果它们保存整个文件,那只是因为文件适合他们选择的缓冲区长度。
答案 1 :(得分:0)
通常,打开文件时,文件的全部内容不会读入内存。
例如,如果是这种情况,1 GB文件将自动加载到内存中。这需要一段时间。此外,您的平台需要1GB的可用内存。
这也可能是一种浪费。如果您只想要第一个文本行或前64个字节,在这种情况下读取1GB文件将浪费时间和内存。
可能会发生一些缓冲。例如,驱动程序可以从硬盘驱动器读取目录表并存储到内存中。
让我们看另一种情况,如果我想打开一个文件进行写入,将整个文件读入内存是否有意义?
最有可能的是,驱动程序在打开时不会将整个文件读入内存。您需要告诉驱动程序读取数据以及放置数据的位置。