std:: getline
|
定义于头文件
<string>
|
||
|
template
<
class
CharT,
class
Traits,
class
Allocator
>
std::
basic_istream
<
CharT, Traits
>
&
|
(1) | |
|
template
<
class
CharT,
class
Traits,
class
Allocator
>
std::
basic_istream
<
CharT, Traits
>
&
|
(2) | (C++11 起) |
|
template
<
class
CharT,
class
Traits,
class
Allocator
>
std::
basic_istream
<
CharT, Traits
>
&
|
(3) | |
|
template
<
class
CharT,
class
Traits,
class
Allocator
>
std::
basic_istream
<
CharT, Traits
>
&
|
(4) | (C++11 起) |
getline
从输入流中读取字符并将其存入字符串:
目录 |
参数
| input | - | 获取数据的流 |
| str | - | 存放数据的字符串 |
| delim | - | 分隔符字符 |
返回值
input
注释
当读取以空白分隔的输入时(例如
int
n
;
std::
cin
>>
n
;
),后续的所有空白字符(包括换行符)都会保留在输入流中。当切换到面向行的输入时,使用
getline
获取的第一行内容将仅为这些空白字符。若此行为不符合预期,可能的解决方案包括:
-
对
getline进行显式的多余初始调用。 - 使用 std:: cin >> std:: ws 移除连续空白符。
- 使用 cin. ignore ( std:: numeric_limits < std:: streamsize > :: max ( ) , ' \n ' ) ; 忽略输入行中所有剩余字符。
示例
以下示例演示了如何使用
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>
的公开成员函数)
|