命名空间
变体
操作

std::getline

来自 cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
成员函数
元素访问
迭代器
容量
修饰符
搜索
操作
常量
非成员函数
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)
字面量
辅助类
推断指南 (C++17)

 
定义在头文件 <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()
{
    // greet the user
    std::string name;
    std::cout << "What is your name? ";
    std::getline(std::cin, name);
    std::cout << "Hello " << name << ", nice to meet you.\n";
 
    // read file line by line
    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";
 
    // 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';
}

可能的输出

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

[编辑] 缺陷报告

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

DR 应用于 已发布的行为 正确行为
LWG 91 C++98 getline 的行为不像非格式化输入函数 行为类似于非格式化输入函数

[编辑] 另请参阅

提取字符直到找到给定字符
(std::basic_istream<CharT,Traits> 的公有成员函数) [编辑]