6

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

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

4

2 回答 2

5

是的,这就是它的工作方式。不过,您的示例并不完全相同。您的第一个示例从 10000 读取,然后是 10001,然后是 10002 等。第二个示例需要在循环外进行查找以设置初始位置。要 100% 等效,您需要让第二个示例看起来像:

cpos=10000;
dataFile.seekg(cpos,ios::beg);
for (i=0;i<20;i++) {
   dataFile.read(carray[i],1);
}
于 2013-01-03T22:27:01.020 回答
2

是的,文件指针是由读写操作自动移动的。...并且寻求可以大大提高性能。此外,使用比使用 20 次要快得多。但是,要获得相同的语义,您需要使用一次搜索导航到适当的位置。file.read(ptr, 20)file.read(ptr + i, 1)

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

于 2013-01-03T22:27:34.207 回答