1、istream 類成員
2、cin
cin 輸入接觸到第一個非空格字符時開始閱讀,當遇到下一個空格字符(空格、製表符、換行符)時就會停止讀取。因此可以放在while中作爲輸入bool類型的輸入結束判斷符
while(cin>>x)
爲了避免cin對於空白符的忽略問題,可以用getline函數
3、getline函數
getline函數可以讀取整行,包括前導和嵌入式的空格,並將其存儲在字符串對象中。
C++有兩種getline函數:
第一種:在頭文件#include<istream>中,是iostream類的成員函數,有兩種重載形式:
istream& getline(char* s, streamsize n);
istream& getline(char* s, streamsize n, char delim);
作用是:從istream中讀取至多n個字符(包含結束標記符)保存在s對贏得數組中。即使還沒讀夠n個字符。如果遇到delim或者字符達到限制,則讀取一行終止,delim都不會被保存進s對應的數組中。
使用標準輸入流和標準輸出流,std::cin; std::cout; std::endl;
使用規範 std::cin.getline(...);
用法示例:
(1) char buf[20];
char a = 'q';
//cin.getline(buf, 10)
std::cin.getline(buf, 10 ,a)
以輸入遇到回車換行符'\n'作爲結束, 或着滿10個字符結束,或者遇到設定的字符a = 'a'結束字符流讀取。
第二種:在頭文件#include<string>中,是普通函數,有四種重載形式。
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'代表一行的輸入結束。
用法示例:
(2)char str;
// 在輸入時,直至遇到‘\n’或EOF, 才終止一行字符串輸入操作。
getline(cin, str);
//以輸入遇到回車換行符'\n'或EOF作爲一行字符串輸入操作結束, 或者遇到設定的字符 'q' 也可作爲字符流讀取結束。
getline(cin, str, 'q')
首先對於EOF,是C語言中爲了區分有效數據和輸入結束符的,由系統鎖定。windows下是ctrl+z , linux/unix下是ctrl + d)
getline不是C的庫函數,而是C++的庫函數。遇到一下情況時,字符流結束。
(1)到文件結束 (2) 遇到函數定界符 (3) 輸入達到最大長度限制
用getline()函數用在while中作爲條件判斷!
string str;
while(getline(cin, str)){
cout<<str;
}
會一直輸入,遇到換行'\n' 符則(執行一次while循環體),循環繼續,再進入輸入狀態。直到EOF事件發生,如ctrl+z 則跳出while循環,結束。
string str;
while(getline(cin, str, 'q')){
cout<<str;
}
會一直循環輸入,遇到'\n' 時也不影響,直到遇到 'q' 字符則(執行一次while循環體)既此處爲輸出打印一次,然後循環繼續,再進入輸入狀態。直到EOF事件發生,如ctrl+z 則跳出while循環,結束。
總結:關於getline() 函數在while中作爲條件判斷時,判斷當前是否存在有效的輸入流對象,判斷的是cin流的狀態,所以正常輸入的情況下跳不出while(getline(cin,str))或while(getline(cin,str, 'q'))的判斷條件,而遇到 '\n'或 'q'時判斷條件爲真,則僅僅代表一行或一次的輸入結束,因此進入while循環體執行一次while中的語句塊。直到最終通過EOF事件的發生,跳出while循環。