public member function
<istream> <iostream>

std::istream::getline

istream& getline (char* s, streamsize n );istream& getline (char* s, streamsize n, char delim );
获取行
从流中提取字符作为未格式化输入,并将它们存储在 s 中作为 C 字符串,直到提取的字符是分隔符,或者 n 个字符已写入 s (包括终止的空字符)。

对于第一种形式,分隔符换行符 ('\n'),对于第二种形式,它是 delim:当在输入序列中找到它时,它会从输入序列中提取,但会被丢弃并且不会写入 s

如果到达文件尾,该函数也会停止提取字符。如果过早到达文件尾 (在写入 n 个字符或找到 delim 之前),则该函数会将 eofbit 标志设置为 true。

如果函数未提取任何字符,或者一旦写入了 n-1 个字符后未找到分隔符,则 failbit 标志会被设置。请注意,如果输入序列中紧跟这 n-1 个字符的字符正好是分隔符,它也会被提取,并且 failbit 标志不会被设置 (提取的序列正好是 n 个字符长)。

即使提取了一个空字符串,如果 n 大于零,一个空字符 ('\0') 也会自动附加到写入的序列中。

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

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

此函数已针对 string 对象在头文件 <string> 中进行了重载:请参阅 getline(string)

参数

s
指向字符数组的指针,提取的字符将作为 c 字符串存储在其中。
n
要写入 s 的字符的最大数量 (包括终止的空字符)。
如果函数因达到此限制而停止读取,而未找到分隔符,则会设置 failbit 内部标志。
streamsize 是一个带符号整型。
delim
显式分隔符:提取连续字符的操作会一直进行,直到下一个要提取的字符与此字符相等为止。

返回值

istream 对象 (*this)。

错误通过修改 *内部状态标志* 来发出信号。
flagerror
eofbit函数停止提取字符,因为输入序列没有更多可用字符(已到达 文件末尾)。
failbit要么未找到分隔符,要么根本没有提取任何字符 (因为文件尾位于第一个字符之前,或者因为 sentry 的构造失败)。
badbit流错误(例如,当此函数捕获由内部操作抛出的异常时)。
当设置为 true 时,流的完整性可能已受到影响。
一次操作可以设置多个标志。

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

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// istream::getline example
#include <iostream>     // std::cin, std::cout

int main () {
  char name[256], title[256];

  std::cout << "Please, enter your name: ";
  std::cin.getline (name,256);

  std::cout << "Please, enter your favourite movie: ";
  std::cin.getline (title,256);

  std::cout << name << "'s favourite movie is " << title;

  return 0;
}

此示例说明了如何从标准输入流 (cin) 获取行。

数据竞争

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

异常安全

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

另见