basic_ostream<CharT, Traits>& seekp(pos_type pos); // (1)
basic_ostream<CharT, Traits>& seekp(off_type off, seekdir dir); // (2)
概要
ストリームバッファに対し、書き込み位置の移動を指示する。
seekpは、seek putの略称。「書き込み用の位置の移動」を意味する。
効果
- (1) :
- 出力ストリームの書き込み位置を
posに設定する。 - 設定に失敗した場合、
setstate(failbit)を呼び出す。
- 出力ストリームの書き込み位置を
- (2) :
- 出力ストリームの書き込み位置を
dirを基準として相対位置offに設定する。 - 設定に失敗した場合の動作は、以下のようにバージョンによって異なる。
- C++98 : ストリームの状態は変化しない。
- C++14 :
setstate(failbit)を呼び出す。
- 出力ストリームの書き込み位置を
戻り値
*this
備考
- 本関数の処理内容は以下の通り。
sentryオブジェクトを構築する(C++11 以降のみ)。- 与えられた実引数により、以下のいずれかを実行する。
- (1)
rdbuf()->pubseekpos(pos, ios_base::out) - (2)
rdbuf()->pubseekoff(off, dir, ios_base::out)
- (1)
- 処理に失敗した場合(上記の戻り値が
-1だった場合)、setstate(failbit)を呼び出す。
- C++14より前の(2)には、この3番目の手順が規定されていなかった。そのため、位置の移動に失敗しても
fail()はfalseのままとなり、呼び出し側は失敗を検知できなかった。移動できなかったことに気付かないまま出力を続けると、意図しない位置へ書き込んでしまう。
os.seekp(-100, std::ios_base::cur); // シーク不能なストリームでは失敗する // C++98 : 失敗してもfail()はfalseのままであり、このifは実行されない // C++14 : 失敗するとfailbitが設定され、このifが実行される if (os.fail()) { // 移動に失敗したことを検知できる }
例
以下は、off_type と seekdir を使用する例。
pos_type のみを引数に取るオーバーロードの例は、tellp を参照。
#include <iostream>
#include <sstream>
int main() {
std::ostringstream os;
os << "12345";
os.seekp(-2, std::ios_base::cur);
os << "ABC";
std::cout << os.str() << std::endl;
}
出力
123ABC
実装例
basic_ostream<CharT, Traits>& seekp(pos_type pos) {
sentry s(*this);
if (!this->fail()) {
if (this->rdbuf()->pubseekpos(pos, ios_base::out) == pos_type(-1)) {
this->setstate(failbit);
}
}
return *this;
}
basic_ostream<CharT, Traits>& seekp(off_type off, seekdir dir) {
sentry s(*this);
if (!this->fail()) {
if (this->rdbuf()->pubseekoff(off, dir, ios_base::out) == pos_type(-1)) {
this->setstate(failbit); // C++14から
}
}
return *this;
}
バージョン
言語
- C++98
参照
basic_ostream::tellpbasic_streambuf::pubseekposbasic_streambuf::pubseekoff- LWG Issue 2341. Inconsistency between
basic_ostream::seekp(pos)andbasic_ostream::seekp(off, dir)- C++14で、(2)の相対位置指定版についても、位置の移動に失敗した場合に
setstate(failbit)を呼び出すことが規定された。(1)の絶対位置指定版のみに規定があり、(2)では失敗を検知する手段がなかったため
- C++14で、(2)の相対位置指定版についても、位置の移動に失敗した場合に