当我构建一个iostream时,如果打开一个文件将始终从硬盘读取整个文件然后将其放入内存,或者是否按需流式传输并缓存?
我问,因为检查文件是否存在的一种方法是查看是否打开文件失败,但我担心如果我打开的文件非常大,那么如果iostream必须在打开时读取整个文件需要很长时间
答案 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; }
希望这有点澄清。