用fstream寻找和寻求

时间:2012-09-08 21:41:48

标签: c++ fstream

我注意到这件奇怪的事情

fstream obj(filename , ios::in);
obj.seekp(7);

相同
fstream obj(filename , ios::in);
obj.seekg(7);

seekgseekp执行相同的操作并导致相同的结果,尽管我只指定了ios :: in

为什么他们都使用fstream?使用fstream seekpseekg之间有什么区别?

1 个答案:

答案 0 :(得分:5)

basic_fstream源自basic_iostream,源自basic_istreambasic_ostream。因此,basic_fstream具有来自seekp的函数basic_ostream和来自seekg的函数basic_ifstream

简而言之,在您的情况下,调用seekp和seekg会执行相同的操作,因为basic_filebuf::seekpos执行的操作仅取决于basic_filebuf的开放模式。

basic_ostream<charT,traits>& seekp(pos_type pos);

效果:如果fail()!= true,则执行rdbuf() - &gt; pubseekpos(pos,ios_base :: out)。如果失败, 该函数调用setstate(failbit)(可能会抛出ios_base :: failure)。

pubseekpos调用seekpos的地方virtual,因此,调用basic_filebuf::seekpos

pos_type seekpos(pos_type sp,
ios_base::openmode which = ios_base::in | ios_base::out);

如果可能,改变文件位置以对应于存储在sp中的位置(如下所述)。 更改文件位置的步骤如下:

  1. if(om&amp; ios_base :: out)!= 0,然后更新输出序列并写入任何非移位序列;

  2. 将文件位置设置为sp;

  3. 第3。 if(om&amp; ios_base :: in)!= 0,然后更新输入序列;

    其中 om是传递给最后一次调用open()的开放模式。如果is_open()返回,则操作失败 假。

由于您使用ios_base::in函数打开文件,因此会执行2和3个惩罚。

basic_istream<charT,traits>& seekg(pos_type pos);

效果:表现为无格式输入函数(如27.7.2.3,第1段所述),但不包括 该函数首先清除eofbit,它不计算提取的字符数,也不计算 影响后续调用gcount()返回的值。构造一个岗位对象后,如果失败() != true,执行rdbuf() - &gt; pubseekpos(pos,ios_base :: in)。如果失败,函数调用 setstate(failbit)(可能会抛出ios_base :: failure)。