public member function
<streambuf> <iostream>

std::basic_streambuf::sgetc

int_type sgetc();
获取当前字符
在不修改当前位置的情况下,返回受控输入序列当前位置的字符。

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

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

其行为等同于如下实现:
1
2
3
4
int_type sgetc() {
  if ( (!gptr()) || (gptr()==egptr()) ) return underflow();
  else return traits_type::to_int_type(*gptr());
}

参数



返回值

受控输入序列当前位置的字符,使用成员 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
// show file content - sgetc() 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();
    do {
      char ch = pbuf->sgetc();
      std::cout << ch;
    } while ( pbuf->snextc() != std::streambuf::traits_type::eof() );
    istr.close();
  }
  return 0;
}

此示例显示了一个文件的内容在屏幕上,使用 sgetcsnextc 的组合来读取文件。

数据竞争

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

异常安全

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

另见