格尔齿轮厂工资怎样:c++格式化输入输出 - C/C++ - 51CTO技术论坛

来源:百度文库 编辑:中财网 时间:2024/10/05 13:03:47

c++格式化输入输出

c++格式化输入输出
1 a' y( Y# F4 X7 bcin与cout  + S: P0 q* }0 {8 M
一:标准输入函数cin  6 H% F$ K6 Y  _- n! S0 ~' Q2 X! N
    不知道说它是个函数对还是不对,它是代表标准的输入设备--键盘。他是属于流的,他的用法和流的用法是一样的。也就是: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
    另外,这个函数是不用带地址符号"&"的,也不用写明变量类型,千万不要跟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="<) ?2 @- [% @3 v+ v  f' j
如果你输入的是一个字符如’a’那么他也不检查,但你输出的结果不是正确的,这要是手工进行检查。当然他也跟scanf一样,如果在循环内部输入不合法的变量值,那么也将陷入死循环。如下:  0 e( N1 \) P' A- r5 R
/*一个输入不合法变量陷入死循环的例子*/  , [4 [3 Y3 j( O) t$ ?5 Z
#include   
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<2 W; {, i0 z; O     }  . I3 F- Q5 b) W* M0 A
}  
% h1 s# f% V5 d/ @; l    如上一个程序,如果你输入的不合法,那就将陷入死循环。解决的办法有个一,把cin>>i;语句移到判断循环的语句中,那么,你输入的如果是不合法的变量,他将跳出循环。  
0 I2 {, O% Z! e9 X0 q3 G. u    cin是用空格来分隔输入的。请看看如下的例子:  : ]/ R& }' |. c" ]: ~6 ~, C$ s0 L' [
/*一个空格分隔使输入的变量达不到希望的值*/  
& `, `+ a0 x7 X+ [- o; D#include   $ 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<. \! T3 ~. d' d: l/ m0 |9 F
}  
3 j7 Z6 R- N1 `' Q" w) \看得到是什么结果呢?得到的仅仅是str=hello,为什么呢?因为cin是以空格为分隔的,当你输入一个空格时,那他就认为后面的输入不属于这里了, - ?9 P: y3 D) d0 `+ y8 X% H% m9 @8 x
认为应该给后面的变量了。另外,当你输入的字符串大于分配的空间时,还会出现溢出现象。当然,还有整行输入的函数,包括空格也一起输入了,以后也会学到。  
2 Z. e8 b; ]  p6 H) O. {9 ^# K% o二、标准输出函数cout  3 D# `. v- J: c, q& A
    说cout是函数,也跟cin一样,不知道对不对。他代表的是标准输出设备--显示器。其实前面已经用过很多次这个函数了。我们就通过一个例子来进行格式化的输出就是了,大家就体会体会这个例子就行了,比printf灵活了很多。  1 P% |& N) J7 W3 s$ M0 w( @
    首先,我们可以按16进制,8进制和10进制来显示我们的数据,如下:  
7 m& \3 r% N( o7 `+ u! B/*一个按进制输出的例子*/  3 _' T4 a: x7 I
#include  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<( `9 I% S0 o) d/ D4 l  i    cout.setf(ios::showbase | ios::uppercase);   //设置基指示符输出和数值中的字母大写输出  $ Y& j0 i7 G2 o
    cout<+ u& f5 h8 c9 Z5 f, T1 c" f* n    cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符输出和数值中的字母大写输出  
  T3 s+ H& w5 }* B# ^6 Q  ^' W    cout.setf(ios::oct);                                    //设置为八进制输出,此设置不取消一直有效  - ?0 [% _$ R2 I' b$ \9 {! q+ U! v# @. x
    cout<$ e% e8 {% S$ q. l4 R    cout.setf(ios::showbase | ios::uppercase);    //设置基指示符输出和数值中的字母大写输出  
# O8 k/ r* j: _. ~9 Y- r7 R    cout<# B- d  j  r: O4 t
    cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符输出和数值中的字母大写输出  1 l- q0 K* }/ n$ H2 j6 v
    cout.unsetf(ios::oct);                                 //取消八进制输出设置,恢复按十进制输出  
: x" O4 X; B6 Y5 z4 f    cout.setf(ios::hex);                                    //设置为十六进制输出  
! }4 j0 S2 K  H& Q, f- k" y    cout<  X' r9 b9 V' Q6 u9 X    cout.setf(ios::showbase | ios::uppercase); //设置基指示符输出和数值中的字母大写输出  + `& {' R' J3 H& R( W. d( M$ r
    cout<( L- F7 @: y6 ]" x6 \8 y2 M7 ]+ I0 C4 p
    cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符输出和数值中的字母大写输出  
3 s* J" Z1 a6 s" @  i1 E    cout.unsetf(ios::hex);                       //取消十六进制输出设置,恢复按十进制输出  & j4 n2 @7 I2 V; Y
    cout<" `" i8 s7 w* [4 i" g
}  * s) y. u; S4 c2 ?, r! r
我们用cout.setf()设置输出的格式,用cout.unsetf()取消格式。可以看出10进制在输出的时候不管有没有设置基指示符ios::
5 ?% Z6 m/ s5 J8 ishowbase,都没用,8进制再输出的时候在前面加0,而16进制是在前面加0X。而对于数值中字母大写输出,只对16进制有用,以后我们就应该看情 ! w' E1 x# S+ ^# `  l1 N& D
况使用了。当然,我们前面已经说了,还有一种方法也可以实现格式化输出,那就是使用操纵算子,如下,  ! p. o! k/ [( b
/*一个按进制输出的例子*/  7 n( A5 D0 O4 E( }
#include  
# 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<7 a- @! J. M" o+ A9 U  x! C  o    cout<# |! V: V6 u4 [; D
    cout<5 D$ e2 j. W; `+ n$ o6 ]$ q    cout<' T+ E* [* V* h2 O: M3 X, y( q    cout<# ~9 o8 `6 t8 f. R9 h! ~) b
    cout<: C3 g6 I; Y, \+ y3 ]
    cout<$ |+ W2 S  @+ g, F9 N% P2 g3 X6 J                  //设置基指示符和数值中的字母大写输出,  ) h6 D' H" z( a; H& ]' |- b
    cout<, a. V7 G" X; S. X4 x
    cout<, g3 a  V1 T1 q                  //取消基指示符和数值中的字母大写输出  
& g" b5 R1 O& n1 V% N$ n9 b    cout<7 J3 y* Y! ?* c2 K
    cout<; [" J* m& O' ?  g  C2 u$ k
}  
5 C; a/ X7 Y: P我们用以上的程序也可以输出同样的结果,可见他的灵活。我们现在输出下列一段文字:  / 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   ) 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<<"第一章"<  P5 ?  L9 J3 u9 k    cout<<"    ";  . `. v: O7 T& P! l# k: `
    cout.setf(ios::left);        //设置对齐方式为left  
; c' z" ^3 s$ _9 C' R6 ~' e/ C    cout.width(7);               //设置宽度为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(’.’);              //设置填充方式  
8 x8 X2 c: L4 S4 _3 s    cout.width(30);              //设置宽度,只对下条输出有用  
# t0 V2 I4 ]1 {  Q& B- Z* [. j    cout<<1<% E6 h. D# N* E& F! G( v/ R+ o    cout<<"    ";                 
( V+ _! e, y. i' k) P    cout.width(7);               //设置宽度  
$ W5 r/ I! ~" f9 n    cout.setf(ios::left);        //设置对齐方式为left  & P5 O* D! V. X
    cout.fill(’ ’);              //设置填充,缺省为空格  / 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<7 [- h+ f& Z" `1 `4 }
    cout.fill(’ ’);  ( M, a& b% C: ]
    cout<<"第二章"<5 m: ]5 T) B/ U; l! L; U4 }}  6 D& n* T9 m  O% k: D
    我们多次设置了宽度,为的是使我们的间距能一致,也使用了对齐方式,为的是使我们的数据能对齐显示,看起来美观。我们还使用了填充方式。我们下面用操纵算子来实现也是可以的。  
! m3 \( p1 n! k0 z$ C3 r7 Z$ L/*一个使用填充,宽度,对齐方式的例子*/  , b, J6 E$ P" o( F5 a, t
#include   2 h. @5 b! @& ^- C' g+ [* E
void main()  : H* `( h, Y3 F" e8 J
{  2 X3 V# Y% c8 A* A
    cout<<"第一章"<6 k1 t' H/ f( G8 I; S. r- ]    cout<<"    ";  2 Q& F/ x, i! k1 h2 u
    cout<0 U6 y( g6 ~# Y$ V+ r
    cout<<"1.1";  / ?+ `* C1 j! N2 B
    cout<<"什么是C语言";  
" w' Q- i- J6 J    cout<  z+ f; ]& i% |" q) Q# U7 i  P
    cout<, ]. ^" U- _+ _0 j    cout<0 T& _' w% ~1 |1 x
    cout<<"    ";  
1 b5 t7 Y( Q+ ]* {1 C    cout<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<- {3 n$ Z! |4 |# M    cout<8 ]3 Y2 r+ a- M/ o# c2 D    cout<2 t  `0 J9 d& }4 R}  # d/ M3 _& K" t: y' E9 B2 r' l5 b  F
    我们输出了同样的效果,不过依我的性格,我更喜欢用操纵算子来进行格式化输出。最后我们看看浮点数的格式输出,如下例:  
3 ^/ S8 R; r4 s& q  W9 D/*关于浮点数的格式*/  
5 R* e" }* e  R#include   
, 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<5 m' ]# E0 R, `/ I
    cout.setf(ios::showpos);              //强制在正数前加+号  
7 E$ `5 W" \, l0 q) ~    cout<0 E+ ?, M" Q8 B
    cout.unsetf(ios::showpos);            //取消正数前加+号    j, J  d9 d# @
    cout.setf(ios::showpoint);            //强制显示小数点后的无效0  9 b) N0 g5 s9 [$ e4 h. ^; X
    cout<  O5 S# n( q- u5 F% R+ d    cout.unsetf(ios::showpoint);          //取消显示小数点后的无效0  ) @5 ]& @3 ^1 h, g. a+ f1 }
    cout.setf(ios::scientific);           //科学记数法  
$ G2 ~% J* |& }" {0 k2 P5 g  v+ S    cout<6 d2 O, @$ e5 O7 S    cout.unsetf(ios::scientific);         //取消科学记数法  
7 w# G4 ~+ o1 ~% k    cout.setf(ios::fixed);                //按点输出显示  9 W: s0 ~# X  j  W
    cout<# 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<6 n- V  y# q. q    cout.precision(6);                    //精度恢复为6  / Y. Z# B6 s( E
}  
" O' F& I" k9 C& ^" x2 T    同样,我们也一样能用操纵算子实现同样的功能:  3 S$ h2 ]1 G" v* R' C
/*关于浮点数的格式*/  
( _  j3 g6 J. G' _8 v/ Z- o#include   
) 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<0 m3 Y. ^8 @6 W7 f* x    cout<% z" e4 l: {  [2 \$ u2 G
    cout<" p& u9 e# g6 F: z7 ?* P' r; I
    cout</ ^" i, o4 X' q) H  b  d0 z$ v
    cout<3 q- X# i! \" h" X  O8 o. z
    cout<& J- ~$ o( k# Z    cout<) v+ \8 t& w% |) y( C2 ?7 c  F+ A    cout<# p6 p8 R9 a' [/ V5 u3 f% C) _    cout<: P& |! Q7 D3 d. y7 b5 ^8 _1 z" R    cout<0 _1 X" f( }1 \) T    cout<8 G$ Y' B' _" h1 F" Z5 I    cout<3 T, x9 t! B% \
    cout<6 r8 U, K7 t* d( E  b4 z    cout<2 U! I7 S  n* d' Q$ N    cout<6 ~* e, e3 I1 j- ~! v* O/ W
    cout<! A6 Z. y! F. }$ f
}  
: k$ ^9 c" a7 |6 ?( J9 C/ k; V- p   在c/c++系统中除了标准的输入输出外,还提供了更多的输入函数。这写函数主要有getch(),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还有些为了让缓冲区不影响程序的正确操作的缓冲去的操作,如: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(),把一个字符送回输入缓冲区。  
5 l# i! j3 ]* R  U    8、fflush(stdin),清除输入缓冲区操作。无法清除cin.get()等带来的操作。  9 C( a9 J2 K; q( Z( O
    9、cout.flush(),清楚输出缓冲区。  
$ H2 {# }6 C' b: c    在这里我们稍微说一下输入/输出缓冲区,这是为了减少程序访问io带来中断而设的一段空间。当程序满足某个刷新条件时,那就将清理缓冲区。具体条件为:  
1 S; ]: ^. }9 j! r    1、输入缓冲区  . B+ j' h1 Y3 O0 W" ~* {7 `
a,程序要求输入时,按下了回车键。  0 j! b( A+ H+ y  w9 }7 ]
b,遇到程序结束。  2 _2 X  |6 j" w5 G1 @5 C; q5 k
c,遇到下一条输入语句。  - l6 a' B" b( Z  p! K$ m/ X
d,遇到清除缓冲区操作  ' B; ^$ _+ K: A3 u9 R' Z3 T
e,缓冲区溢出  
) O* g& Y" D6 n1 @1 p" O    2、输出缓冲区  
7 Y" t+ t4 g, N5 C6 N# H. ia,输出缓冲区溢出  
: m$ M0 ]& ]; P) pb,遇到下一条输入语句  . z4 Y8 Y7 O3 n. s' g5 s1 X
c,使用刷新缓冲区迫使清除  3 ^0 ^1 X3 {! l: x$ R
d,程序结束。  
* k" S9 G5 b- B0 F( P; N/ J    缓冲区操作有时会带来程序的不正确的输入,如前面说的scanf(),在连续输入的时候,会把一个回车赋给下一个字符变量。我们操作的时候一定要注意。% |! y8 K7 g, X& @; G% v. Q
本文出自 51CTO.COM技术博客