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

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;

我希望只需要从磁盘读取一次。


相信您的操作系统页面缓存可以为您完成这项工作。如果您绝对不能依赖它,那么请将文件实际读入您创建的预分配缓冲区中。 - us2012
如果在第一次读取后更改了文件,则第二次读取将获取新数据,但我希望继续使用第一次读取的缓冲区。我想除了使用char缓冲区进行任何进一步操作外,没有其他方法 - 只是想知道是否有一些方法可以配置流以具有陈旧的数据...可能很愚蠢 :) - indijanc
哦,好的!你应该在问题中提到这一点,我以为它只是针对性能的 :)。 - us2012
1个回答

1
个人而言,我不会担心从文件中多次读取:系统会保持使用的缓冲区处于热状态。然而,根据文件的位置和交换空间,可能会使用不同的磁盘。
文件流本身确实支持一个setbuf()函数,理论上可以将内部使用的缓冲区设置为用户选择的大小。然而,必须支持并需要有影响的唯一参数是setbuf(0, 0),这相当于相反的效果,即流变为非缓冲模式。
我想,确保数据不再从流中读取的最简单方法是使用std::stringstream,在初始读取后使用它代替文件流,例如:
std::stringstream inputfile;
inputfile << std::ifstream(filename).rdbuf();
inputfile.seekg(0, std::ios_base::beg);

如果不想先读取整个文件流,可以使用过滤流,在到达尚未读取的部分时读取文件。但是,创建相应的流缓冲区并不简单,并且由于我认为原始目标已经值得怀疑,所以我怀疑它是否有很大的好处。当然,您可以创建一个仅在构造函数中执行初始化操作的简单流,并使用该流。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接