【问题标题】:buffered std::ifstream to read from disk only once (C++)缓冲 std::ifstream 仅从磁盘读取一次 (C++)
【发布时间】:2013-09-19 18:15:33
【问题描述】:

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

我只想从磁盘读取一次。

【问题讨论】:

  • 相信您的操作系统的页面缓存会为您做到这一点。如果您绝对不能依赖它,那么实际上将文件读入您​​创建的预分配缓冲区。
  • 如果文件在第一次读取后发生更改,第二次读取将获取新数据,但我想继续使用第一次读取的缓冲区。我想除了使用 char 缓冲区进行任何进一步的操作之外别无他法 - 只是想知道是否有某种方法可以将流配置为具有陈旧数据......我想这很愚蠢:)
  • 哦,好吧!您应该在您的问题中提到,我认为它仅针对性能:)。

标签: c++ stream buffer ifstream


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    相关资源
    最近更新 更多