std::basic_istream<CharT,Traits>::getline

来自cppreference.com
< cpp‎ | io‎ | basic istream
 
 
 
 
basic_istream& getline( char_type* s, std::streamsize count );
(1)
basic_istream& getline( char_type* s, std::streamsize count, char_type delim );
(2)

从流提取字符,直至行尾或指定的分隔符 delim

重载 (1) 等价于 getline(s, count, widen('\n'))

表现为无格式输入函数 (UnformattedInputFunction) 。构造并检查 sentry 对象后,从 *this 提取字符并存储它们于首元素为 s 所指向的数组的相继位置,直至出现任何下列条件(按顺序检测):

  • 输入序列中出现文件尾条件。
  • 下个可用字符 c 是以 Traits::eq(c, delim) 确定的分隔符。提取该分隔符(与 basic_istream::get() 不同)并计入 gcount() ,但不存储它。
  • count 非正,或者已经提取了 count - 1 个字符(此时会调用 setstate(failbit))。

如果函数没有提取字符,那么在调用 setstate() 前就会在局部错误状态中设置 failbit

任何情况下,如果 count > 0,那么它会存储空字符 CharT() 到数组的下个相继位置,并更新 gcount()

注意

因为条件 2 在条件 3 前测试,所以准确适合缓冲区的输入行不会触发 failbit

因为终止字符计为提取的字符,所以空输入行不会触发 failbit

参数

s - 指向要存储字符到的字符串的指针
count - s 指向的字符串的大小
delim - 提取所终止于的分隔字符。提取但不存储它。

返回值

*this

异常

在出现错误(错误状态标志不是 goodbit)并且将 exceptions() 设置为对该状态抛出时会抛出 failure

如果内部操作抛出异常,那么捕获它并设置 badbit。如果对 badbit 设置了 exceptions(),那么就会重抛该异常。

示例

#include <iostream>
#include <sstream>
#include <vector>
#include <array>
 
int main()
{
    std::istringstream input("abc|def|gh");
    std::vector<std::array<char, 4>> v;
 
    // 注意:下列循环在从  getline() 返回的流上的 
    // std::ios_base::operator bool() 返回 false 时终止
    for (std::array<char, 4> a; input.getline(&a[0], 4, '|');)
        v.push_back(a);
 
    for (auto& a : v)
        std::cout << &a[0] << '\n';
}

输出:

abc
def
gh

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 531 C++98 std::getline 无法处理 count 非正的情况 此时不会提取字符

参阅

从输入/输出流读取数据到字符串
(函数模板)
提取带格式数据
(公开成员函数)
提取字符
(公开成员函数)
提取一块字符
(公开成员函数)