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

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

本文关键字:C++ 一次 读取 std ifstream 缓冲 磁盘      更新时间:2023-10-16

有没有办法将缓冲添加到 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);

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