繁体   English   中英

缓冲的std :: ifstream仅从磁盘读取一次(C ++)

[英]buffered std::ifstream to read from disk only once (C++)

有没有一种方法可以将缓冲添加到std :: ifstream中,这意味着多次查找(seekg)和读取不会导致不必要的读取。

我基本上想多次使用流读取文件块,但我只想从磁盘读取一次块。

这个问题可能有点离我要混合缓冲的读取和流...

例如:

char filename[] = "C:\\test.txt";
fstream inputfile;
char buffer[20];

inputfile.open(filename, ios::binary);

inputfile.seekg(2, ios::beg);
inputfile.read(buffer, 3);
cout << buffer << std::endl;

inputfile.seekg(2, ios::beg);
inputfile.read(buffer, 3);
cout << buffer3 << std::endl;

我只想从磁盘读取一次。

就个人而言,我不必担心会多次读取文件:系统将始终使使用的缓冲区保持高温。 但是,取决于文件的位置和交换空间,可以使用不同的磁盘。

文件流本身确实支持setbuf()函数,该函数理论上可以将内部使用的缓冲区设置为用户选择的大小。 但是,唯一需要支持并需要具有效果的参数是setbuf(0, 0) ,这是完全相反的效果,即,流变为无缓冲。

我想,保证不再再次从流中读取数据的最简单方法是使用std::stringstream并在初次读取后使用它代替文件流,例如:

std::stringstream inputfile;
inputfile << std::ifstream(filename).rdbuf();
inputfile.seekg(0, std::ios_base::beg);

如果不希望先读取整个文件流,则可以使用过滤流,该过滤流会在文件到达尚未读取的部分时读取文件。 但是,创建相应的流缓冲区并不是一件容易的事,并且由于我认为最初的目标已经有问题,因此我会怀疑它是否有很多好处。 当然,您可以创建一个简单的流,该流只在构造函数中进行初始化,而改用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM