4

私はこの奇妙なことに気づいた

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

と同じです

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

seekg同じことをseekp行い、同じ結果を引き起こしますが、ios::inフラグのみを指定しました

両方とも fstream で動作するのはなぜですか? seekpseekgfstreamの違いは何ですか?

4

1 に答える 1

6

basic_fstreamは から派生し、 はおよびbasic_iostreamから派生します。したがって、からの関数とからの関数があります。basic_istreambasic_ostreambasic_fstreamseekpbasic_ostreamseekgbasic_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. (om & ios_base::out) != 0 の場合、出力シーケンスを更新し、unshift シーケンスを書き込みます。

  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 をスローする場合があります)。

于 2012-09-08T22:05:59.483 に答える