cin是c++程式語言中的標準輸入流物件,即istream類的物件。cin主要用於從標準輸入讀取資料,這裡的標準輸入,指的是終端的鍵盤。此外,cout是流的物件,即ostream類的物件,cerr是標準錯誤輸出流的物件,也是ostream 類的物件。這裡的標準輸出指的是終端鍵盤,標準錯誤輸出指的是終端的螢幕。
在理解cin功能時,不得不提標準輸入緩衝區。當我們從鍵盤輸入字串的時候需要敲一下回車鍵才能夠將這個字串送入到緩衝區中,那麼敲入的這個回車鍵(\r)會被轉換為乙個換行符\n,這個換行符\n也會被儲存在cin的緩衝區中並且被當成乙個字元來計算!比如我們在鍵盤上敲下了123456這個字串,然後敲一下回車鍵(\r)將這個字串送入了緩衝區中,那麼此時緩衝區中的位元組個數是7 ,而不是6。
cin讀取資料也是從緩衝區中獲取資料,緩衝區為空時,cin的成員函式會阻塞等待資料的到來,一旦緩衝區中有資料,就觸發cin的成員函式去讀取資料。
使用cin從標準輸入讀取資料時,通常用到的方法有cin>>,cin.get,cin.getline。
cin可以連續從鍵盤讀取想要的資料,以空格、tab或換行作為分隔符。例項程式如下。
#include using namespace std;
int main()
; cin.get(array,20);
cin.get(a);
cout《輸入:123456789[回車]
從結果可以看出,cin.get(array,20);讀取一行時,遇到換行符時結束讀取,但是不對換行符進行處理,換行符仍然殘留在輸入緩衝區。第二次由cin.get()將換行符讀入變數b,列印輸入換行符的ascii碼值為10。這也是cin.get()讀取一行與使用getline讀取一行的區別所在。getline讀取一行字元時,預設遇到』\n』時終止,並且將』\n』直接從輸入緩衝區中刪除掉,不會影響下面的輸入處理。
cin.get(str,size);讀取一行時,只能將字串讀入c風格的字串中,即char*,但是c++的getline函式可以將字串讀入c++風格的字串中,即string型別。鑑於getline較cin.get()的這兩種優點,建議使用getline進行行的讀取。關於getline的用法,下文將進行詳述。
函式作用:從標準輸入裝置鍵盤讀取一串字串,並以指定的結束符結束。
函式原型有兩個:
istream& getline(char* s, streamsize count); //預設以換行符結束
istream& getline(char* s, streamsize count, char delim);
#include using namespace std;
int main()
; cin.getline(array,20); //或者指定結束符,使用下面一行
'\n');
cout《注意,cin.getline與cin.get的區別是,cin.getline不會將結束符或者換行符殘留在輸入緩衝區中。
使用cin讀取鍵盤輸入時,難免發生錯誤,一旦出錯,cin將設定條件狀態(condition state)。條件狀態識別符號號為:
goodbit:無錯誤
eofbit:已到達檔案尾
failbit:非致命的輸入/輸出錯誤,可挽回
badbit:致命的輸入/輸出錯誤,無法挽回
若在輸入輸出類裡.需要加ios::識別符號號。與這些條件狀態對應的就是設定、讀取和判斷條件狀態的流物件的成員函式。他們主要有:
s.eof():若流s的eofbit置位,則返回true;
s.fail():若流s的failbit置位,則返回true;
s.bad():若流s的badbit置位,則返回true;
s.good():若流s的goodbit置位,則返回true;
s.clear(flags):清空狀態標誌位,並將給定的標誌位flags置為1,返回void。
s.setstate(flags):根據給定的flags條件狀態標誌位,將流s中對應的條件狀態位置為1,返回void。
s.rdstate():返回流s的當前條件狀態,返回值型別為strm::iostate。strm::iostate 機器相關的整形名,由各個iostream類定義,用於定義條件狀態。
了解以上關於輸入流的條件狀態與相關操作函式,下面看乙個因輸入緩衝區未讀取完造成的條件狀態位failbit被置位,再通過clear()復位的例子。
#include using namespace std;
int main()
,str2[20]=;
cin.getline(str1,5);
cin.clear(); // 清除錯誤標誌
cin.ignore(numeric_limits::max(),'\n'); //清除緩衝區的當前行
cin.getline(str2,20);
cout<<"str1:"《程式輸入:12345[回車]success[回車]
程式中使用cin.ignore清空了輸入緩衝區的當前行,使上次的輸入殘留下的資料沒有影響到下一次的輸入,這就是ignore()函式的主要作用。其中,numeric_limits::max()不過是標頭檔案定義的流使用的最大值,你也可以用乙個足夠大的整數代替它。
如果想清空輸入緩衝區,去掉換行符,使用:
cin.ignore(numeric_limits< std::streamsize>::max()); 清除cin裡所有內容。
cin.ignore();當輸入緩衝區沒有資料時,也會阻塞等待資料的到來。
有個疑問,網上很多資料說呼叫cin.sync()即可清空輸入緩衝區,本人測試了一下,vc++可以,但是在linux下使用gnu c++卻不行,無奈之下,linux下就選擇了cin.ignore()。
c++中定義了乙個在std名字空間的全域性函式getline,因為這個getline函式的引數使用了string字串,所以宣告在了< string>標頭檔案中了。
getline利用cin可以從標準輸入裝置鍵盤讀取一行,當遇到如下三種情況會結束讀操作:1)到檔案結束,2)遇到函式的定界符,3)輸入達到最大限度。
函式原型有兩個過載形式:
istream& getline ( istream& is, string& str);//預設以換行符結束
istream& getline ( istream& is, string& str, char delim);
使用示例:
#include #include using namespace std;
int main()
; gets(array);
cout《輸入:i am lvlv[回車]
由於該函式是c的庫函式,所以不建議使用,既然是c++程式,就盡量使用c++的庫函式吧。
#include int main()
#include int main(int argc, const char * ar**)
#include #include int main()
C 的標準輸入
昨天做題的時候,遇到乙個輸入是這樣的 3 4aaaa aaaa aaaa bbbbbbb bbbb ccc cccccccc d第一行輸入乙個整數n,表示接下來句子的數量,和另外乙個整數 這裡沒有作用,只是用來說明下面的乙個情況 接下來就是n個句子,每個句子以回車結束。我的想法是 int i,j c...
c 標準輸入流
cin是istream類的派生類物件,它從標準輸入裝置 鍵盤 獲取資料,程式中的變數通過流提取符 從流中提取資料。提取資料時通常跳過輸入流中的空格,tab鍵,換行符等空白字元。只有在鍵盤輸入完資料並按enter鍵之後,該行資料才被送入鍵盤緩衝區,形成輸入流,提取運算子 才能從中提取資料 在遇到無效字...
C 標準輸入流
define crt secure no warnings includeusing namespace std if 0 標準輸入流物件 cin,重點掌握的函式 cin.get 一次只能讀取乙個字元 cin.get 乙個引數 讀乙個字元 cin.get 三個引數 可以讀字串 cin.getline...