C++cin,cout以及常見函數總結,cin,cout格式化控制
文章目錄

一. cin對象以及常用函數總結
1.cin>>
2.cin.getline()
3.cin.get():
4.cin.gcount():
5.cin.read():
6.cin.peek():
二. cout對象以及常用函數總結
1.cout:
2.cout.put():
3.cout.width():
4.cout.fill():
三. cout格式化控制
一. cin對象以及常用函數總結
1.cin>>
cin是C++的標準輸入流對象,主要用于從標準輸入讀取數據,無論字符型,浮點型,還是整數形變量,我們只需要cin>>變量名稱;即可完成各類數據讀取數據。說到這里就不得不提到C語言中的標準輸入函數scanf(),對于剛學習C++的萌新,一定會驚艷到相對于scanf函數,cin帶來的便捷,scanf每次想要讀取數據,必須指定數據類型,這顯然顯的有些繁瑣。那么,為什么單靠一個cin>>變量名稱,即可確定數據類型并讀取數據,這其中的奧秘被隱藏在這個>>運算符之中,這個運算符叫做流提取符,其實cin>>的原型是cin.operator >>(),這又是一種被稱為運算符重載的新技術,我們可以查看cin.operator >>的定義,它存在于istream頭文件中,里面為>>符號定義了各種數據的處理方法,給大家看幾個:
在不為人知的背后,C++替我們處理好了這一切,有一句話說的好:哪有什么歲月靜好 不過是有人負重前行。對吧,我們能輕松敲代碼,是大牛在背后為我們處理了這一切。
嘿嘿,說重點,cin>>從緩沖區中讀取數據,當我們從鍵盤輸入字符串的時候,需要按回車,程序才會進行下一步動作,這個按下的回車鍵(\r)會被替換為\n,當緩沖區為空時,cin的成員函數會阻塞等待數據的到來,一旦cin的成員函數等到了’
嘿嘿,說重點,cin>>從緩沖區中讀取數據,當我們從鍵盤輸入字符串的時候,需要按回車,程序才會進行下一步動作,這個按下的回車鍵(\r)會被替換為\n,當緩沖區為空時,cin的成員函數會阻塞等待數據的到來,一旦cin的成員函數等到了’\0’,cin的成員函數就回去讀取數據,如果緩沖區第一個字符是空格,tab鍵,換行符,\0等分割字符,則cin>>自動將其忽略并清除,繼續讀取下一個字符,如果遇到上述分割字符則停止讀取,空白字符留在緩沖區,cin>>不做處理。
’,cin的成員函數就回去讀取數據,如果緩沖區第一個字符是空格,tab鍵,換行符,嘿嘿,說重點,cin>>從緩沖區中讀取數據,當我們從鍵盤輸入字符串的時候,需要按回車,程序才會進行下一步動作,這個按下的回車鍵(\r)會被替換為\n,當緩沖區為空時,cin的成員函數會阻塞等待數據的到來,一旦cin的成員函數等到了’\0’,cin的成員函數就回去讀取數據,如果緩沖區第一個字符是空格,tab鍵,換行符,\0等分割字符,則cin>>自動將其忽略并清除,繼續讀取下一個字符,如果遇到上述分割字符則停止讀取,空白字符留在緩沖區,cin>>不做處理。
等分割字符,則cin>>自動將其忽略并清除,繼續讀取下一個字符,如果遇到上述分割字符則停止讀取,空白字符留在緩沖區,cin>>不做處理。細心的讀者也許注意到了上述圖片中的>>是具有返回值的,也許也遇到while(std::cin >> value)這樣的語句,有很多人誤以為cin會返回值,其實不然,cin是類對象,對象應該是不具備返回值的,沒錯,這個返回值是由操作符>>返回的。
int a; while (cin >> a) { cout << "有效 "; }
1
2
3
4
運行結果:
當使用一個istream的對象作為條件時,效果是檢查流的狀態。若流有效,則檢測成功,返回true。當遇到文件結束符(windows為ctrl+Z,unix為ctrl+D)或者無效的輸入(比如用一個字符來作為一個整型數的輸入時),istream的對象狀態會變為無效。
至于運算符重載的好處,就是可以處理我們自己定義的復合類型,這里不再贅述。
2.cin.getline()
用于接收字符串,有兩種形式:前者以換行符結束,后者可以指定結束符結束
char carray[10]; cin.getline(carray,10);//前者,默認換行符不讀取,并將換行符從緩沖區清除。 cin.getline(carray.10,'b'); //后者,如果遇到字符'b'則終止讀。'b'不讀取,將'b'從緩沖區清除。 //要注意的是10和'b'都可作為getline停止讀取的條件。
1
2
3
3.cin.get():
cin.get()有多種重載形式,就常用的來介紹:
第一種:接收一個字符
char a; a = cin.get(); // 或者寫成cin.get(a); 都是可以的
1
2
第二種,接收字符串,有兩種形式:一前者以換行符結束,后者可以指定結束符
char carray[10]={}; cin.get(carray,10);//前者,換行符不讀取,殘留在緩沖區。 cin.get(carray,10,'b')// 后者,如果遇到字符'b'則終止讀。'b'不讀取,殘留在緩沖區。 //這里的10代表接收9個字符+1個'
char carray[10]={}; cin.get(carray,10);//前者,換行符不讀取,殘留在緩沖區。 cin.get(carray,10,'b')// 后者,如果遇到字符'b'則終止讀。'b'不讀取,殘留在緩沖區。 //這里的10代表接收9個字符+1個'\0'
'1
2
3
4
5
4.cin.gcount():
這是一個用來統計讀入的字符數的函數
char a[10]; cin.get(a,10,'g'); cout << a; cout << cin.gcount();
1
2
3
5.cin.read():
讀取指定大小的字符,不會在后面加’
讀取指定大小的字符,不會在后面加’\0’
’char a[10]; cin.read(a,10);
1
6.cin.peek():
查看緩沖區下一個字符,但是不讀取
二. cout對象以及常用函數總結
1.cout:
cout是C++的標準輸出流對象,主要用于從標準輸出數據,跟cin是鐵哥們,不再多說,就是要注意cin>>運算符向左開口,而cout運算符是向右開口的:cout<<。
2.cout.put():
一個專門輸出字符的函數,不可以輸出整形。
3.cout.width():
可以控制輸出字符域寬度,且不足用空格填充,并且默認的方式是右對齊,width只會影響設置后的下一次輸入,當二次輸入時,width()失效,恢復默認方式。
char a; cin.get(a); cout.width(3); cout << a;
1
2
3
4.cout.fill():
該函數可以用來改變填充的字符,并且設置以后一直生效,這一點和width不同。
cout.width(8); cout.fill('*'); cout << 123 << endl; //運行結果為:*****123
1
2
3
三. cout格式化控制
凡事有利就有弊,一邊羨慕cout帶來的快捷,一邊吐槽cout不如printf函數無法設置輸出格式。其實cout也是可以進行格式化輸出的,來看看:
width()和fill()上文已經說過,這里不再討論,來看看剩下的:
C++默認的流輸出浮點數有效位是6位,包括整數和小數,數值超出6位后將使用四舍五入原則進行控制,使用cout.precision(n)可以控制輸出的有效數位,n=0時默認6位。
double a = 1234567.12345; cout << a;
1
運行結果:
double a = 1234.123789; cout.precision(7); cout << a;
1
2
運行結果:
setf(ios::state)設置輸出格式狀態,括號中應給出格式標志,內容與控制符setiosflags括號中的內容相同。
unsetf(ios::state) 終止已設置的輸出格式狀態,在括號中應指定內容。
例如:
int a = 1234567; cout.setf(ios::showpos);//對正數顯示正號 cout << a << endl; //cout.unsetf(ios::showpos);//取消設置 cout.width(10); //設置域寬為10 cout.setf(ios::internal); //數值的符號位在域寬內左對齊,數值右對齊,中間由填充字符填充 cout << a << endl;
1
2
3
4
5
6
運行結果:
每次使用格式控制符,必須寫一個cout,這樣的設置對用戶不太友好,C++又提供上述函數的替代品:
同時需要添加頭文件
cout << setiosflags(ios::showpos)<< a << endl; cout << setw(10) << setiosflags(ios::internal) << a << endl;
1
運行結果:
ok,就到這里!
C++ iOS
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。