用fstream寻找和寻求

Moh*_*bil 4 c++ fstream

我注意到这个奇怪的事情

fstream obj(filename , ios::in);
obj.seekp(7);
Run Code Online (Sandbox Code Playgroud)

是相同的

fstream obj(filename , ios::in);
obj.seekg(7);
Run Code Online (Sandbox Code Playgroud)

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

为什么他们都与fstream合作?和之间有什么区别seekpseekg使用fstream的?

For*_*veR 5

basic_fstream衍生自basic_iostream其衍生自basic_istreambasic_ostream.因此,basic_fstream具有功能seekpbasic_ostream和功能seekgbasic_ifstream.

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

basic_ostream<charT,traits>& seekp(pos_type pos);
Run Code Online (Sandbox Code Playgroud)

效果:如果fail()!= true,则执行rdbuf() - > 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

由于你用ios_base::in函数打开文件做2和3个puncts.

basic_istream<charT,traits>& seekg(pos_type pos);
Run Code Online (Sandbox Code Playgroud)

效果:作为无格式输入函数(如27.7.2.3,第1段中所述),除了函数首先清除eofbit,它不计算提取的字符数,并且它不会影响后续调用返回的值. gcount的().构造一个sentry对象后,如果fail()!= true,则执行rdbuf() - > pubseekpos(pos,ios_base :: in).如果失败,该函数调用setstate(failbit)(可能会抛出ios_base :: failure).