【问题标题】:does fstream read/write move file pointerfstream 是否读/写移动文件指针
【发布时间】:2013-01-03 22:25:34
【问题描述】:

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

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

【问题讨论】:

    标签: c++ fstream


    【解决方案1】:

    是的,这就是它的工作方式。不过,您的示例并不完全相同。您的第一个示例从 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的时候至少要检查是否需要写字符才能进入初始状态进行代码转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-05
      • 2013-08-05
      • 2012-05-21
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多