名前空間
変種
操作

std::basic_filebuf::seekpos

提供: cppreference.com
< cpp‎ | io‎ | basic filebuf
 
 
 
 
protected:

virtual pos_type seekpos( pos_type sp,

                          std::ios_base::openmode which = std::ios_base::in | std::ios_base::out );

可能であれば、ファイルポインタの位置を sp によって表される位置に設定します。

紐付けられているファイルが開いていない (is_open()==false) 場合は、直ちに失敗します。

ファイルが書き込み用に開かれている場合は、 overflow() を使用して、まず put 領域および現在設定されているロケールによって要求されるあらゆるシフト解除シーケンスを書き込みます。

その後、 std::fsetpos() を呼んだかのように、ファイルポインタの位置を再設定します。

ファイルが読み込み用に開かれている場合は、必要に応じて get 領域を更新します。

sp が同じファイルに対する seekoff() または seekpos() によって取得されたものでない場合、動作は未定義です。

目次

[編集] 引数

sp - 同じファイルに対して以前呼ばれた seekoff() または seekpos() によって取得されたファイル位置
which - 入力シーケンスと出力シーケンスのどちらに影響を与えるかを定義します。 以下の定数のいずれかまたは組み合わせを指定できます。
定数 説明
in 入力シーケンスに影響を与えます
out 出力シーケンスに影響を与えます

[編集] 戻り値

成功した場合は sp、失敗した場合は pos_type(off_type(-1))

[編集] ノート

seekpos()std::basic_streambuf::pubseekpos() によって呼ばれ、それは std::basic_istream::seekg() および std::basic_ostream::seekp() の引数1個のバージョンによって呼ばれます。

多くの処理系では、 seekpos() では get 領域を更新せず、次の sgetc() によって呼ばれる underflow() に移譲します。

[編集]

いくつかの処理系では、 get 領域は seekpos() によって空にされ、効果を観察するためには2つめの underflow() が必要です。

#include <fstream>
#include <iostream>
 
struct mybuf : std::filebuf
{
    pos_type seekpos(pos_type sp, std::ios_base::openmode which) {
         std::cout << "Before seekpos(" << sp << "), size of the get area is "
                   << egptr()-eback() << " with "
                   << egptr()-gptr() << " read positions available\n";
         pos_type rc = std::filebuf::seekpos(sp, which);
         std::cout << "seekpos() returns " << rc << ".\nAfter the call, "
                   << "size of the get area is "
                   << egptr()-eback() << " with "
                   << egptr()-gptr() << " read positions available\n";
// uncomment if get area is emptied by seekpos()
//         std::filebuf::underflow();
//         std::cout << "after forced underflow(), size of the get area is "
//                   << egptr()-eback() << " with "
//                   << egptr()-gptr() << " read positions available\n";
        return rc;
    }
};
 
int main()
{
    mybuf buf;
    buf.open("test.txt", std::ios_base::in);
    std::istream stream(&buf);
    stream.get(); // read one char to force underflow()
    stream.seekg(2);
}

出力例:

Before seekpos(2), size of the get area is 110 with 109 read positions available
seekpos() returns 2.
After the call, size of the get area is 110 with 108 read positions available

[編集] 関連項目

seekpos() を呼びます
(std::basic_streambufのパブリックメンバ関数) [edit]
[仮想]
相対位置を使用してファイル位置を再設定します
(仮想プロテクテッドメンバ関数) [edit]
ファイル位置指示子をファイル内の指定された位置に移動させます
(関数) [edit]