fstream 是否读/写移动文件指针

问题描述 投票:0回答:2

这是一个简单的问题,我希望能够轻松回答,文件流读写操作是否会移动指针?举个例子:

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[] 是否包含相同的内容(我看不出第一种方法是否有效,所以我希望正确的答案是肯定的)。如果是这样,写入操作是否表现出相同的行为?

c++ fstream
2个回答
5
投票

是的,这就是它的工作原理。不过,你的例子并不完全相同。第一个示例从 10000 读取,然后读取 10001,然后读取 10002,依此类推。第二个示例需要在循环外进行查找以设置初始位置。为了 100% 等价,你需要让你的第二个例子看起来像:

cpos=10000;
dataFile.seekg(cpos,ios::beg);
for (i=0;i<20;i++) {
   dataFile.read(carray[i],1);
}

2
投票

是的,文件指针会通过读写操作自动移动。 ...并且寻求提高性能很多。而且,使用

file.read(ptr, 20)
比使用 20 次
file.read(ptr + i, 1)
快很多。不过,为了获得相同的语义,您需要使用一次搜索导航到适当的位置。

在文件流中查找将流设置为可以继续读取或写入字符的状态:要在读/写模式下打开的流的读取和写入之间切换(

std::ios_base::in | std::ios_base::out
),有必要引入查找。因此,每个视图都以一种有趣的方式设置可用缓冲区,如果流只是读取或写入字符序列,则流不需要这样做。另外,在写入每个seek时至少检查是否需要写入字符以进入代码转换的初始状态。

© www.soinside.com 2019 - 2024. All rights reserved.