私はこの奇妙なことに気づいた
fstream obj(filename , ios::in);
obj.seekp(7);
と同じです
fstream obj(filename , ios::in);
obj.seekg(7);
seekg
同じことをseekp
行い、同じ結果を引き起こしますが、ios::inフラグのみを指定しました
両方とも fstream で動作するのはなぜですか? seekp
とseekg
fstreamの違いは何ですか?
basic_fstream
は から派生し、 はおよびbasic_iostream
から派生します。したがって、からの関数とからの関数があります。basic_istream
basic_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()->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 に格納されている位置に対応するようにファイルの位置を変更します (後述)。ファイルの位置を変更すると、次のように実行されます。
(om & ios_base::out) != 0 の場合、出力シーケンスを更新し、unshift シーケンスを書き込みます。
ファイルの位置を 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 をスローする場合があります)。