C++ getline函數用法

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()函數的輸入流是否有效。因此呢!

相關文章
相關標籤/搜索