有没有办法在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;
我只想从磁盘读取一次。
答案 0 :(得分:1)
就个人而言,我不担心多次从文件中读取:系统将保持使用的缓冲区热。但是,根据文件和交换空间的位置,可能会使用不同的磁盘。
文件流本身支持setbuf()
函数,理论上可以将内部使用的缓冲区设置为用户选择的大小。但是,必须支持并且需要生效的唯一参数是setbuf(0, 0)
,这是相反的效果,即流变为无缓冲。
我想,保证数据不再从流中读取的最简单方法是使用std::stringstream
并在初始读取后使用它而不是文件流,例如:
std::stringstream inputfile;
inputfile << std::ifstream(filename).rdbuf();
inputfile.seekg(0, std::ios_base::beg);
如果不希望首先读取整个文件流,可以使用过滤流,只要它到达尚未读取的部分,就会读取该文件。但是,创建一个相应的流缓冲区并不是那么简单,因为我认为最初的目标已经有问题,我会怀疑它有很大的好处。当然,您可以创建一个简单的流,它只是在构造函数中进行初始化,然后使用它。