缓冲的 std::ifstream 只能从磁盘读取一次 (C++)
buffered std::ifstream to read from disk only once (C++)
有没有办法将缓冲添加到 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;
我只想从磁盘读取一次。
就个人而言,我不会担心多次读取文件:无论如何,系统都会保持使用的缓冲区热。但是,根据文件的位置和交换空间,可能会使用不同的磁盘。
文件流本身确实支持setbuf()
函数,理论上可以将内部使用的缓冲区设置为用户选择的大小。但是,唯一必须支持并且需要产生影响的参数是setbuf(0, 0)
,这是完全相反的效果,即流变得无缓冲。
我想,保证不会再次从流中读取数据的最简单方法是使用std::stringstream
并在初始读取后使用它而不是文件流,例如:
std::stringstream inputfile;
inputfile << std::ifstream(filename).rdbuf();
inputfile.seekg(0, std::ios_base::beg);
如果不希望先读取整个文件流,则可以使用过滤流,每当文件到达尚未读取的部分时,它就会读取文件。但是,创建相应的流缓冲区并非易事,并且由于我认为原始目标已经存在问题,因此我怀疑它是否具有很大的好处。当然,您可以创建一个简单的流,它只在构造函数中进行初始化并改用它。
相关文章:
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 什么是仅调用一次并调用参数的控制台应用
- 如何确保用户在一行上提示输入一次时输入名字和姓氏?
- (C++)虽然循环一次不起作用,但我引入了多个变量
- 为什么我的信号处理程序只执行一次?
- 如何使用C++一次读取整个二进制文件
- 花括号使循环运行一次?
- 从子菜单返回后,正确的输入至少进入验证循环一次
- 蓝牙插座只能读取一次,为什么?