getline()函數是一個比較常見的函數。根據名字直接望文生義,就知道這個函數是來完成讀入一行數據。linux
下面就對C++ -- getline()函數的用法說明,以及getline()函數做爲while條件的問題,總結一下:ios
在C++中本質上有兩種getline函數:windows
第一種:在頭文件<istream>中,是iostream類的成員函數。數組
第二種:在頭文件<string>中,是普通函數。函數
///////////////////////////////////////////////////////////////////////////////////////////spa
第一種: 在<istream>中的getline()函數有兩種重載形式:unix
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );對象
做用是: 從istream中讀取至多n個字符(包含結束標記符)保存在s對應的數組中。即便還沒讀夠n個字符,ci
若是遇到delim 或 字數達到限制,則讀取終止,delim都不會被保存進s對應的數組中。字符串
*例程代碼:
#include "stdafx.h"
#include <iostream>
//使用標準輸入流和標準輸出流。
// std::cin ; std::cout ; std::endl
int main()
{
char name[256], wolds[256];
std::cout << "Please input your name: ";
std::cin.getline(name, 256);
std::cout << "Please input your wolds: ";
std::cin.getline(wolds, 256);
std::cout << "The result is: " << name << ", " << wolds << std::endl;
std::cout << std::endl;
return 0;
}
//**輸入:
Mr. Ling
You are wonderful !
//輸出:
Mr. Ling, You are wonderful !
*經過字數限制和設置終止符修改的代碼:
int main()
{
char name[6];
std::cout << "Please input your name: ";
std::cin.getline(name, 6, '#');
std::cout << "The result is: " << name << std::ends;
std::cout << std::endl;
return 0;
}
//**輸入: //streamsize限定,截斷輸出
wonderful
//輸出:
wonder
//**輸入: //所設置的結束標識符,截斷輸出
won#derful
//輸出:
won
第二種: 在<string>中的getline函數有四種重載形式:
istream& getline (istream& is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
istream& getline (istream& is, string& str);
istream& getline (istream&& is, string& str);
用法和上第一種相似,可是讀取的istream是做爲參數is傳進函數的。讀取的字符串保存在string類型的str中。
函數的變量:
is :表示一個輸入流,例如 cin。
str :string類型的引用,用來存儲輸入流中的流信息。
delim :char類型的變量,所設置的截斷字符;在不自定義設置的狀況下,遇到’\n’,則終止輸入。
*例程代碼:
#include "stdafx.h"
#include <iostream>
#include <string>
int main()
{
std::string name;
std::cout << "Please input your name: ";
std::getline(std::cin, name);
std::cout << "Welcome to here!" << std::ends << name << std::endl;
std::cout << std::endl;
return 0;
}
在輸入時,直至遇到‘\n’或EOF, 才終止輸入操做。
//**輸入:
wonderful
//輸出:
wonderful
*例程代碼:
nt main()
{
std::string name;
std::cout << "Please input your name: ";
std::getline(std::cin, name, '#');
std::cout << "Welcome to here!" << std::ends << name << std::endl;
std::cout << std::endl;
return 0;
}
//**輸入:
wonderful#Mr.Ling
//輸出:
wonderful
///////////////////////////////////////////////////////////////////////////////////////////
(EOF是C語言中爲了區分有效數據和輸入結束符的。
EOF的輸入由系統鎖定。windows下是ctrl+z,linux/unix下是ctrl+d。)
getline不是C庫函數,而是C++庫函數。它遇到如下狀況發生會致使生成的本字符串結束:
(1)到文件結束,(2)遇到函數的定界符,(3)輸入達到最大限度。
getline()函數在while中做爲條件判斷。
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int main()
{
string line;
while (getline(cin, line))
cout << line << endl;
return 0;
}
你們會發現運行時通常的輸入都不可以跳出循環,可能有時還會出現莫名的錯誤。可是這究竟是什麼緣由形成的呢!下面就來分析一下:
getline()函數的原型是istream& getline ( istream & is , string & str , char delim );
int main()
{
string line;
cout << "Please input a line: " << endl;
while (getline(cin, line,'#'))
cout << line << endl;
return 0;
}
而後,那麼當咱們輸入 "You are wonderful!#Mr. Ling" 時,可是,有效的輸入是 "You are wonderful!",#後面的內容並無存入。程序運行的結果如:
//輸入:
You are wondreful!#LingKing
//輸出:
You are wonderful!
在這裏設置‘#’爲終止符時,當再輸入’\n’時也不會影響。在#以前的內容都會照樣輸出。例如:
//輸入: //含有’\n’的輸入
Hello world!
You are wonderful!
Mr. Ling#wonderful!
//輸出: //照樣輸出
Hello world!
You are wonderful!
Mr. Ling
經過getline()函數一個小小的實例,那麼把getline()函數做爲while的判斷語句會怎麼樣的呢!
就分析一下while(getline(cin,line))
(注意:這裏默認回車符中止讀入,按Ctrl+Z(Windows)(Ctrl+D(Linux))或鍵入EOF(參考MSDN)回車便可退出循環。)
這個語句中,while判斷語句的真實判斷對象是cin的狀態,也就是判斷當前是否存在有效的輸入流。
而輸入流是對象,判斷的是流返回的狀態。因此正常的狀況下,你怎麼輸入都是跳不出它的循環。
在這之中可能會用些同志誤覺得while判斷語句的判斷對象是line(也就是line是否爲空),想經過回車來跳出循環,卻發現不能跳出循環。
而回車和設置的終止符都是終止getline()函數的讀取操做的。可是while判斷語句判斷的是getline()函數的輸入流是否有效。因此呢!