Namespaces
Variants

std:: getline

From cppreference.net
std::basic_string
定义于头文件 <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 ) ;
(2) (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 ) ;
(3)
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 ) ;
(4) (C++11 起)

getline 从输入流中读取字符并将其存入字符串:

1,2) 行为类似 UnformattedInputFunction ,但 input. gcount ( ) 不受影响。在构造并检查哨兵对象后,执行以下操作:
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 并返回。
3,4) getline ( input, str, input. widen ( ' \n ' ) ) 相同,即默认分隔符为换行符。

目录

参数

input - 获取数据的流
str - 存放数据的字符串
delim - 分隔符字符

返回值

input

注释

当读取以空白分隔的输入时(例如 int n ; std:: cin >> n ; ),后续的所有空白字符(包括换行符)都会保留在输入流中。当切换到面向行的输入时,使用 getline 获取的第一行内容将仅为这些空白字符。若此行为不符合预期,可能的解决方案包括:

示例

以下示例演示了如何使用 getline 函数读取用户输入,并通过 delim 参数逐行处理流或按行部分处理。

#include <iostream>
#include <sstream>
#include <string>
int main()
{
    // 问候用户
    std::string name;
    std::cout << "What is your name? ";
    std::getline(std::cin, name);
    std::cout << "Hello " << name << ", nice to meet you.\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 << "\nThe sum is " << sum << ".\n\n";
    // 使用分隔符读取行部分
    std::istringstream input2;
    input2.str("a;b;c;d");
    for (std::string line; std::getline(input2, line, ';');)
        std::cout << line << '\n';
}

可能的输出:

What is your name? John Q. Public
Hello John Q. Public, nice to meet you.
The sum is 28.
a
b
c
d

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 适用标准 发布时行为 正确行为
LWG 91 C++98 getline 未表现为无格式输入函数 表现为无格式输入函数

参见

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