# std::strstreambuf::underflow

< cpp‎ | io‎ | strstreambuf

protected: virtual int_type underflow(); |  |

从缓冲区的获取区读取下个字符。

若输入序列拥有可用读位置（ gptr() < egptr() ），则返回 (unsigned char)(*gptr()) 。

否则，若 pptr() 非空且 pptr() > egptr() （存在放置区，且它位于获取区之后），则以增加 egptr() 到 gptr() 和 pptr() 间的某个值扩展获取区的结尾，以包含最近写入到放置区中的字符，然后返回 (unsigned char)(*gptr()) 。

否则，返回 EOF 以指示失败。

### 参数

（无）

### 返回值

成功时为获取区中下个字符 (unsigned char)(*gptr()) ，失败时为 EOF 。

### 示例

    #include <strstream>
    #include <iostream>

    struct mybuf : std::strstreambuf
    {
        int_type overflow(int_type c)
        {
            std::cout << "Before overflow(): size of the get area is " << egptr()-eback()
                      << " size of the put area is " << epptr()-pbase() << '\n';
            int_type rc = std::strstreambuf::overflow(c);
            std::cout << "After overflow(): size of the get area is " << egptr()-eback()
                      << " size of the put area is " << epptr()-pbase() << '\n';
            return rc;
        }

        int_type underflow()
        {
            std::cout << "Before underflow(): size of the get area is " << egptr()-eback()
                      << " size of the put area is " << epptr()-pbase() << '\n';
            int_type ch = std::strstreambuf::underflow();
            std::cout << "After underflow(): size of the get area is " << egptr()-eback()
                      << " size of the put area is " << epptr()-pbase() << '\n';
            if (ch == EOF) {
                std::cout << "underflow() returns EOF\n";
            } else {
                std::cout << "underflow() returns '" << char(ch) << "'\n";
            }
            return ch;
        }
    };

    int main()
    {
        mybuf sbuf; // 读写动态 strstreambuf
        std::iostream stream(&sbuf);

        int n;
        stream >> n;
        stream.clear();
        stream << "123";
        stream >> n;
        std::cout << n << '\n';
    }

可能的输出：

    Before underflow(): size of the get area is 0 size of the put area is 0
    After underflow(): size of the get area is 0 size of the put area is 0
    underflow() returns EOF
    Before overflow(): size of the get area is 0 size of the put area is 0
    After overflow(): size of the get area is 0 size of the put area is 32
    Before underflow(): size of the get area is 0 size of the put area is 32
    After underflow(): size of the get area is 3 size of the put area is 32
    underflow() returns '1'
    Before underflow(): size of the get area is 3 size of the put area is 32
    After underflow(): size of the get area is 3 size of the put area is 32
    underflow() returns EOF
    123

### 参阅

underflow [虚] | 从关联输入序列读取字符到获取区 (`std::basic_streambuf<CharT,Traits>` 的虚受保护成员函数)
underflow [虚] | 返回输入序列中可用的下一字符 (`std::basic_stringbuf<CharT,Traits,Allocator>` 的虚受保护成员函数)
underflow [虚] | 从关联文件读取 (`std::basic_filebuf<CharT,Traits>` 的虚受保护成员函数)
sgetc | 从输入序列读取一个字符，而不令序列前进 (`std::basic_streambuf<CharT,Traits>` 的公开成员函数)
get | 从流中读并取走（移除类似指针向下一个元素移动）一个字符 (`std::basic_istream<CharT,Traits>` 的公开成员函数)