std::getline

来自cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
成员函数
元素访问
迭代器
容量
操作
搜索
常量
推导指引 (C++17)
非成员函数
I/O
getline
比较
(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20)
数值转换
(C++11)(C++11)(C++11)
(C++11)(C++11)    
(C++11)(C++11)(C++11)
(C++11)
(C++11)
辅助类
 
在标头 <string> 定义
template< class CharT, class Traits, class Allocator >

std::basic_istream<CharT, Traits>&
getline( std::basic_istream<CharT, Traits>& input,

         std::basic_string<CharT, Traits, Allocator>& str, CharT delim );
(1)
template< class CharT, class Traits, class Allocator >

std::basic_istream<CharT, Traits>&
getline( std::basic_istream<CharT, Traits>&& input,

         std::basic_string<CharT, Traits, Allocator>& str, CharT delim );
(1) (C++11 起)
template< class CharT, class Traits, class Allocator >

std::basic_istream<CharT, Traits>&
getline( std::basic_istream<CharT, Traits>& input,

         std::basic_string<CharT, Traits, Allocator>& str );
(2)
template< class CharT, class Traits, class Allocator >

std::basic_istream<CharT, Traits>&
getline( std::basic_istream<CharT, Traits>&& input,

         std::basic_string<CharT, Traits, Allocator>& str );
(2) (C++11 起)

getline 从输入流读取字符并将它们放进字符串:

1) 表现为无格式输入函数 (UnformattedInputFunction) ,除了不影响 input.gcount()。构造并检查 sentry 对象后,进行下列操作:
1) 调用 str.erase()
2)input 提取字符并后附它们到 str,直到满足下列任一条件(按顺序检查):
a) input 上的文件尾条件,此时 getline 会设置 eofbit
b) 下个可用输入字符是 delim,以 Traits::eq(c, delim) 进行检测,此时从 input 提取分隔字符,但不后附它到 str
c) 已经存储了 str.max_size() 个字符,此时 getline 设置 failbit 并返回。
3) 如果由于任何原因没有提取字符(不包括一开始提取到分隔符的情况),那么 getline 设置 failbit 并返回。
2)getline(input, str, input.widen('\n')),即默认分隔符是换行符。

参数

input - 获取数据来源的流
str - 放置数据的目标字符串
delim - 分隔字符

返回值

input

注解

消耗空白符分隔的输入(例如 int n; std::cin >> n; )时,任何后随的空白符,包括换行符都会被留在流中。然后当切换到面向行的输入时,以 getline 取得的首行只会是该空白符。多数情况下这是不想要的行为,可能的解法包括:

示例

下列代码演示如何用 getline 函数读取用户输入以及如何逐行处理文件。

#include <string>
#include <iostream>
#include <sstream>
 
int main()
{
    // 问候用户
    std::string name;
    std::cout << "你的名字是?";
    std::getline(std::cin, name);
    std::cout << "你好 " << name << ",很高兴见到你。\n";
 
    // 逐行读文件
    std::istringstream input;
    input.str("1\n2\n3\n4\n5\n6\n7\n");
    int sum = 0;
    for (std::string line; std::getline(input, line); )
        sum += std::stoi(line);
    std::cout << "\n总和是 " << sum << "。\n";
 
    // use separator to read parts of the line
    std::istringstream input2;
    input2.str("a;b;c;d");
    for (std::string line; std::getline(input2, line, ';'); )
        std::cout << line << '\n';
}

可能的输出:

你的名字是?John Q. Public
你好 John Q. Public,很高兴见到你。
 
总和是 28。
 
a
b
c
d

缺陷报告

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

缺陷报告 应用于 出版时的行为 正确行为
LWG 91 C++98 getline 没有表现为无格式输入函数 表现为有格式输入函数

参阅

持续提取字符,直到找到给定字符
(std::basic_istream<CharT,Traits> 的公开成员函数)