C++ 读入一行字符串
getline() 是 istream 類的成員函數,它有如下兩個重載版本:
istream & getline(char* buf, int bufSize); istream & getline(char* buf, int bufSize, char delim);第一個版本從輸入流中讀取 bufSize-1 個字符到緩沖區 buf,或遇到\n為止(哪個條件先滿足就按哪個執行)。函數會自動在 buf 中讀入數據的結尾添加\0。
第二個版本和第一個版本的區別在于,第一個版本是讀到\n為止,第二個版本是讀到 delim 字符為止。\n或 delim 都不會被讀入 buf,但會被從輸入流中取走。
這兩個函數的返回值就是函數所作用的對象的引用。如果輸入流中\n或 delim 之前的字符個數達到或超過 bufSize,就會導致讀入出錯,其結果是:雖然本次讀入已經完成,但是之后的讀入都會失敗。
從輸入流中讀入一行,可以用第一個版本。用cin >> str這種寫法是不行的,因為此種讀法在碰到行中的空格或制表符時就會停止,因此就不能保證 str 中讀入的是整行。
第一個版本的 getline 函數的用法示例如下:
#include <iostream> using namespace std; int main() {char szBuf[20];int n = 120;if(!cin.getline(szBuf,6)) //如果輸入流中一行字符超過5個,就會出錯cout << "error" << endl;cout << szBuf << endl;cin >> n;cout << n << endl;cin.clear(); //clear能夠清除cin內部的錯誤標記,使之恢復正常cin >> n;cout << n << endl;return 0; }程序的運行過程如下:
33 33 44 44在上面的輸入情況下,程序是正常的。程序運行過程中還可能出現如下情況:
ab cd123456k error ab cd 120 123456第 7 行,讀入時因字符串超長導致出錯,于是第 11 行并沒有從輸入流讀入 n,n 維持了原來的值 120。
第 12 行,調用 istream 的成員函數 clear() 清除 cin 內部的錯誤標記,此后 cin 又能正常讀入了。因此,123456 在第 13 行被讀入 n。
可以用 getline() 函數的返回值(為 false 則輸入結束)來判斷輸入是否結束。例如,要將文件 test.txt 中的全部內容(假設文件中一行最長有 10 000個字符)原樣顯示,程序可以如下編寫:
#include <iostream> using namespace std; const int MAX_LINE_LEN = 10000; //假設文件中一行最長 10000 個字符 int main() {char szBuf[MAX_LINE_LEN + 10];freopen("test.txt", "r", stdin); //將標準輸入重定向為 test.txtwhile (cin.getline(szBuf, MAX_LINE_LEN + 5))cout << szBuf << endl;return 0; }程序每次讀入文件中的一行到 szBuf 并輸出。szBuf 中不會讀入回車符,因此輸出 szBuf 后要再輸出 endl 以換行。
總結
以上是生活随笔為你收集整理的C++ 读入一行字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 获取集合元素的值
- 下一篇: C++类和对象的概念