c++格式化输入输出

c++格式化输入输出 5 G9 }- |$ ~6 @& Y7 l/ p
cin与cout   " J3 V9 O  `6 m2 R
一:标准输入函数cin   3 Z  m4 X) B! b2 M7 I0 K# g* S
    不知道说它是个函数对还是不对,它是代表标准的输入设备--键盘。他是属于流的,他的用法和流的用法是一样的。也就是:cin>>变量;
) m  E7 }. ^; m8 j小小的说明一下,输入多个变量可以写在一行,如:cin>>x>>y>>z;   O: Q0 t' O. B
这样写不是不允许,而是不好看,如果是不同的变量类型,那就更是没头没脑了。除了你,人家是不知道该输入什么的,所以,一般在输入语句的前面,我们一般都
. q0 T0 C" y' d0 a- {, n要做一个提示,请输入×××,让人家心里有个底,知道这个变量是做什么的。     |+ S7 F( q0 _1 W+ Q
    另外,这个函数是不用带地址符号"&"的,也不用写明变量类型,千万不要跟scanf混淆。当然他就也不检查变量输入是否合法。如:  
6 Q! J8 ^' {0 B' T2 P  O7 X- U7 Zint i;  
  s& I' R; P6 e$ |3 i, ^cout<<"please input a number:"   / p5 N2 B7 U+ J# e% P
cin>>i;   % Y! e# R, |" O1 d' f1 b
cout<<"i="<<i<<endl;   6 @6 c0 N; y" S  M
如果你输入的是一个字符如’a’那么他也不检查,但你输出的结果不是正确的,这要是手工进行检查。当然他也跟scanf一样,如果在循环内部输入不合法的变量值,那么也将陷入死循环。如下:   ) c+ J* h1 s/ j! F$ h& q; S5 F
/*一个输入不合法变量陷入死循环的例子*/  
# l) T  G" `! I* j7 o( Z1 }4 ?#include <iostream.h>   ' M6 F8 K3 {4 [/ a4 U
main()  
% b3 R4 B7 ~4 q& C{  
7 H  b2 o4 V5 L1 A/ _, c6 ?     int i;   6 Z% x* y- o% c$ T/ O/ O
     while(i!=-1)  
; ?# B( W7 ~% R     {   " Q% ?: S6 C) a4 E' T
         cout<<"i="   : s; {- z1 g4 z& s. Q: n: U
         cin>>i;    /*请输入不是一个字符如’a’试试*/  
1 |  g9 R' ~$ `8 L         cout<<endl;  
! O) }. Z) h% p! i- L7 v% W6 /     }  
. Y( d$ Y  W, l% f2 p9 A" K}  
7 ~/ i, i$ `4 j3 i0 p: A    如上一个程序,如果你输入的不合法,那就将陷入死循环。解决的办法有个一,把cin>>i;语句移到判断循环的语句中,那么,你输入的如果是不合法的变量,他将跳出循环。   * y6 C- A" S1 W- l# z. y! |
    cin是用空格来分隔输入的。请看看如下的例子:   . /5 C; F' a0 `
/*一个空格分隔使输入的变量达不到希望的值*/  
9 [( V) M( l2 j( S#include <iostream.h>  
4 }( F! }) W- k, I2 @% n, nmain()   5 Y; A7 ^7 b2 r, J
{  
" ~+ n  B' u% Z; z6 Y     char str[20];  
- S6 p/ ?) y  {3 t% O     cout<<"please input a string:";   4 q# v5 R! @0 v1 _6 v1 F9 v5 Y$ Y3 H, B
     cin>>str;    /*你试着输入"hello word"*/   & P( d+ `) f. /& _
     cout<<endl<<"str="<<str;  
! R( ?: u# V" G$ Y}   4 g: c( e5 h2 D! g  M
看得到是什么结果呢?得到的仅仅是str=hello,为什么呢?因为cin是以空格为分隔的,当你输入一个空格时,那他就认为后面的输入不属于这里了,
' t5 E$ G) f- F9 @* B, z: a/ r+ J认为应该给后面的变量了。另外,当你输入的字符串大于分配的空间时,还会出现溢出现象。当然,还有整行输入的函数,包括空格也一起输入了,以后也会学到。  
3 q* o8 [4 I+ p5 K6 M二、标准输出函数cout  
2 t) C9 K" T4 d6 W- y* K- o    说cout是函数,也跟cin一样,不知道对不对。他代表的是标准输出设备--显示器。其实前面已经用过很多次这个函数了。我们就通过一个例子来进行格式化的输出就是了,大家就体会体会这个例子就行了,比printf灵活了很多。  
/ m0 X% G: j1 c( |  z    首先,我们可以按16进制,8进制和10进制来显示我们的数据,如下:  
$ }. u8 t# k$ T: P8 ^# j/*一个按进制输出的例子*/   5 O7 d3 /. b7 i
#include<iostream.h>  
- j) ]: r, c% /$ q0 g6 x: X) J: |void main()   ' d# L$ L( S- ^; U4 C( V  C( V7 T
{   . r2 a3 r& i0 p, u# o
    int x=30, y=300, z=1024;   5 b: i! E0 j/ y& C0 ]( n# p& u
    cout<<x<<’ ’<<y<<’ ’<<z<<endl;                  //按十进制输出     T" y# D/ s( H4 Q' G$ W
    cout.setf(ios::showbase | ios::uppercase);   //设置基指示符输出和数值中的字母大写输出   ' l2 V& Q& p# /! B0 O( a
    cout<<x<<’ ’<<y<<’ ’<<z<<endl;  
2 a( T9 m! @: i  @    cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符输出和数值中的字母大写输出  
+ b9 t. y. F, X. K: m! z( N! I    cout.setf(ios::oct);                                    //设置为八进制输出,此设置不取消一直有效   ! ?) v; l. |6 G- X
    cout<<x<<’ ’<<y<<’ ’<<z<<endl;                   //按八进制输出  
, m3 M. [$ `: a6 Y  P2 p    cout.setf(ios::showbase | ios::uppercase);    //设置基指示符输出和数值中的字母大写输出   0 h- m8 @8 s( Q& ^- w$ |2 `$ d/ B
    cout<<x<<’ ’<<y<<’ ’<<z<<endl;  
" G2 f" Y- i$ b    cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符输出和数值中的字母大写输出  
: i1 t7 z. b. A1 o/ R* R9 ?    cout.unsetf(ios::oct);                                 //取消八进制输出设置,恢复按十进制输出   , l) g0 i( [* i/ A+ h8 c
    cout.setf(ios::hex);                                    //设置为十六进制输出   ! A" J/ h, u; K- m6 _6 o
    cout<<x<<’ ’<<y<<’ ’<<z<<endl;  
/ A/ {( y2 u. p; [6 k    cout.setf(ios::showbase | ios::uppercase); //设置基指示符输出和数值中的字母大写输出  
) r0 _* C9 K- U+ V: z) K3 @1 s3 q. `    cout<<x<<’ ’<<y<<’ ’<<z<<endl;  
4 s- e9 e: B( z. /, A    cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符输出和数值中的字母大写输出   " {1 R- k* ~* @) x
    cout.unsetf(ios::hex);                       //取消十六进制输出设置,恢复按十进制输出  
" m! Y2 S4 o: [! U6 C/ w+ q    cout<<x<<’ ’<<y<<’ ’<<z<<endl;  
3 ^) w* y5 a& B' m% /1 {4 `# s}  
) B6 o7 V0 h; a( Y8 w. R$ z我们用cout.setf()设置输出的格式,用cout.unsetf()取消格式。可以看出10进制在输出的时候不管有没有设置基指示符ios:: 5 A/ l- {% A" e1 ~; f
showbase,都没用,8进制再输出的时候在前面加0,而16进制是在前面加0X。而对于数值中字母大写输出,只对16进制有用,以后我们就应该看情
- u$ d7 U& ~: `; r6 I: s况使用了。当然,我们前面已经说了,还有一种方法也可以实现格式化输出,那就是使用操纵算子,如下,   # B, @4 a" s1 z
/*一个按进制输出的例子*/  
6 R/ V. O* t+ T; B& t#include<iomanip.h>   $ V# x! `5 Z  B' V0 k" k" U
void main()   8 a! N1 b9 j3 I! ^! u! M
{  
) N  z. I- z9 /* r6 m    int x=30, y=300, z=1024;  
+ {% H. W0 G5 B    cout<<x<<’ ’<<y<<’ ’<<z<<endl;       //按十进制输出  
5 p% V' E6 a7 W. {    cout<<oct<<x<<’ ’<<y<<’ ’<<z<<endl; //按八进制输出   & P7 u) b$ }( B, K5 o! a
    cout<<setiosflags(ios::showbase);    //设置基指示符  
; E- h8 O" /$ }0 {! I6 }/ A% @    cout<<x<<’ ’<<y<<’ ’<<z<<endl;       //仍按八进制输出   - N) f* F3 A$ L# }' Y# {8 V
    cout<<resetiosflags(ios::showbase); //取消基指示符  
' X3 Y6 Z9 Q$ v& A    cout<<hex<<x<<’ ’<<y<<’ ’<<z<<endl; //按十六进制输出  
% T' K4 {: `5 R    cout<<setiosflags(ios::showbase | ios::uppercase);  
" Q0 Y: u# a: E6 l4 I( r3 f                  //设置基指示符和数值中的字母大写输出,   - t+ c8 r3 X5 }4 @
    cout<<x<<’ ’<<y<<’ ’<<z<<endl; //仍按十六进制输出   . m  j; c8 t( H% Q# z1 u5 k! |
    cout<<resetiosflags(ios::showbase | ios::uppercase);   2 A6 @% u; O( O
                  //取消基指示符和数值中的字母大写输出  
) M/ z; }0 ?. h, W1 a, Z    cout<<x<<’ ’<<y<<’ ’<<z<<endl; //仍按十六进制输出  
2 /# Y, a" X0 d& a9 b    cout<<dec<<x<<’ ’<<y<<’ ’<<z<<endl; //按十进制输出   / `# [( d0 M8 @6 G
}  
8 y! g$ ]( /  [+ ^1 @( V我们用以上的程序也可以输出同样的结果,可见他的灵活。我们现在输出下列一段文字:  
- ]- ~( }$ U1 Q6 @$ |第一章   % N* ?2 T  O" |9 R( W8 t) Y+ K. g6 u
    1.1   什么是C语言...........................1   . B, j2 o- h) o4 _* {* u# j6 v
    1.11 C语言的历史..........................58  
0 J3 Q/ J6 y% t5 |5 D第二章   $ E  E) c! ?1 X
方法很多种啦,我们可以这样写:   . f# J' z/ E% [+ F. I
/*一个使用填充,宽度,对齐方式的例子*/  
0 H! J* h  J' h* a/ l8 c# u. L#include <iostream.h>   5 G6 p; v+ o6 `: m9 v
void main()   $ z' Q( H/ h8 R
{   + s7 Y- [9 j% E: W
    cout<<"第一章"<<endl;  
! B) Q, W6 s$ I$ K. O) p1 p3 y    cout<<"    ";  
  t8 /6 X; T9 U2 A+ R5 e3 j    cout.setf(ios::left);        //设置对齐方式为left   3 F/ `9 K" ^1 v( W6 {, z( /
    cout.width(7);               //设置宽度为7,不足用空格填充  
: z0 d2 n: P- g% P: C. Z    cout<<"1.1";   6 h: `" h, _* Y
    cout<<"什么是C语言";  
5 D- g0 n6 K( L+ l$ ~    cout.unsetf(ios::left);      //取消对齐方式,用缺省right方式  
0 L; C8 m2 D, _) Q: h1 F' ~    cout.fill(’.’);              //设置填充方式   : /; A; h( q, Z: v% q* x: L
    cout.width(30);              //设置宽度,只对下条输出有用  
) F/ c/ n- E, |: q$ Z9 R    cout<<1<<endl;   8 n+ ]- R0 M6 }7 L' V) b4 k
    cout<<"    ";                 
8 L6 d, D0 L* C0 t) I/ x$ T1 l4 k    cout.width(7);               //设置宽度   % T& o; r7 X4 F+ v6 o5 V
    cout.setf(ios::left);        //设置对齐方式为left  
# E1 m& l0 s! P5 t    cout.fill(’ ’);              //设置填充,缺省为空格   , Y7 j4 V" D, }& c+ m
    cout<<"1.11";  
8 [1 @/ _. S: e' ?7 q. H    cout<<"C语言的历史";  
0 w4 g2 Y) v- ~) v8 i2 @$ W( h    cout.unsetf(ios::left);      //取消对齐方式  
! T% n9 z9 N  g8 ?    cout.fill(’.’);  
) X8 ~  c+ V3 S2 W6 p) M! l    cout.width(30);  
" O$ I& T. T8 W4 S, f" `* l% Z    cout<<58<<endl;  
4 h2 L5 p8 F' N1 O    cout.fill(’ ’);  
9 f  e; T, o" g2 `, O: c. A5 u    cout<<"第二章"<<endl;   ! w# F7 k; L& K/ Z- Y. c
}  
' R! N  @5 m' X. {7 x    我们多次设置了宽度,为的是使我们的间距能一致,也使用了对齐方式,为的是使我们的数据能对齐显示,看起来美观。我们还使用了填充方式。我们下面用操纵算子来实现也是可以的。  
. o5 {5 T6 N, c' p/ j/*一个使用填充,宽度,对齐方式的例子*/   # D& B1 r7 J# Z/ m- L0 C
#include <iomanip.h>  
: U6 |0 e7 g, K; s+ ]void main()   + R# Y. j* T$ k8 }1 |
{  
+ /! M; A# a. y& d7 n' N' c' i    cout<<"第一章"<<endl;  
% o1 G9 o* x4 r    cout<<"    ";  
+ }9 /  N  Z: H  F    cout<<setiosflags(ios::left)<<setw(7);         //设置宽度为7,left对齐方式  
- S1 e4 Y& b% s2 g3 @    cout<<"1.1";  
  `% l! W% O1 H9 q$ w" i    cout<<"什么是C语言";   : g. Y) w" @6 d  q/ {& N& T8 g7 N
    cout<<resetiosflags(ios::left);                //取消对齐方式   6 g$ q4 Q; O& X/ Z+ G
    cout<<setfill(’.’)<<setw(30)<<1<<endl;         //宽度为30,填充为’.’输出  
- v. B8 U4 V4 }; |# |( t    cout<<setfill(’ ’);                            //恢复填充为空格  
9 B7 Y4 V( a* a    cout<<"    ";   % U/ T/ `7 ~! p
    cout<<setw(7)<<setiosflags(ios::left);         //设置宽度为7,left对齐方式  
) P5 D6 h& ?! c3 I    cout<<"1.11";  
5 S4 e7 C$ U2 m    cout<<"C语言的历史";   % P8 g" M' a1 n1 M
    cout<<resetiosflags(ios::left);                //取消对齐方式  
0 x$ z  q2 ?3 i0 w' i1 O$ |8 /% B    cout<<setfill(’.’)<<setw(30)<<58<<endl;        //宽度为30,填充为’.’输出      
. c1 ^. V" /$ X& O$ b    cout<<setfill(’ ’)<<"第二章"<<endl;  
2 Q: S- m9 D( Y. m+ V/ Q& V2 c}  
& M/ ?" c$ X8 R  C    我们输出了同样的效果,不过依我的性格,我更喜欢用操纵算子来进行格式化输出。最后我们看看浮点数的格式输出,如下例:   . i. m; L8 E" a0 R  @
/*关于浮点数的格式*/  
4 L: Q) ^! u8 f0 k; ^3 H; F6 R3 W5 J#include <iostream.h>  
! l- e' T! R0 F* vvoid main()  
( c8 e, m" a. e{  
" v% j8 f; N! w+ /0 O7 V    float f=2.0/3.0,f1=0.000000001,f2=-9.9;  
0 K! T/ g6 p! `- ?; D    cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;      //正常输出  
0 u- z- s" u/ k    cout.setf(ios::showpos);              //强制在正数前加+号   2 U  P1 E3 l8 h, t% w; D
    cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;   8 ]9 X5 q4 S3 ?4 _' i. W
    cout.unsetf(ios::showpos);            //取消正数前加+号  
4 R$ `$ N2 w9 }3 Q* Z; w& l    cout.setf(ios::showpoint);            //强制显示小数点后的无效0  
$ n. {; T# P6 X, V* ^    cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;  
% u# @( O$ `. x    cout.unsetf(ios::showpoint);          //取消显示小数点后的无效0   - }) m# u& f2 k
    cout.setf(ios::scientific);           //科学记数法   6 a/ x: h1 l' l, ?- W. G3 H: b4 z
    cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;   5 e6 L0 J, p  y" m, @' N/ c1 x& r
    cout.unsetf(ios::scientific);         //取消科学记数法     p+ O$ V* i6 W: v  @
    cout.setf(ios::fixed);                //按点输出显示  
" L0 g- l" {; R! q& B4 M4 I    cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;   " o/ /# H2 r: n$ {; z
    cout.unsetf(ios::fixed);              //取消按点输出显示  
/ j! `+ k5 C( _( b* n* U: t: v    cout.precision(18);                   //精度为18,正常为6  
% |8 D' D' Y. t* k( [8 Y2 e' P    cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;   % Z! _$ T3 h, |- j5 ~
    cout.precision(6);                    //精度恢复为6  
) U- Z  J0 w- p2 F3 y. g}  
, ~6 S3 d$ @3 Y2 W    同样,我们也一样能用操纵算子实现同样的功能:  
0 k3 [! A4 y8 q2 q7 g/*关于浮点数的格式*/  
1 j, A) n1 K" x( O. L7 r6 C#include <iomanip.h>  
0 r1 V3 w! O. D2 }" g/ pvoid main()     r7 a8 d) |* Q; B6 x5 S* B$ a
{  
' e. v+ R2 b  ?5 V: d& ~    float f=2.0/3.0,f1=0.000000001,f2=-9.9;  
8 f+ R- A3 @9 P% p  [! |8 M    cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;      //正常输出  
- @+ b1 H4 g8 ?7 p8 c! U2 y    cout<<setiosflags(ios::showpos);      //强制在正数前加+号   % t$ C& J: a# R( u. m6 D
    cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;  
/ k$ m: |" z8 n+ Y3 I; h    cout<<resetiosflags(ios::showpos);    //取消正数前加+号  
$ `, H9 @( }# k: [8 L/ g7 y    cout<<setiosflags(ios::showpoint);    //强制显示小数点后的无效0  
5 Z$ l/ I$ }2 R- {4 s1 p    cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;  
7 N0 C  z8 N- ~3 F; ?    cout<<resetiosflags(ios::showpoint); //取消显示小数点后的无效0   5 u0 L, j2 t/ Z9 e: j
    cout<<setiosflags(ios::scientific);   //科学记数法  
  |4 r; E5 z7 k% r# c    cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;  
+ l. d  q+ k6 U. h) @, {    cout<<resetiosflags(ios::scientific); //取消科学记数法   0 n) z' q) P3 P
    cout<<setiosflags(ios::fixed);        //按点输出显示   : A4 a+ t& P# t5 }1 L
    cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;   3 s4 @, h! @3 b5 G) [9 w
    cout<<resetiosflags(ios::fixed);       //取消按点输出显示  
% M9 t. `- g, }6 H    cout<<setprecision(18);               //精度为18,正常为6   4 t' O  @/ X) D
    cout<<f<<’ ’<<f1<<’ ’<<f2<<endl;   ! G( x+ i! Q" d
    cout<<setprecision(6);                //精度恢复为6  
6 H0 Q7 r, /) o) |9 /# {6 I  ?- f}   : X* I( M) v5 b5 R5 t# [
   在c/c++系统中除了标准的输入输出外,还提供了更多的输入函数。这写函数主要有getch(),getche(),   * }  w! {/ Q: Z6 g3 ]1 V& S' Y0 l, _
getchar
1 Y0 e; P& d. p* Q% b(),cin.get(),putch(),putchar(),cout.put(),gets(),cin.getline(),puts()。另外 % I" m- O' s9 c& M; d6 M
还有些为了让缓冲区不影响程序的正确操作的缓冲去的操作,如:cin.putback(),fflush(stdin),cout.flush().我们 ) j8 z2 u9 y% z
做一下简单的说明。   + _0 d' N0 |; A" B3 @
    1、getch()和getche(),非缓冲式输入,从键盘读入一个字符。getch()读入字符不显示。有conio.h支持。   1 a, D. e& @6 p4 d2 ~* s0 }/ s
    2、cin.get(),getchar(),缓冲式输入,从键盘读入一个字符,并显示。getchar()由stdio.h支持,cin.get()由iostream.h支持。   . `4 p! f: p2 G# X/ s, X
    3、putch()和putchar(),非缓冲式输出,输出一个字符到显示器。putch()由conio.h支持,putchar()由stdio.h支持。   ' Q9 j- w. i1 Z9 `) H
    4、cout.put(),缓冲式输出,输出一个字符到显示器。由iostream.h支持。   ( Z1 p; j3 N1 t. @8 P; }
    5、gets()和cin.geline(),缓冲式输入,读入一字符串(包括空格,不包括最后的回车),gets()由stdio.h支持,cin.getline()由iostream.h支持。  
, B/ c9 U  p' J    6、puts(),非缓冲输出,输出一个字符串,由stdio.h支持。   . o2 }/ I/ w$ s% e& {8 W  Q5 n1 O
    7、cin.putback(),把一个字符送回输入缓冲区。  
4 z; w  @/ U/ ?. J) P; D3 N    8、fflush(stdin),清除输入缓冲区操作。无法清除cin.get()等带来的操作。  
$ `' J8 Y) r7 J& n* Y1 F    9、cout.flush(),清楚输出缓冲区。  
  @! D/ W* {9 F" L4 D5 r. n" T* I) U    在这里我们稍微说一下输入/输出缓冲区,这是为了减少程序访问io带来中断而设的一段空间。当程序满足某个刷新条件时,那就将清理缓冲区。具体条件为:  
* |: c# {- ^; g  O; f    1、输入缓冲区  
1 H7 K$ e4 z/ B5 q9 m( u# Ka,程序要求输入时,按下了回车键。   6 d4 j( x8 e! H, U0 a
b,遇到程序结束。  
9 w: ^7 |5 S. T4 x, oc,遇到下一条输入语句。  
: Y" ~! Q0 T3 o6 B# i0 z, xd,遇到清除缓冲区操作   ( V7 m$ r& X9 o/ S+ M* y9 /
e,缓冲区溢出  
, Z- |, D4 w! O( b+ i/ /- E1 t8 d; U    2、输出缓冲区  
1 S& h4 V8 P* Q8 `7 b: q$ m3 Oa,输出缓冲区溢出  
( q- {3 v0 }  k: `8 {b,遇到下一条输入语句  
0 J/ A$ E% M4 V+ s5 P5 a* D) `c,使用刷新缓冲区迫使清除  
: m+ e  c; P$ C6 }* i# E/ p- w) B0 jd,程序结束。   0 L3 z, H. |6 @+ Z
    缓冲区操作有时会带来程序的不正确的输入,如前面说的scanf(),在连续输入的时候,会把一个回车赋给下一个字符变量。我们操作的时候一定要注意。 5 G" E6 e5 o2 [& u# ?
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值