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

时间:2013-09-15 14:54:48

标签: c++ stream buffer ifstream

有没有办法在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;

我只想从磁盘读取一次。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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