这是一个简单的问题,我希望能够轻松回答,文件流读写操作是否会移动指针?举个例子:
cpos=10000;
for (i=0;i<20;i++) {
dataFile.seekg(cpos+i,ios::beg);
dataFile.read(carray[i],1);
}
它(逻辑上)是否与:
相同cpos=10000;
dataFile.seekg(cpos,ios::beg);
for (i=0;i<20;i++) {
dataFile.read(carray[i],1);
}
换句话说,无论使用哪种方法,carray[] 是否包含相同的内容(我看不出第一种方法是否有效,所以我希望正确的答案是肯定的)。如果是这样,写入操作是否表现出相同的行为?
是的,这就是它的工作原理。不过,你的例子并不完全相同。第一个示例从 10000 读取,然后读取 10001,然后读取 10002,依此类推。第二个示例需要在循环外进行查找以设置初始位置。为了 100% 等价,你需要让你的第二个例子看起来像:
cpos=10000;
dataFile.seekg(cpos,ios::beg);
for (i=0;i<20;i++) {
dataFile.read(carray[i],1);
}
是的,文件指针会通过读写操作自动移动。 ...并且不寻求提高性能很多。而且,使用
file.read(ptr, 20)
比使用 20 次 file.read(ptr + i, 1)
快很多。不过,为了获得相同的语义,您需要使用一次搜索导航到适当的位置。
在文件流中查找将流设置为可以继续读取或写入字符的状态:要在读/写模式下打开的流的读取和写入之间切换(
std::ios_base::in | std::ios_base::out
),有必要引入查找。因此,每个视图都以一种有趣的方式设置可用缓冲区,如果流只是读取或写入字符序列,则流不需要这样做。另外,在写入每个seek时至少检查是否需要写入字符以进入代码转换的初始状态。