C++:while(getline())函数
首先說明getline()的原型:getline(istream &is,string &str,char delim)
istream &is表示一個輸入流,譬如cin,string表示把從輸入流讀入的字符串存放在這個字符串中(&str其實就是一個變量),char delim是終止符(默認為回車,還可以是別的符號,如#,*之類的都可以)
對于while(getline(cin,str))來講,while語句的真實判斷對象是cin,也就是當前是否存在有效的輸入流,如果存在就不會結束循環。
盡量使用全局函數string類中的getline(),其讀入的第二個參數為string類型,不設置默認是遇到回車停止讀入操作
cin.getline是針對數組字符串的,以指定的地址為存放第一個讀取的字符的位置,依次向后存放讀取的字符,直到讀滿N-1個,或者遇到指定的結束符為止
全局函數的getline(cin,str);處理后還留有結束符在輸入流中,故需要使用cin.get();//接受最后一個結束符,才能接受后面得輸入值。
------總結:getline()函數
一、string類的getline函數(全局函數)
getline(cin,str)函數是處理string類的函數。第二個參數為string類型的變量。讀入時第二個參數為string類型,而不是char*,要注意區別
? ? ? ? getline()函數的定義如下所示
? ? ? ? 1. istream& getline ( istream &is , string &str , char delim );
? ? ? ? 2. istream& getline ( istream &is , string &str );
is 進行讀入操作的輸入流
str 用來存儲讀入的內容
delim?終結符,遇到該字符停止讀取操作,不寫的話默認為回車,
函數的返回值:
? ? ? ? 與參數is一樣。(------------------while進行下一次循環時,怎么知道.txt文本中第一行已經進行輸出完要從第二行開始輸出的?----------------解答:
getline?這個函數的作用就是讀取一行,它會自動區分每一行文本的
每一行文本之間都有換行符,他根據換行符來區分
就是第一行讀完之后,自動跳到第二行開頭
)
來看一個包含多個名稱和地址的文件,其內部格式如下:
可以將該文件看成是由 3 個記錄組成的。記錄是關于單個項目的完整信息集。另外,文件中的記錄由 3 個字段組成:
- 第一個字段就是某人的名字;
- 第二個字段是某人的街道地址或郵政信箱號碼;
- 第三個字段包含某人的城市、州和郵政編碼。
請注意,每個字段以 $ 字符結尾,每個記錄以 \n 字符結尾。下面的程序演示了如何使用 getline 函數來檢測 $ 字符:
// This file demonstrates the getline function with a user-specified delimiter.
#include <iostream>
#include <string>
#include <fstream>
using namespace std;int main()
{// Variable needed to read filestring input;// Open the file.fstream dataFile ("addresses.txt", ios::in);if (!dataFile){cout << "Error opening file.";return 0;}// Read lines terminated by '$'' sign and outputgetline(dataFile, input, '$');while (!dataFile.fail()) //while(dataFile) //這兩種while判斷語句都可以{cout << input << endl;getline(dataFile, input, '$'); //??????????怎么檢測到第一行已經輸出,要從第二行開始輸出???????????}// Close the filedataFile.close ();return 0;
}
程序輸出結果:
?
?
? ? ? ? 前方預警,請各位看官注意!!!
? ? ? ? 所以在使用while(getline(cin,line))的時候,判斷while()是否結束循環的條件不是輸入流是否輸入了回車(或getline函數里你自己定義的結束符),而是getline這個函數是否輸入無效(這么說好像有點繞,給你們來個爽快的)。直到你輸入了EOF或者ctrl+z,while循環才會結束,(
即讀取到文件末尾的時候就不能再讀取了,這個時候就會讀取失敗,這樣循環就結束了。就是到了末尾了,再往后沒東西就表示到了末尾了
在C++里面,到了末尾,就用EOF表示
但是文件的末尾本來就是沒有什么特殊標志的)
而且要注意的是,只有getline函數動作完畢時,while才會執行內部的循環,例如 :
while(getline(cin,str)) { cout<<str<<endl; }
直到你輸入了回車或者你自己設定的結束符,str這個字符串才會被輸出。
讓我們一起來分析一下while(getline(cin,line))語句
注意這里默認回車符停止讀入,按Ctrl+Z或鍵入EOF回車即可退出循環。
在這個語句中,首先getline從標準輸入設備上讀入字符,然后返回給輸入流cin,注意了,是cin,所以while判斷語句的真實判斷對象是cin,也就是判斷當前是否存在有效的輸入流。在這種情況下,我想只要你的電腦不中毒不發神經你的輸入流怎么會沒有效?所以這種情況下不管你怎么輸入都跳不出循環,因為你的輸入流有效,跳不出循環。
然而有些同學誤以為while判斷語句的判斷對象是line(也就是line是否為空),然后想通過直接回車(即輸入一個空的line)跳出循環,卻發現怎么也跳不出循環。這是因為你的回車只會終止getline()函數的讀入操作。getline()函數終止后又進行while()判斷(即判斷輸入流是否有效,你的輸入流當然有效,滿足條件),所以又運行getline()函數,導致程序永遠跳不出循環。
? ? ? ? 注意:上面講到的getline(cin,str)實際是一個全局函數,本身屬于string類。所以你使用該函數的時候請記得添加#include <string>頭文件。下面介紹一個與getline很相似的函數cin.getline。
cin.getline()函數是處理數組字符串的,其原型為cin.getline(char * , int),第一個參數為一個char指針,第二個參數為數組字符串長度。
cin.getline()當輸入超長時,會引起cin函數的錯誤,后面的cin操作將不再執行。如下代碼:
void test_input()
{
char ch1,ch2[10];
cout<<"請輸入字符串:"<<endl;
cin.getline(ch2,6);//在不遇到結束符的情況下,最多可接收6-1=5個字符到ch2中
cin>>ch1;
cout<<ch2<<endl;
cout<<ch1<<"\n"<<(int)ch1<<endl;
}
測試:如下圖,輸入zifuchuan[Enter],長度大于最大長度5,就會導致cin函數錯誤,其后既沒有像cin.get()一樣直接從輸入緩沖區直接讀數據,也沒有從鍵盤輸入。所以此處可以注意,考慮在用cin.getline()時,適度設置其最大接受長度大一點。
cin.getline()
此函數會一次讀取多個字符(包括空白字符)。它以指定的地址為存放第一個讀取的字符的位置,依次向后存放讀取的字符,直到讀滿N-1個,或者遇到指定的結束符為止。若不指定結束符,則默認結束符為'\n'。其語法為:
cin.getline(字符指針(char*),字符個數N(int),結束符(char));
#include "stdafx.h"
#include<iostream>
#include <stdio.h>
#include <string>
using namespace std;int main()
{
char a[30];
cout << "請輸入一個字符串:" << endl;
cin.getline(a, 10);//第10位存放字符串結束符'\0'
for (int i = 0; i<10; i++)
cout << "第"<<i+1<<"個值為:"<<a[i] << endl;return 0;
}
輸入:1234567890123
輸出:1?2?3?4?5?6?7?8?9?_?(第10位存放字符串結束符'\0')
參照博客:https://www.cnblogs.com/ymd12103410/p/9514896.html
總結
以上是生活随笔為你收集整理的C++:while(getline())函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++:文件操作2 文本文件和二进制文件
- 下一篇: PCL:k-d tree 1 讲解