3

有没有一种方法可以向 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;

我只想从磁盘读取一次。

4

1 回答 1

1

就个人而言,我不会担心多次从文件中读取:系统无论如何都会保持使用过的缓冲区热。但是,根据文件的位置和交换空间,可能会使用不同的磁盘。

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

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

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

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

于 2013-09-15T15:03:25.673 回答