4

我注意到了这个奇怪的事情

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

是相同的

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

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

为什么他们都使用 fstream?seekpfstream和fstream有什么区别seekg

4

1 回答 1

6

basic_fstream派生自basic_iostream派生自basic_istreambasic_ostream。因此,basic_fstream具有函数seekpfrombasic_ostream和函数seekgfrom basic_ifstream

简而言之,在您的情况下,对 seekp 和 seekg 的调用执行相同的操作,因为执行的操作仅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(即virtual调用basic_filebuf::seekpos

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

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

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

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

3. if (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,它不计算提取的字符数,也不影响后续调用返回的值计数()。构建哨兵对象后,如果fail() != true,则执行rdbuf()->pubseekpos(pos, ios_base::in)。在失败的情况下,该函数调用 setstate(failbit) (可能会抛出 ios_base::failure)。

于 2012-09-08T22:05:59.483 回答