格尔齿轮厂工资怎样: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<
}
% 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
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<
}
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
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<
cout<
T3 s+ H& w5 }* B# ^6 Q ^' W cout.setf(ios::oct); //设置为八进制输出,此设置不取消一直有效 - ?0 [% _$ R2 I' b$ \9 {! q+ U! v# @. x
cout<
# O8 k/ r* j: _. ~9 Y- r7 R cout<
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<
cout<
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<
} * 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<
cout<
cout<
cout<
cout<
cout<
& g" b5 R1 O& n1 V% N$ n9 b cout<
cout<
}
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
void main()
9 G8 q0 v: S/ C9 z7 @! W{ 2 Q* d8 i7 O% v9 k
cout<<"第一章"<
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<
( 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<
cout.fill(’ ’); ( M, a& b% C: ]
cout<<"第二章"<
我们多次设置了宽度,为的是使我们的间距能一致,也使用了对齐方式,为的是使我们的数据能对齐显示,看起来美观。我们还使用了填充方式。我们下面用操纵算子来实现也是可以的。
! m3 \( p1 n! k0 z$ C3 r7 Z$ L/*一个使用填充,宽度,对齐方式的例子*/ , b, J6 E$ P" o( F5 a, t
#include
void main() : H* `( h, Y3 F" e8 J
{ 2 X3 V# Y% c8 A* A
cout<<"第一章"<
cout<
cout<<"1.1"; / ?+ `* C1 j! N2 B
cout<<"什么是C语言";
" w' Q- i- J6 J cout<
cout<
cout<<" ";
1 b5 t7 Y( Q+ ]* {1 C cout<
cout<<"1.11";
; B/ K4 _- o4 ^' X/ U cout<<"C语言的历史";
, P- |- J7 p' b* l; \ cout<
我们输出了同样的效果,不过依我的性格,我更喜欢用操纵算子来进行格式化输出。最后我们看看浮点数的格式输出,如下例:
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<
cout.setf(ios::showpos); //强制在正数前加+号
7 E$ `5 W" \, l0 q) ~ cout<
cout.unsetf(ios::showpos); //取消正数前加+号 j, J d9 d# @
cout.setf(ios::showpoint); //强制显示小数点后的无效0 9 b) N0 g5 s9 [$ e4 h. ^; X
cout<
cout.setf(ios::scientific); //科学记数法
$ G2 ~% J* |& }" {0 k2 P5 g v+ S cout<
7 w# G4 ~+ o1 ~% k cout.setf(ios::fixed); //按点输出显示 9 W: s0 ~# X j W
cout<
cout.precision(18); //精度为18,正常为6
( r# ~5 {* w5 }5 S# c2 a! i* r5 h cout<
}
" 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<
cout<
cout<
cout<
cout<
cout<
cout<
}
: 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技术博客