getline 模板函数
将字符串从输入流中一行一行地提取出来。
// (1) delimiter as parameter template<class CharType, class Traits, class Allocator> basic_istream<CharType, Traits>& getline( basic_istream<CharType, Traits>& is, basic_string<CharType, Traits, Allocator>& str, CharType delim); template<class CharType, class Traits, class Allocator> basic_istream<CharType, Traits>& getline( basic_istream<CharType, Traits>&& is, basic_string<CharType, Traits, Allocator>& str, const CharType delim); // (2) default delimiter used template<class CharType, class Traits, class Allocator> basic_istream<CharType, Traits>& getline( basic_istream<CharType, Traits>& is, basic_string<CharType, Traits, Allocator>& str); template<class Allocator, class Traits, class Allocator> basic_istream<Allocator, Traits>& getline( basic_istream<Allocator, Traits>&& is, basic_string<Allocator, Traits, Allocator>& str);
参数
is
要从其中提取字符串的输入流。str
从输入流读取的字符将放入的字符串。delim
行分隔符。
返回值
输入流 is。
备注
标记为 (1) 的一对函数签名从 is 中提取字符,直到找到 delim,同时将它们存储在 str 中。
这对标记为 (2) 的函数签名使用换行符作为默认行分隔符,并且像 getline(is、str、is.widen('\n')) 那样执行。
每对函数中的第二个函数是第一个的模拟,它的作用是支持 rvalue 引用。
发生下列情况之一时,提取将停止:
在文件尾的情况下,is 的内部状态标志被设置为 ios_base::eofbit。
函数提取了与 delim 比较相等的元素后,既不放回该元素,也不会将它追加到受控制序列。
函数提取了 str.max_size 元素后,is 的内部状态标志被设置为 ios_base::failbit。
除了前面所列的错误,在其他错误情况下,is 被设置为 ios_base::badbit
有关内部状态标志的信息,请参阅 ios_base::iostate。
如果函数没有提取任何元素,则 is 的内部状态标志被设置为 ios_base::failbit。 在任何情况下,getline 返回 is。
如果引发了异常,is 和 str 将处于异常状态。
示例
以下代码演示两种模式下的 getline():第一种使用默认分隔符(换行),第二种使用空格作为分隔符。 文件尾字符(键盘上的 CTRL-Z)用于控制 while 循环的终止。 这会将 cin 的内部状态标志设置为 eofbit,后者必须使用 basic_ios::clear() 进行消除,这样第二个 while 循环才能正确运行。
// compile with: /EHsc /W4
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
string str;
vector<string> v1;
cout << "Enter a sentence, press ENTER between sentences. (Ctrl-Z to stop): " << endl;
// Loop until end-of-file (Ctrl-Z) is input, store each sentence in a vector.
// Default delimiter is the newline character.
while (getline(cin, str)) {
v1.push_back(str);
}
cout << "The following input was stored with newline delimiter:" << endl;
for (const auto& p : v1) {
cout << p << endl;
}
cin.clear();
vector<string> v2;
// Now try it with a whitespace delimiter
while (getline(cin, str, ' ')) {
v2.push_back(str);
}
cout << "The following input was stored with whitespace as delimiter:" << endl;
for (const auto& p : v2) {
cout << p << endl;
}
}
输出
要求
标头:<string>
命名空间: std