fstream读写操作是否会移动文件指针?

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[] 是否包含相同的内容(我认为第一种方法不够高效,因此希望正确答案是“是”)。如果是这样的话,写操作是否具有相同的行为?

@starriet 编辑被拒绝了。你的编辑破坏了帖子的意思。不要这样做。问题是关于寻找和不寻找的,移除寻找使其变得毫无意义。在采取行动之前请先阅读。 - undefined
@user207421 你把它改回了错误编码的版本。请在还原之前阅读被编辑的内容,或者请明确给出正确的理由。编辑并没有完全删除搜索功能,但你却说它被删除了。 - undefined
2个回答

5

没错,它就是这样工作的。不过,您的示例有些不同。您的第一个示例从10000开始读取,然后是10001,然后是10002等等。而第二个示例需要在循环外进行搜索以设置初始位置。要完全相等,您需要让第二个示例看起来像:

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

抱歉,我知道那个--我只是在演示循环中的非寻找。感谢确认。 - mlewis54

2
是的,文件指针会在读写操作中自动移动。而进行查找可以大大提高性能。此外,使用file.read(ptr, 20)比使用20次file.read(ptr + i, 1)要快得多。但是,为了获得相同的语义,您需要通过一次查找导航到适当的位置。
在文件流中进行查找将使流处于一种状态,可以继续读取或写入字符:要在读/写模式下打开的流(std::ios_base::in | std::ios_base::out)之间切换读取和写入,必须引入一个查找。每个查找都以一种有趣的方式设置可用缓冲区,如果只读取或写入一系列字符,则流不需要执行该操作。此外,在写入时,每个查找至少会检查是否需要写入字符以进入代码转换的初始状态。

如果使用的是std::ifstreamstd::ofstream而不是std::fstream,你的答案会有什么不同?这是一个很大的区别吗? - undefined
确实如此。在Unix System 7时代,我通过消除多余的seek()调用,将I/O速度提高了一倍。 - undefined
@starriet:逻辑发生在streambuf层面上,它可以动态地知道流是以读写方式打开的,并可能进行优化。虽然我怀疑这样做是否会实现。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接