getline()函數是一個比較常見的函數。根據名字直接望文生義,就知道這個函數是來完成讀入一行數據。
下面就對C++ -- getline()函數的用法說明,以及getline()函數作為while條件的問題,總結一下:
在C++中本質上有兩種getline函數:
第一種:在頭文件<istream>中,是iostream類的成員函數。
第二種:在頭文件<string>中,是普通函數。
///////////////////////////////////////////////////////////////////////////////////////////
第一種: 在<istream>中的getline()函數有兩種重載形式:
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );
作用是: 從istream中讀取至多n個字符(包含結束標記符)保存在s對應的數組中。即使還沒讀夠n個字符,
如果遇到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()函數的輸入流是否有效。所以呢!