2013-01-03 63 views
5

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

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

回答

5

是的,这是它的工作方式。不过,你的例子并不完全一样。你的第一个例子从10000开始,然后是10001,然后是10002,等等。第二个例子需要在循环外寻找来设置初始位置。为100当量%,你需要有你的第二个例子是这样的:

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

对不起,我知道 - 我只是在演示循环中的非寻找。感谢您的确认。 – mlewis54

1

是,文件指针会自动移动通过读取和写入操作。 ...和不是正在寻找改善的性能很多。此外,使用file.read(ptr, 20)比使用20倍file.read(ptr + i, 1)快很多。为了获得相同的语义,您需要导航到适当的位置,尽管使用一次搜索。

在文件流中寻找可将流设置为可继续读取或写入字符的状态:要在以读/写模式打开的流(std::ios_base::in | std::ios_base::out)之间切换读取和写入操作,必须引入寻求。因此,每个人都可以通过一种有趣的方式设置可用缓冲区,如果该流只读取或写入一系列字符,则不需要这样做。另外,在每次写入时,至少要检查是否需要写入字符才能进入代码转换的初始状态。