public member function
<streambuf> <iostream>

std::basic_streambuf::sgetn

streamsize sgetn (char_type* s, streamsize n);
获取字符序列
调用受保护的虚成员函数 xsgetn,其参数与 sn 相同。

basic_streambuf 中的 xsgetn 的默认定义会从 *受控输入序列* 中检索字符,并将它们存储在 s 指向的数组中,直到提取了 n 个字符或到达序列末尾为止。

参数

s
指向要复制字符序列的数组的指针。
成员类型 char_type流缓冲区(第一个类模板参数)中字符的类型。
n
要检索的最大字符数。
这应该是一个非负值。
streamsize 是一个带符号整型。

返回值

复制的字符数。
streamsize 是一个带符号整型。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// read a file into buffer - sgetn() example
#include <iostream>     // std::cout, std::streambuf, std::streamsize
#include <fstream>      // std::ifstream

int main () {
  char* contents;
  std::ifstream istr ("test.txt");

  if (istr) {
    std::streambuf * pbuf = istr.rdbuf();
    std::streamsize size = pbuf->pubseekoff(0,istr.end);
    pbuf->pubseekoff(0,istr.beg);       // rewind
    contents = new char [size];
    pbuf->sgetn (contents,size);
    istr.close();
    std::cout.write (contents,size);
  }
  return 0;
}

此示例使用其 *流缓冲区* 将整个文件读入缓冲区,然后将其写入标准输出。

数据竞争

修改 s 指向的数组中最多前 n 个字符。
修改*流缓冲区*对象。
对同一数组或同一流缓冲区对象的并发访问可能会引入数据争用。

异常安全

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

无效参数会导致未定义行为

另见