public member function
<istream> <iostream>

std::istream::get

单个字符 (1)
int get();istream& get (char& c);
c-string (2)
istream& get (char* s, streamsize n);istream& get (char* s, streamsize n, char delim);
stream buffer (3)
istream& get (streambuf& sb);istream& get (streambuf& sb, char delim);
获取字符
从流中提取字符,作为未格式化的输入

(1) 单个字符
从流中提取单个字符。
字符要么被返回(第一个签名),要么被设置为其参数的值(第二个签名)。
(2) C 字符串
从流中提取字符并将它们存储在 s 中作为 C 字符串,直到提取了 (n-1) 个字符或遇到了 分隔符分隔符换行符 ('\n') 或 delim(如果指定了此参数)。
如果找到了分隔符,则不会从输入序列中提取它,它将保留在原地,成为从流中提取的下一个字符(请参阅 getline 以获取丢弃分隔符的替代方法)。
即使提取了空字符串,如果 n 大于零,也会自动在写入的序列末尾附加一个空字符 ('\0')。
(3) 流缓冲区
从流中提取字符并将它们插入由流缓冲区对象 sb 控制的输出序列中,直到插入失败或在输入序列中遇到分隔符分隔符 是换行符 '\n'delim,如果指定了此参数)。
只有成功插入到 sb 的字符才从流中提取:无论是分隔符,还是最终未能插入到 sb 的字符,都不会从输入序列中提取,它们将保留在原地,成为从流中提取的下一个字符。

当函数遇到文件结尾时,也会停止提取字符。如果过早到达文件结尾(在满足上述条件之前),则函数会将 eofbit 标志设置为true。

在内部,该函数首先通过构造一个 sentry 对象(将 noskipws 设置为 true)来访问输入序列。然后(如果 good),它会像调用其成员函数 sbumpcsgetc 一样,从其关联的流缓冲区对象中提取字符,最后销毁 sentry 对象后再返回。

可以通过调用成员函数 gcount 来访问此函数成功读取并存储的字符数。

参数

c
存储提取值的字符引用。
s
指向字符数组的指针,提取的字符将作为 c 字符串存储在其中。
如果函数未提取任何字符(或提取的第一个字符是分隔符)且 n 大于零,则 s 将被设置为一个空 C 字符串。
n
要写入 s 的最大字符数(包括终止的空字符)。
如果此值小于 2,则函数不提取任何字符并设置 failbit
streamsize 是一个带符号整型。
delim
显式分隔符:提取连续字符的操作会在下一个要提取的字符与此字符相等时停止。
sb
一个 streambuf 对象,其受控输出序列用于复制字符。

返回值

第一个签名返回读取的字符,或者如果流中没有可用字符,则返回文件结尾值(EOF)(请注意,在这种情况下,failbit 标志也会被设置为true)。

所有其他签名始终返回 *this。请注意,可以检查此返回值以确定流的状态(有关详细信息,请参阅将流转换为 bool)。

错误通过修改 *内部状态标志* 来发出信号。
flagerror
eofbit函数停止提取字符,因为输入序列没有更多可用字符(已到达 文件末尾)。
failbit未写入任何字符,或者在 s 中存储了空 C 字符串。
badbit流错误(例如,当此函数捕获由内部操作抛出的异常时)。
设置为 true 时,流的完整性可能已受到影响。
一次操作可能设置多个标志。

如果操作设置了一个已通过成员 exceptions 注册的内部状态标志,则该函数将抛出一个成员类型为 failure 的异常。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// istream::get example
#include <iostream>     // std::cin, std::cout
#include <fstream>      // std::ifstream

int main () {
  char str[256];

  std::cout << "Enter the name of an existing text file: ";
  std::cin.get (str,256);    // get c-string

  std::ifstream is(str);     // open file

  char c;
  while (is.get(c))          // loop getting single characters
    std::cout << c;

  is.close();                // close file

  return 0;
}

此示例提示输入现有文本文件的名称,并使用 cin.get 同时获取单个字符和 C 字符串,将其内容打印到屏幕上。

数据竞争

修改 csb 或指向 s 的数组中的元素。
修改流对象。
对同一流对象的并发访问可能导致数据竞争,标准流对象 cin与 stdio 同步时除外(在这种情况下,不会产生数据竞争,尽管不能保证提取的字符归属于哪个线程)。

异常安全

基本保证:如果抛出异常,对象处于有效状态。
如果结果错误状态标志不是 goodbitexceptions 成员被设置为针对该状态抛出,则该函数将抛出成员类型为 failure 的异常。
由内部操作抛出的任何异常都会被该函数捕获并处理,将 badbit 设置为 true。如果在对 exceptions 的最后一次调用中设置了 badbit,则该函数将重新抛出捕获到的异常。

另见