命名空间
变体
操作

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

第一个重载等效于 getline(s, count, widen('\n'))

行为类似于 UnformattedInputFunction。在构造并检查哨兵对象后,从 *this 中提取字符,并将它们存储在由 s 指向的数组的连续位置中,直到发生以下任何情况(按显示顺序测试):

  1. 输入序列中出现文件结束条件。
  2. 下一个可用的字符 c 是分隔符,由 Traits::eq(c, delim) 确定。分隔符被提取(与 basic_istream::get() 不同),并计入 gcount(),但不存储。
  3. count 为非正数,或者已提取 count - 1 个字符(在这种情况下会调用 setstate(failbit))。

如果函数没有提取任何字符,则在调用 setstate() 之前,在本地错误状态中设置 failbit

无论如何,如果 count > 0,则它会将一个空字符 CharT() 存储到数组的下一个连续位置,并更新 gcount()

内容

[编辑] 注释

由于条件 #2 在条件 #3 之前进行测试,因此正好适合缓冲区的输入行不会触发 failbit

由于终止字符被计为已提取的字符,因此空输入行不会触发 failbit

[编辑] 参数

s - 指向要存储字符的字符字符串的指针
count - s 指向的字符字符串的大小
delim - 用于停止提取的分隔符。它会被提取,但不会存储。

[编辑] 返回值

*this

[编辑] 异常

failure 如果发生错误(错误状态标志不是 goodbit),并且为该状态设置了 exceptions()

如果内部操作抛出异常,则会捕获该异常,并设置 badbit。如果为 badbit 设置了 exceptions(),则会重新抛出异常。

[编辑] 示例

#include <array>
#include <iostream>
#include <sstream>
#include <vector>
 
int main()
{
    std::istringstream input("abc|def|gh");
    std::vector<std::array<char, 4>> v;
 
    // note: the following loop terminates when std::ios_base::operator bool()
    // on the stream returned from getline() returns 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++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 531 C++98 std::getline 无法处理 count 为非正数的情况
在这种情况下不会提取任何字符
不提取任何字符
不提取任何字符

[编辑] 另请参见

从 I/O 流中读取数据到字符串中
(函数模板) [编辑]
提取格式化数据
(公有成员函数) [编辑]
提取字符
(公有成员函数) [编辑]
提取字符块
(公有成员函数) [编辑]