构造iostream(c ++)是否将数据从硬盘驱动器读入内存?

时间:2011-04-25 10:55:15

标签: c++ iostream

当我构建一个iostream时,如果打开一个文件将始终从硬盘读取整个文件然后将其放入内存,或者是否按需流式传输并缓存?

我问,因为检查文件是否存在的一种方法是查看是否打开文件失败,但我担心如果我打开的文件非常大,那么如果iostream必须在打开时读取整个文件需要很长时间

4 个答案:

答案 0 :(得分:3)

如果要使用boost,要检查文件是否存在,可以这样做。

#include <boost/filesystem.hpp>

bool fileExists = boost::filesystem::exists("foo.txt");

答案 1 :(得分:2)

不,打开时不会将整个文件读入内存。它会以块的形式读取您的文件,但我相信在您读取第一个字节之前,此过程不会启动。此外,这些块相对较小(大小为4-128千字节),如果您按顺序读取文件,它会这样做会大大加快速度。

在我的Linux机器上测试(好吧,Linux VM)只打开文件只会导致系统调用open,但不会导致read系统调用。在第一次尝试从流中读取之前,它不会从文件中开始读取任何内容。当我读取文件时,它会读取8191(为什么8191?这看起来是一个非常奇怪的数字)字节块。

答案 2 :(得分:2)

如果文件存在,打开文件是一种不好的测试方法 - 它只是告诉你是否可以打开它。打开可能由于多种原因而失败,通常是因为您没有读取权限,但该文件仍然存在。通常最好使用特定于操作系统的函数来测试是否存在。不,打开fstream不会导致内容被读取。

答案 3 :(得分:0)

我认为,当您打开文件时,会填充打开文件的进程的相应数据结构,其中包括文件指针,文件描述符,v节点等。

现在,可以使用缓冲流(fwrite,fread)或使用系统调用(读取和写入)来读取和写入文件。

当我们使用缓冲流时,我们缓冲数据然后写入或读取它[这是为效率目的而做的]。此语句本身意味着整个文件不会被读入内存,但某些字节被读入缓冲区然后可用。

在读取和写入等sys调用的情况下,内核级缓冲完成(使用fsync也可以清除内核缓冲区),但数据实际上是读取并写入设备。

checking existance of file

#include < sys/stat.h >

int main(){
struct stat file_i;
std::string f("myfile.txt");
if (stat(f.c_str(),&file_i) != 0){
   cout << "File not found" << endl;
}
return 0;
}

希望这有点澄清。