fstream读/写移动文件指针

does fstream read/write move file pointer

本文关键字:文件 指针 移动 fstream      更新时间:2023-10-16

这是一种简单的问题,我希望可以很容易地回答,文件流读写操作移动指针沿着吗?例如:

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

是否(逻辑上)与

相同?
dataFile.seekg(cpos,ios::beg);    
cpos=10000;
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)要快得多。要获得相同的语义,您需要使用一次seek导航到适当的位置。

在文件流中查找将流设置为可以继续读或写字符的状态:对于以读写模式打开的流(std::ios_base::in | std::ios_base::out),为了在读和写之间切换,有必要引入seek。因此,每个see以一种有趣的方式设置可用缓冲区,如果流只是读取或写入一个字符序列,则不需要这样做。此外,在写入时,每个seek至少检查是否有必要写入字符以进入代码转换的初始状态。