名前空間
変種
操作

std::basic_streambuf::underflow

提供: cppreference.com
< cpp‎ | io‎ | basic streambuf
 
 
 
 
virtual int_type underflow();

入力領域へのポインタを更新 (必要であれば) し、入力シーケンスから追加のデータを読み込む (適用可能であれば) ことによって、少なくとも1文字が入力領域で利用可能であることを保証します。 成功した場合は (Traits::to_int_type(c)int_type に変換された) その文字の値、失敗した場合は Traits::eof() を返します。

この関数は新たにロードされたデータ (もしあれば) の位置を定義するために gptregptr および eback を更新するかもしれません。 失敗の場合、この関数は gptr() == nullptr または gptr() == egptr のいずれかを保証します。

この関数の基底クラスのバージョンは何もしません。 派生クラスは使い切った場合に get 領域を更新できるようにこの関数をオーバーライドするかもしれません。

目次

[編集] 引数

(なし)

[編集] 戻り値

成功した場合は呼び出しの後の get ポインタの指す文字の値、そうでなければ Traits::eof()

この関数の基底クラスのバージョンは traits::eof() を返します。

[編集] ノート

std::streambuf のパブリック関数はこの関数を gptr() == nullptr または gptr() >= egptr() の場合にだけ呼びます。

[編集]

#include <iostream>
#include <sstream>
 
class null_filter_buf : public std::streambuf {
    std::streambuf* src;
    char ch; // single-byte buffer
protected:
    int underflow() {
        while( (ch= src->sbumpc()) == '\0') ; // skip zeroes
        setg(&ch, &ch, &ch+1); // make one read position available
        return ch; // may return EOF
    }
public:
    null_filter_buf(std::streambuf* buf) : src(buf) {
        setg(&ch, &ch+1, &ch+1); // buffer is initially full
    }
};
 
void filtered_read(std::istream& in)
{
    std::streambuf* orig = in.rdbuf();
    null_filter_buf buf(orig);
    in.rdbuf(&buf);
    for(char c; in.get(c); )
            std::cout << c;
    in.rdbuf(orig);
}
 
int main()
{
    char a[] = "This i\0s \0an e\0\0\0xample";
    std::istringstream in(std::string(std::begin(a), std::end(a)));
    filtered_read(in);
}

出力:

This is an example

[編集] 関連項目

[仮想]
紐付けられている入力シーケンスから get 領域に文字を読み込み、次ポインタを進めます
(仮想プロテクテッドメンバ関数) [edit]
[仮想]
put 領域から紐付けられている出力シーケンスに文字を書き込みます
(仮想プロテクテッドメンバ関数) [edit]
[仮想]
紐付けられているファイルから読み込みます
(std::basic_filebufの仮想プロテクテッドメンバ関数) [edit]
[仮想]
入力シーケンスの次の利用可能な文字を返します
(std::basic_stringbufの仮想プロテクテッドメンバ関数) [edit]
[仮想]
次ポインタを進めずに入力シーケンスから文字を読み込みます
(std::strstreambufの仮想プロテクテッドメンバ関数) [edit]