public member function
<streambuf> <iostream>

std::basic_streambuf::sbumpc

int_type sbumpc();
获取当前字符并前进到下一个位置
返回受控输入序列当前位置的字符,并将位置指示符前进到下一个字符。

请注意,虽然相似,但以下成员函数的行为有所不同
成员函数,逐个字符打印字符串的内容描述
sgetc()返回当前位置的字符。
sbumpc()返回当前位置的字符,并将当前位置推进到下一个字符。
snextc()将当前位置推进到下一个字符,并返回该下一个字符。

在内部,如果get指针gptr)没有可用的读取位置,则函数会调用虚保护成员 uflow。否则,函数直接使用get指针gptr),而不调用虚成员函数。

其行为等同于如下实现:
1
2
3
4
5
int_type sbumpc() {
  if ( (!gptr()) || (gptr()==egptr()) ) return uflow();
  gbump(1);
  return traits_type::to_int_type(gptr()[-1]);
}

返回值

调用前,受控输入序列当前位置的字符,使用成员 traits_type::to_int_type 转换为 int_type 类型的值。
如果受控输入序列中没有更多字符可供读取,则函数返回文件结束值(traits_type::eof())。
成员类型int_type是能够表示任何字符值或特殊*文件结束*符的整型。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// show file content - sbumpc() example
#include <iostream>     // std::cout, std::streambuf
#include <fstream>      // std::ifstream

int main () {
  std::ifstream istr ("test.txt");
  if (istr) {
    std::streambuf * pbuf = istr.rdbuf();
    while ( pbuf->sgetc() != std::streambuf::traits_type::eof() )
    {
      char ch = pbuf->sbumpc();
      std::cout << ch;
    }
    istr.close();
  }
  return 0;
}

此示例显示了文件内容在屏幕上,使用了 sgetcsbumpc 的组合来顺序读取输入文件。

数据竞争

修改*流缓冲区*对象。
同时访问同一*流缓冲区*对象可能会导致数据竞争。

异常安全

基本保证:如果抛出异常,则流缓冲区处于有效状态(这也适用于标准派生类)。

另见