fstream中的seekp和seekg用法解析

4
我发现了这个奇怪的事情。
fstream obj(filename , ios::in);
obj.seekp(7);

即相同于

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

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

为什么它们都可以在 fstream 中使用?seekpseekg 在 fstream 中有什么区别?

1个回答

6

basic_fstream继承自basic_iostream,后者又继承自basic_istreambasic_ostream。因此,basic_fstream具有从basic_ostream继承的函数seekp和从basic_ifstream继承的函数seekg

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

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

作用:如果 fail() != true,则执行 rdbuf()->pubseekpos(pos, ios_base::out)。如果失败,该函数将调用 setstate(failbit)(可能会抛出 ios_base::failure 异常)。

pubseekpos 调用 seekpos(它是虚拟的,因此调用 basic_filebuf::seekpos)。

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

改变文件位置,如可能的话,以使其符合存储在sp中的位置(如下所述)。改变文件位置的执行方式如下:
1. 如果(om & ios_base::out) != 0,则更新输出序列并写入任何未移位的序列;
2. 将文件位置设置为sp;
3. 如果(om & ios_base::in) != 0,则更新输入序列。
其中,om是传递给上一次open()调用的打开模式。如果is_open()返回false,则操作失败。
由于您使用了ios_base::in函数打开文件,因此执行第2步和第3步。
basic_istream<charT,traits>& seekg(pos_type pos);

作用:与未格式化的输入函数(如27.7.2.3第1段所述)行为相同,但是该函数首先清除eofbit,不计算提取的字符数,并且不会影响后续调用gcount()返回的值。在构造一个sentry对象之后,如果fail() != true,则执行rdbuf()->pubseekpos(pos, ios_base::in)。如果失败,函数将调用setstate(failbit)(可能引发ios_base::failure异常)。


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