c++格式化輸入輸出c++格式化輸入輸出
1 a' y( Y# F4 X7 bcin與cout + S: P0 q* }0 {8 M 一:標準輸入函數(shù)cin 6 H% F$ K6 Y _- n! S0 ~' Q2 X! N 不知道說它是個函數(shù)對還是不對,它是代表標準的輸入設(shè)備--鍵盤。他是屬于流的,他的用法和流的用法是一樣的。也就是:cin>>變量; , Z$ v3 ]5 p6 T( I. ~) v 小小的說明一下,輸入多個變量可以寫在一行,如:cin>>x>>y>>z; 7 u: U* n9 a/ `& M5 R# S2 ] 這樣寫不是不允許,而是不好看,如果是不同的變量類型,那就更是沒頭沒腦了。除了你,人家是不知道該輸入什么的,所以,一般在輸入語句的前面,我們一般都 & Y8 J6 [+ B7 ]# ]1 C 要做一個提示,請輸入×××,讓人家心里有個底,知道這個變量是做什么的。 0 P6 C& d3 x0 F/ E* b 另外,這個函數(shù)是不用帶地址符號"&"的,也不用寫明變量類型,千萬不要跟scanf混淆。當然他就也不檢查變量輸入是否合法。如: * M( R9 W) y* \* I% L: v int i; " m& `8 E. V! Ycout<<"please input a number:" ; ^1 [9 Y# u. z' tcin>>i; 9 L. n0 K9 d x' X) N: V V" b8 I0 icout<<"i="<<i<<endl; ) ?2 @- [% @3 v+ v f' j 如果你輸入的是一個字符如’a’那么他也不檢查,但你輸出的結(jié)果不是正確的,這要是手工進行檢查。當然他也跟scanf一樣,如果在循環(huán)內(nèi)部輸入不合法的變量值,那么也將陷入死循環(huán)。如下: 0 e( N1 \) P' A- r5 R /*一個輸入不合法變量陷入死循環(huán)的例子*/ , [4 [3 Y3 j( O) t$ ?5 Z #include <iostream.h> 7 O: a& ~3 ?5 ~+ y- X" Smain() % g, b, U& |/ ]6 |$ o { ! \: t+ ~& r- ? int i; & M5 J# e' }2 o while(i!=-1) : M+ K* b& M3 J4 M$ O4 h4 H" X: u { 6 ~2 G* r/ K; _2 V) B, n8 M cout<<"i=" . ~6 R; t, ]/ Y8 `3 Z. T( n9 N9 | cin>>i; /*請輸入不是一個字符如’a’試試*/ % b9 S+ g6 ^' N/ h$ U% F$ T cout<<endl; 2 W; {, i0 z; O } . I3 F- Q5 b) W* M0 A } % h1 s# f% V5 d/ @; l 如上一個程序,如果你輸入的不合法,那就將陷入死循環(huán)。解決的辦法有個一,把cin>>i;語句移到判斷循環(huán)的語句中,那么,你輸入的如果是不合法的變量,他將跳出循環(huán)。 0 I2 {, O% Z! e9 X0 q3 G. u cin是用空格來分隔輸入的。請看看如下的例子: : ]/ R& }' |. c" ]: ~6 ~, C$ s0 L' [ /*一個空格分隔使輸入的變量達不到希望的值*/ & `, `+ a0 x7 X+ [- o; D#include <iostream.h> $ q& i, S& |) N main() 5 o" i: f6 d z8 z6 i { 7 v' ~, A# ]3 ^1 s char str[20]; ' f( o6 A0 x2 `! R cout<<"please input a string:"; : ^. n7 o! B0 Q2 J! A( I cin>>str; /*你試著輸入"hello word"*/ 7 Q/ [0 h2 l \5 J7 j* @; W cout<<endl<<"str="<<str; . \! T3 ~. d' d: l/ m0 |9 F } 3 j7 Z6 R- N1 `' Q" w) \看得到是什么結(jié)果呢?得到的僅僅是str=hello,為什么呢?因為cin是以空格為分隔的,當你輸入一個空格時,那他就認為后面的輸入不屬于這里了, - ?9 P: y3 D) d0 `+ y8 X% H% m9 @8 x 認為應(yīng)該給后面的變量了。另外,當你輸入的字符串大于分配的空間時,還會出現(xiàn)溢出現(xiàn)象。當然,還有整行輸入的函數(shù),包括空格也一起輸入了,以后也會學到。 2 Z. e8 b; ] p6 H) O. {9 ^# K% o二、標準輸出函數(shù)cout 3 D# `. v- J: c, q& A 說cout是函數(shù),也跟cin一樣,不知道對不對。他代表的是標準輸出設(shè)備--顯示器。其實前面已經(jīng)用過很多次這個函數(shù)了。我們就通過一個例子來進行格式化的輸出就是了,大家就體會體會這個例子就行了,比printf靈活了很多。 1 P% |& N) J7 W3 s$ M0 w( @ 首先,我們可以按16進制,8進制和10進制來顯示我們的數(shù)據(jù),如下: 7 m& \3 r% N( o7 `+ u! B/*一個按進制輸出的例子*/ 3 _' T4 a: x7 I #include<iostream.h> 6 [3 I+ _4 S! e* g, G void main() 2 o O' ~7 `; c! H H1 j# h{ # w$ w+ e) X' T0 O; L int x=30, y=300, z=1024; - }1 f9 K% m5 e2 X9 L9 ` cout<<x<<’ ’<<y<<’ ’<<z<<endl; //按十進制輸出 ( `9 I% S0 o) d/ D4 l i cout.setf(ios::showbase | ios::uppercase); //設(shè)置基指示符輸出和數(shù)值中的字母大寫輸出 $ Y& j0 i7 G2 o cout<<x<<’ ’<<y<<’ ’<<z<<endl; + u& f5 h8 c9 Z5 f, T1 c" f* n cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符輸出和數(shù)值中的字母大寫輸出 T3 s+ H& w5 }* B# ^6 Q ^' W cout.setf(ios::oct); //設(shè)置為八進制輸出,此設(shè)置不取消一直有效 - ?0 [% _$ R2 I' b$ \9 {! q+ U! v# @. x cout<<x<<’ ’<<y<<’ ’<<z<<endl; //按八進制輸出 $ e% e8 {% S$ q. l4 R cout.setf(ios::showbase | ios::uppercase); //設(shè)置基指示符輸出和數(shù)值中的字母大寫輸出 # O8 k/ r* j: _. ~9 Y- r7 R cout<<x<<’ ’<<y<<’ ’<<z<<endl; # B- d j r: O4 t cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符輸出和數(shù)值中的字母大寫輸出 1 l- q0 K* }/ n$ H2 j6 v cout.unsetf(ios::oct); //取消八進制輸出設(shè)置,恢復按十進制輸出 : x" O4 X; B6 Y5 z4 f cout.setf(ios::hex); //設(shè)置為十六進制輸出 ! }4 j0 S2 K H& Q, f- k" y cout<<x<<’ ’<<y<<’ ’<<z<<endl; X' r9 b9 V' Q6 u9 X cout.setf(ios::showbase | ios::uppercase); //設(shè)置基指示符輸出和數(shù)值中的字母大寫輸出 + `& {' R' J3 H& R( W. d( M$ r cout<<x<<’ ’<<y<<’ ’<<z<<endl; ( L- F7 @: y6 ]" x6 \8 y2 M7 ]+ I0 C4 p cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符輸出和數(shù)值中的字母大寫輸出 3 s* J" Z1 a6 s" @ i1 E cout.unsetf(ios::hex); //取消十六進制輸出設(shè)置,恢復按十進制輸出 & j4 n2 @7 I2 V; Y cout<<x<<’ ’<<y<<’ ’<<z<<endl; " `" i8 s7 w* [4 i" g } * s) y. u; S4 c2 ?, r! r 我們用cout.setf()設(shè)置輸出的格式,用cout.unsetf()取消格式。可以看出10進制在輸出的時候不管有沒有設(shè)置基指示符ios:: 5 ?% Z6 m/ s5 J8 ishowbase,都沒用,8進制再輸出的時候在前面加0,而16進制是在前面加0X。而對于數(shù)值中字母大寫輸出,只對16進制有用,以后我們就應(yīng)該看情 ! w' E1 x# S+ ^# ` l1 N& D 況使用了。當然,我們前面已經(jīng)說了,還有一種方法也可以實現(xiàn)格式化輸出,那就是使用操縱算子,如下, ! p. o! k/ [( b /*一個按進制輸出的例子*/ 7 n( A5 D0 O4 E( } #include<iomanip.h> # W7 T% l7 R+ w+ S( dvoid main() 7 n: ?4 N+ ^! E* k% x { ; x: p4 m0 I, u+ u! J9 R5 M int x=30, y=300, z=1024; ' `3 z* V7 Q8 u: [( a cout<<x<<’ ’<<y<<’ ’<<z<<endl; //按十進制輸出 7 a- @! J. M" o+ A9 U x! C o cout<<oct<<x<<’ ’<<y<<’ ’<<z<<endl; //按八進制輸出 # |! V: V6 u4 [; D cout<<setiosflags(ios::showbase); //設(shè)置基指示符 5 D$ e2 j. W; `+ n$ o6 ]$ q cout<<x<<’ ’<<y<<’ ’<<z<<endl; //仍按八進制輸出 ' T+ E* [* V* h2 O: M3 X, y( q cout<<resetiosflags(ios::showbase); //取消基指示符 # ~9 o8 `6 t8 f. R9 h! ~) b cout<<hex<<x<<’ ’<<y<<’ ’<<z<<endl; //按十六進制輸出 : C3 g6 I; Y, \+ y3 ] cout<<setiosflags(ios::showbase | ios::uppercase); $ |+ W2 S @+ g, F9 N% P2 g3 X6 J //設(shè)置基指示符和數(shù)值中的字母大寫輸出, ) h6 D' H" z( a; H& ]' |- b cout<<x<<’ ’<<y<<’ ’<<z<<endl; //仍按十六進制輸出 , a. V7 G" X; S. X4 x cout<<resetiosflags(ios::showbase | ios::uppercase); , g3 a V1 T1 q //取消基指示符和數(shù)值中的字母大寫輸出 & g" b5 R1 O& n1 V% N$ n9 b cout<<x<<’ ’<<y<<’ ’<<z<<endl; //仍按十六進制輸出 7 J3 y* Y! ?* c2 K cout<<dec<<x<<’ ’<<y<<’ ’<<z<<endl; //按十進制輸出 ; [" J* m& O' ? g C2 u$ k } 5 C; a/ X7 Y: P我們用以上的程序也可以輸出同樣的結(jié)果,可見他的靈活。我們現(xiàn)在輸出下列一段文字: / M: G- x* [* W+ b8 z5 G 第一章 ' @9 I3 {8 \& j) {3 C- a 1.1 什么是C語言...........................1 " }2 ^$ p1 Q5 N; O 1.11 C語言的歷史..........................58 8 Q3 t8 P9 T; X3 ~( R' W, d0 `第二章 6 ` Q& v, X+ m: `方法很多種啦,我們可以這樣寫: 6 H* O3 k% S' k4 h8 h+ e /*一個使用填充,寬度,對齊方式的例子*/ % V( k& ?4 U5 U #include <iostream.h> ) i1 \3 Z# D9 d Z; I' P void main() 9 G8 q0 v: S/ C9 z7 @! W{ 2 Q* d8 i7 O% v9 k cout<<"第一章"<<endl; P5 ? L9 J3 u9 k cout<<" "; . `. v: O7 T& P! l# k: ` cout.setf(ios::left); //設(shè)置對齊方式為left ; c' z" ^3 s$ _9 C' R6 ~' e/ C cout.width(7); //設(shè)置寬度為7,不足用空格填充 & S, t) |/ c- t3 t2 \- w cout<<"1.1"; $ t. o6 z: M9 ?0 V cout<<"什么是C語言"; 6 R5 z$ S; N/ C, M* b5 E, h7 p cout.unsetf(ios::left); //取消對齊方式,用缺省right方式 ; Y3 x! J; m# p* ` cout.fill(’.’); //設(shè)置填充方式 8 x8 X2 c: L4 S4 _3 s cout.width(30); //設(shè)置寬度,只對下條輸出有用 # t0 V2 I4 ]1 { Q& B- Z* [. j cout<<1<<endl; % E6 h. D# N* E& F! G( v/ R+ o cout<<" "; ( V+ _! e, y. i' k) P cout.width(7); //設(shè)置寬度 $ W5 r/ I! ~" f9 n cout.setf(ios::left); //設(shè)置對齊方式為left & P5 O* D! V. X cout.fill(’ ’); //設(shè)置填充,缺省為空格 / Q; |& G/ K. _6 Y4 \ cout<<"1.11"; 1 u* ^5 `! {, ~7 P& G! N$ E$ E cout<<"C語言的歷史"; ( V# f- ]3 e9 H. R cout.unsetf(ios::left); //取消對齊方式 5 D0 E3 V% D9 |8 V, s1 x5 Q+ ~7 O cout.fill(’.’); ( Q: i- Z- o: m% K U cout.width(30); ' [% Z/ [. |! Q4 g1 ^ cout<<58<<endl; 7 [- h+ f& Z" `1 `4 } cout.fill(’ ’); ( M, a& b% C: ] cout<<"第二章"<<endl; 5 m: ]5 T) B/ U; l! L; U4 }} 6 D& n* T9 m O% k: D 我們多次設(shè)置了寬度,為的是使我們的間距能一致,也使用了對齊方式,為的是使我們的數(shù)據(jù)能對齊顯示,看起來美觀。我們還使用了填充方式。我們下面用操縱算子來實現(xiàn)也是可以的。 ! m3 \( p1 n! k0 z$ C3 r7 Z$ L/*一個使用填充,寬度,對齊方式的例子*/ , b, J6 E$ P" o( F5 a, t #include <iomanip.h> 2 h. @5 b! @& ^- C' g+ [* E void main() : H* `( h, Y3 F" e8 J { 2 X3 V# Y% c8 A* A cout<<"第一章"<<endl; 6 k1 t' H/ f( G8 I; S. r- ] cout<<" "; 2 Q& F/ x, i! k1 h2 u cout<<setiosflags(ios::left)<<setw(7); //設(shè)置寬度為7,left對齊方式 0 U6 y( g6 ~# Y$ V+ r cout<<"1.1"; / ?+ `* C1 j! N2 B cout<<"什么是C語言"; " w' Q- i- J6 J cout<<resetiosflags(ios::left); //取消對齊方式 z+ f; ]& i% |" q) Q# U7 i P cout<<setfill(’.’)<<setw(30)<<1<<endl; //寬度為30,填充為’.’輸出 , ]. ^" U- _+ _0 j cout<<setfill(’ ’); //恢復填充為空格 0 T& _' w% ~1 |1 x cout<<" "; 1 b5 t7 Y( Q+ ]* {1 C cout<<setw(7)<<setiosflags(ios::left); //設(shè)置寬度為7,left對齊方式 3 J1 u2 z! B3 k3 _3 A9 F cout<<"1.11"; ; B/ K4 _- o4 ^' X/ U cout<<"C語言的歷史"; , P- |- J7 p' b* l; \ cout<<resetiosflags(ios::left); //取消對齊方式 - {3 n$ Z! |4 |# M cout<<setfill(’.’)<<setw(30)<<58<<endl; //寬度為30,填充為’.’輸出 8 ]3 Y2 r+ a- M/ o# c2 D cout<<setfill(’ ’)<<"第二章"<<endl; 2 t `0 J9 d& }4 R} # d/ M3 _& K" t: y' E9 B2 r' l5 b F 我們輸出了同樣的效果,不過依我的性格,我更喜歡用操縱算子來進行格式化輸出。最后我們看看浮點數(shù)的格式輸出,如下例: 3 ^/ S8 R; r4 s& q W9 D/*關(guān)于浮點數(shù)的格式*/ 5 R* e" }* e R#include <iostream.h> , m. C# e0 m( A& K% ovoid main() Q+ m6 t& F D+ ~4 z7 {1 O { + D6 q$ `( |) Z. t float f=2.0/3.0,f1=0.000000001,f2=-9.9; 4 P9 s+ E, I% `& F7 | cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; //正常輸出 5 m' ]# E0 R, `/ I cout.setf(ios::showpos); //強制在正數(shù)前加+號 7 E$ `5 W" \, l0 q) ~ cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; 0 E+ ?, M" Q8 B cout.unsetf(ios::showpos); //取消正數(shù)前加+號 j, J d9 d# @ cout.setf(ios::showpoint); //強制顯示小數(shù)點后的無效0 9 b) N0 g5 s9 [$ e4 h. ^; X cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; O5 S# n( q- u5 F% R+ d cout.unsetf(ios::showpoint); //取消顯示小數(shù)點后的無效0 ) @5 ]& @3 ^1 h, g. a+ f1 } cout.setf(ios::scientific); //科學記數(shù)法 $ G2 ~% J* |& }" {0 k2 P5 g v+ S cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; 6 d2 O, @$ e5 O7 S cout.unsetf(ios::scientific); //取消科學記數(shù)法 7 w# G4 ~+ o1 ~% k cout.setf(ios::fixed); //按點輸出顯示 9 W: s0 ~# X j W cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; # D# D2 c: j- q/ n" x0 {. O1 b cout.unsetf(ios::fixed); //取消按點輸出顯示 " O/ W' o9 y! z2 Y3 K cout.precision(18); //精度為18,正常為6 ( r# ~5 {* w5 }5 S# c2 a! i* r5 h cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; 6 n- V y# q. q cout.precision(6); //精度恢復為6 / Y. Z# B6 s( E } " O' F& I" k9 C& ^" x2 T 同樣,我們也一樣能用操縱算子實現(xiàn)同樣的功能: 3 S$ h2 ]1 G" v* R' C /*關(guān)于浮點數(shù)的格式*/ ( _ j3 g6 J. G' _8 v/ Z- o#include <iomanip.h> ) c3 J: Q* c9 Q- c: X& w6 O' gvoid main() + \/ ]# J" W: A+ R6 V { 2 i0 ?/ K" h! [, a- H k float f=2.0/3.0,f1=0.000000001,f2=-9.9; % N& ]- R# t# c5 P# X' N: o cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; //正常輸出 0 m3 Y. ^8 @6 W7 f* x cout<<setiosflags(ios::showpos); //強制在正數(shù)前加+號 % z" e4 l: { [2 \$ u2 G cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; " p& u9 e# g6 F: z7 ?* P' r; I cout<<resetiosflags(ios::showpos); //取消正數(shù)前加+號 / ^" i, o4 X' q) H b d0 z$ v cout<<setiosflags(ios::showpoint); //強制顯示小數(shù)點后的無效0 3 q- X# i! \" h" X O8 o. z cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; & J- ~$ o( k# Z cout<<resetiosflags(ios::showpoint); //取消顯示小數(shù)點后的無效0 ) v+ \8 t& w% |) y( C2 ?7 c F+ A cout<<setiosflags(ios::scientific); //科學記數(shù)法 # p6 p8 R9 a' [/ V5 u3 f% C) _ cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; : P& |! Q7 D3 d. y7 b5 ^8 _1 z" R cout<<resetiosflags(ios::scientific); //取消科學記數(shù)法 0 _1 X" f( }1 \) T cout<<setiosflags(ios::fixed); //按點輸出顯示 8 G$ Y' B' _" h1 F" Z5 I cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; 3 T, x9 t! B% \ cout<<resetiosflags(ios::fixed); //取消按點輸出顯示 6 r8 U, K7 t* d( E b4 z cout<<setprecision(18); //精度為18,正常為6 2 U! I7 S n* d' Q$ N cout<<f<<’ ’<<f1<<’ ’<<f2<<endl; 6 ~* e, e3 I1 j- ~! v* O/ W cout<<setprecision(6); //精度恢復為6 ! A6 Z. y! F. }$ f } : k$ ^9 c" a7 |6 ?( J9 C/ k; V- p 在c/c++系統(tǒng)中除了標準的輸入輸出外,還提供了更多的輸入函數(shù)。這寫函數(shù)主要有g(shù)etch(),getche(), # O& n, y8 J( M4 egetchar 4 }% [' v4 e+ H( Y$ o# }(),cin.get(),putch(),putchar(),cout.put(),gets(),cin.getline(),puts()。另外 2 t- \- b0 C' v8 e# A x還有些為了讓緩沖區(qū)不影響程序的正確操作的緩沖去的操作,如:cin.putback(),fflush(stdin),cout.flush().我們 / S. K: b2 S4 Y8 w0 v$ G& y做一下簡單的說明。 , _- \* i0 X/ z7 r6 ]8 A) w" }8 r 1、getch()和getche(),非緩沖式輸入,從鍵盤讀入一個字符。getch()讀入字符不顯示。有conio.h支持。 : g" y3 {& I1 s# J 2、cin.get(),getchar(),緩沖式輸入,從鍵盤讀入一個字符,并顯示。getchar()由stdio.h支持,cin.get()由iostream.h支持。 ( R+ S$ M0 \4 z7 n; d& S9 E4 Z! | 3、putch()和putchar(),非緩沖式輸出,輸出一個字符到顯示器。putch()由conio.h支持,putchar()由stdio.h支持。 ! f* f4 M( q5 \& P! [: a* Y. ? 4、cout.put(),緩沖式輸出,輸出一個字符到顯示器。由iostream.h支持。 6 _. h" o- Z+ G7 \% W 5、gets()和cin.geline(),緩沖式輸入,讀入一字符串(包括空格,不包括最后的回車),gets()由stdio.h支持,cin.getline()由iostream.h支持。 $ U8 j! w' v, F' W D 6、puts(),非緩沖輸出,輸出一個字符串,由stdio.h支持。 : y8 `8 A2 g) x9 W; ~ 7、cin.putback(),把一個字符送回輸入緩沖區(qū)。 5 l# i! j3 ]* R U 8、fflush(stdin),清除輸入緩沖區(qū)操作。無法清除cin.get()等帶來的操作。 9 C( a9 J2 K; q( Z( O 9、cout.flush(),清楚輸出緩沖區(qū)。 $ H2 {# }6 C' b: c 在這里我們稍微說一下輸入/輸出緩沖區(qū),這是為了減少程序訪問io帶來中斷而設(shè)的一段空間。當程序滿足某個刷新條件時,那就將清理緩沖區(qū)。具體條件為: 1 S; ]: ^. }9 j! r 1、輸入緩沖區(qū) . B+ j' h1 Y3 O0 W" ~* {7 ` a,程序要求輸入時,按下了回車鍵。 0 j! b( A+ H+ y w9 }7 ] b,遇到程序結(jié)束。 2 _2 X |6 j" w5 G1 @5 C; q5 k c,遇到下一條輸入語句。 - l6 a' B" b( Z p! K$ m/ X d,遇到清除緩沖區(qū)操作 ' B; ^$ _+ K: A3 u9 R' Z3 T e,緩沖區(qū)溢出 ) O* g& Y" D6 n1 @1 p" O 2、輸出緩沖區(qū) 7 Y" t+ t4 g, N5 C6 N# H. ia,輸出緩沖區(qū)溢出 : m$ M0 ]& ]; P) pb,遇到下一條輸入語句 . z4 Y8 Y7 O3 n. s' g5 s1 X c,使用刷新緩沖區(qū)迫使清除 3 ^0 ^1 X3 {! l: x$ R d,程序結(jié)束。 * k" S9 G5 b- B0 F( P; N/ J 緩沖區(qū)操作有時會帶來程序的不正確的輸入,如前面說的scanf(),在連續(xù)輸入的時候,會把一個回車賦給下一個字符變量。我們操作的時候一定要注意。% |! y8 K7 g, X& @; G% v. Q 本文出自 51CTO.COM技術(shù)博客 |
|
來自: setprecision > 《我的圖書館》