C++ getline函數用法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM