std::basic_filebuf<CharT,Traits>::seekoff
protected: virtual pos_type seekoff( off_type off, | ||
可能であれば、ファイルポインタの位置を先頭、終端、またはファイルの現在位置 (dir
の値によります) からちょうど文字 off
個に対応する位置に設定します。
紐付けられているファイルが開いていない (is_open()==false) 場合は、直ちに失敗します。
マルチバイト文字エンコーディングが状態依存 (codecvt::encoding() が -1 を返した) または可変長 (codecvt::encoding()
が 0 を返した) であり、オフセット off
が 0 でない場合は、直ちに失敗します。 この関数は文字 off
個に対応するバイト数を決定することができません。
dir
が std::basic_ios::cur でないかオフセット off
が 0 でなく、この filebuf オブジェクトに対して最も最近行われた操作が出力であった (つまり、 put バッファが空でないか、最も最近呼ばれた関数が overflow() であった) 場合は、必要なシフト解除シーケンスを決定するために std::codecvt::unshift を呼び、そのシーケンスを overflow() を呼ぶことによってファイルに書き込みます。
その後、引数 dir
を int 型の値 whence
に以下のように変換します。
dir の値 | whence の値 |
std::basic_ios::beg | SEEK_SET |
std::basic_ios::end | SEEK_END |
std::basic_ios::cur | SEEK_CUR |
その後、文字エンコーディングが固定幅 (codecvt::encoding()
が何らかの正の値 width
を返す) の場合は、 std::fseek(file, width*off, whence) によって行われたかのようにファイルポインタを移動させます。
そうでなければ、 std::fseek(file, 0, whence) によって行われたかのようにファイルポインタを移動させます。
std::basic_filebuf
はファイル位置を1個しか維持管理しないため、基底クラスの関数シグネチャによって要求される openmode
引数は、通常、無視されます。
目次 |
[編集]引数
off | - | 位置指示子を設定する相対位置 | ||||||||
dir | - | 相対オフセットを適用するベースの位置を定義します。 以下の定数のいずれかを指定できます。
| ||||||||
which | - | 入力と出力のどちらに影響を与えるかを定義します。 以下の定数のいずれかまたは組み合わせを指定できます。
|
[編集]戻り値
結果のファイル位置を格納する pos_type 型の新たに構築されたオブジェクト、または失敗した場合は pos_type(off_type(-1))。
[編集]ノート
seekoff()
は std::basic_streambuf::pubseekoff によって呼ばれ、それは std::basic_istream::seekg、 std::basic_ostream::seekp、 std::basic_istream::tellg および std::basic_ostream::tellp によって呼ばれます。
[編集]例
#include <iostream>#include <fstream>#include <locale>int main(){// prepare a 10-byte file holding 4 characters in UTF8std::ofstream("text.txt")<< u8"z\u00df\u6c34\U0001d10b";// or u8"zß水𝄋"// or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b"; // open using a non-converting encodingstd::ifstream f1("text.txt");std::cout<<"f1's locale's encoding() returns "<<std::use_facet<std::codecvt<char, char, std::mbstate_t>>(f1.getloc()).encoding()<<'\n'<<"pubseekoff(3, beg) returns "<< f1.rdbuf()->pubseekoff(3, std::ios_base::beg)<<'\n'<<"pubseekoff(0, end) returns "<< f1.rdbuf()->pubseekoff(0, std::ios_base::end)<<'\n';; // open using UTF-8std::wifstream f2("text.txt"); f2.imbue(std::locale("en_US.UTF-8"));std::cout<<"f2's locale's encoding() returns "<<std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(f2.getloc()).encoding()<<'\n'<<"pubseekoff(3, beg) returns "<< f2.rdbuf()->pubseekoff(3, std::ios_base::beg)<<'\n'<<"pubseekoff(0, end) returns "<< f2.rdbuf()->pubseekoff(0, std::ios_base::end)<<'\n'; }
出力:
f1's locale's encoding() returns 1 pubseekoff(3, beg) returns 3 pubseekoff(0, end) returns 10 f2's locale's encoding() returns 0 pubseekoff(3, beg) returns -1 pubseekoff(0, end) returns 10
[編集]関連項目
seekoff() を呼びます ( std::basic_streambuf<CharT,Traits> のパブリックメンバ関数) | |
[仮想] | 絶対位置を使用してファイル位置を再設定します (仮想プロテクテッドメンバ関数) |
ファイル位置指示子をファイル内の指定された位置に移動させます (関数) |