- C++面向對象程序設計
- 杜茂康等編著
- 1986字
- 2019-01-01 05:54:51
1.5 數據輸入與輸出
程序執行的基本邏輯是:輸入數據 → 處理數據 → 輸出結果。數據的輸入/輸出幾乎是每個程序不可避免的問題。
1.5.1 流的概念
在C++中,I/O(Input/Output,輸入/輸出)數據是一些從源設備到目標設備的字節序列,稱為字節流。除了圖像、聲音數據外,字節流通常代表的都是字符,因此,在多數情況下的流(stream)都是從源設備到目標設備的字符序列,如圖1-5所示。

圖1-5 流示意圖
流分為輸入流和輸出流兩類。輸入流(input stream)是指從輸入設備流向內存的字節序列。例如,在圖1-5中,若源設備是鍵盤,目標設備是內存,則表示的是輸入流,表示通過鍵盤輸入數據到內存變量中。輸出流(output stream)是指從內存流向輸出設備的字節序列。例如,在圖1-5中,若源設備是內存,目標設備是顯示器,就是輸出流,表示把內存中的字符逐個輸出到顯示屏幕上。
在C++中,標準輸入設備通常是指鍵盤,標準輸出設備通常是指顯示器。為了從鍵盤輸入數據,或為了將數據輸出到顯示器屏幕上,程序中必須包含頭文件iostream.h。這個頭文件包括了輸入流istream和輸出流ostream兩種數據類型,而且用這兩種數據類型定義了兩個變量“istream cin”和“ostream cout”。其中,cin(讀作see-in)用于從鍵盤輸入數據,cout(讀作see-out)用于將內存數據輸出到顯示器。
1.5.2 cin和析取運算符>>
在C++程序中,常用cin輸入數據。其用法如下:
cin>>x;
程序執行到cin語句時,就會停下來等待鍵盤數據的輸入,輸入數據被插入到輸入流中,數據輸完后按Enter鍵結束。當遇到運算符>>時,就從輸入流中提取一個數據,存入內存變量x中。
① cin是在iostream.h中預定義的一個標準輸入設備(一般代表鍵盤),>>是析取運算符,用于從輸入流中析取數據(即從流中分析和提取數據),并存于其后的變量x中。x是程序中定義的變量名,原則上x應該是系統內置的簡單數據類型,如int、char、double等。
② 在一條cin語句中可以同時為多個變量輸入數據。在輸入數據時應當輸入與cin語句中變量個數相同的數據,各輸入數據之間用一個或多個空白(包括空格、回車、Tab)作為間隔符,全部數據輸入完成后,按Enter鍵結束。例如,下面的程序段:
int x1; double x2; char x3; cin>>x1>>x2>>x3;
假設x1為5,x2為3.4,x3為'A',則下面的兩種輸入方式等效:
5 3.4 A
或
5 3.4 A
當一條cin語句中有多個運算符>>時,就需要從鍵盤輸入多個數據到輸入流中,每當遇到一個>>時,就從輸入流中提取一個數據存入其后的變量中。
可以把一條cin語句分解為多條cin語句,也可以把多條cin語句合并為一條語句,所以上面的輸入語句與下面的語句組等效:
cin>>x1; cin>>x2; cin>>x3;
③ 在>>后面只能出現變量名,這些變量應該是系統預定義的簡單類型,否則將出現錯誤。下面的語句是錯誤的:
cin>>"x=">>x; //錯誤,>>后面含有字符串"x=" cin>>12>>x; //錯誤,>>后面含有常數12 cin>>'x'>>x; //錯誤,>>后面含有字符'x'
④ cin具有自動識別數據類型的能力,析取運算符>>將根據其后變量的類型從輸入流中為它們提取對應的數據。例如:
cin>>x;
假設輸入數據2,析取運算符>>將根據其后的x的類型決定輸入的2到底是數字還是字符。若x是char類型,則2就是字符;若x是int,float之類的類型,則2就是一個數字。
再如,若輸入34,且x是char類型,則只有字符3被存儲到x中,4將繼續保存在流中;若x是int或float,則34就會存儲到x中。
⑤ 數值型數據的輸入。在讀取數值型數據時,析取運算符>>首先略掉數據前面的所有空白符號,如果遇到正、負號或數字,就開始讀入,包括浮點型數據的小數點,并在遇到空白符或其他非數字字符時停止。例如:
int x1; double x2; char x3; cin>>x1>>x2>>x3;
假如輸入“35.4A”并按Enter鍵,第1個析取運算符>>根據x1的類型int,從輸入流中提取一個整數存儲在x1中,這個整數只能是35。因為接下來的是“.”不是整數的有效數字,所以提取x1后,輸入流中的數據是“.4A”。第2個析取運算符>>將從輸入流中為x2提取數據,x2是double型,所以只能把“.4”存儲到x2中,因為接在4后面的A不是有效的數字,所以x2的結果為0.4(0由系統產生);第3個析取運算符>>為x3提取數據,x3是char型,所以字符'A'就被輸入到x3中。
這個結果或許不正確,卻從另一方面說明了在輸入數據時,一定要注意數據之間間隔符的正確輸入。結合上述各種情況,來看一個數據輸入的綜合性例子。
【例1-2】 假設有變量定義語句如下:
int a,b; double z; char ch;
下面的語句說明數據輸入的含義。
語句 輸入 內存變量的值
1 cin>>ch; A ch='A' 2 cin>>ch; AB ch='A',而'B'被保留在輸入流中等待被讀取 3 cin>>a; 32 a=32 4 cin>>a; 32.23 a=32,后面的.23被保留在輸入流中等待被讀取 5 cin>>z; 76.21 z=76.21 6 cin>>z; 65 z=65.0 7 cin>>a>>ch>>z 23 B 3.2 a=23,ch='B',Z=3.2 8 cin>>a>>ch>>z 23B3.2 a=23,ch='B',Z=3.2 9 cin>>a>>b>>z 23 32 a=23,b=32,計算機等待輸入下一個數據存入z 10 cin>>a>>z 2 3.2 24 a=2,z=3.2,而24被保留在輸入流中等待被讀取 11 cin>>a>>ch 132 a=132,計算機等待輸入 ch的值 12 cin>>ch>>a 132 ch='1',a=32
1.5.3 cout和插入運算符<<
在C++程序中,一般用cout輸出數據,其用法如下:
cout<<x;
程序執行到cout語句時,將在顯示屏幕上把x的值顯示出來。x可以是字符串、變量或常量。
cout是在iostream.h中定義的標準輸出設備(一般代表顯示器),<<是插入運算符,用來將其右邊的x的值插入到輸出流中(cout是流向的目的地,所以最終是把x顯示在屏幕上)。
(1)輸出字符類型的數據
字符類型數據包括字符常量、字符串常量、字符變量和字符串變量。對于字符常量和字符串常量,cout將把它們原樣輸出在屏幕上;對于字符變量和字符串變量,cout將把變量的值輸出到顯示屏幕上。例1-3是一個字符輸出示例程序。
【例1-3】 用cout輸出字符數據。
//Eg1-3.cpp #include<iostream.h> void main() { char ch1='c'; char ch2[]="Hellow C++!"; cout<<ch1; cout<<ch2; cout<<"C"; cout<<"Hellow everyone!"; }
程序的運行結果如下(這個結果是由程序中的4條cout語句共同輸出的):
cHellow C++!CHellow everyone!
(2)連續輸出
cout語句能夠同時輸出多個數據,其用法如下:
cout<<x1<<x2<<x3<<…;
其中,x1,x2和x3可以是相同或不同類型的數據,此命令將依次把x1、x2和x3的值輸出到顯示屏幕上。
cout的這種格式表明,可以把多條cout語句合并成一條語句。當然,也可以把一條cout語句分解為多條語句。將Eg1-3.cpp程序中的4條cout語句合并成一條命令,不會影響程序的功能,其運行結果完全相同:
cout<<ch1<<ch2<<"C"<<"Hellow everyone!";
與C語言一樣,在C++程序中也可以將一條命令寫在多行上。例如,上面的語句也可寫成下面的形式:
cout<<ch1 <<ch2 <<"C" <<"Hellow everyone!";
(3)輸出換行
例1-3的輸出結果并不清晰,如果能夠把它們輸出在多行上,效果會更好。在cout語句中,可以通過輸出換行符“\n”或endl操縱符將輸出光標移動到下一行的開頭處。例1-4是對例1-3的改寫。
【例1-4】 在例1-3的輸出語句中增加換行符。
//Eg1-4.cpp #include<iostream.h> void main(){ char ch1='c'; char ch2[]="Hellow C++!"; cout<<ch1<<endl; cout<<ch2<<"\n"; cout<<"C"<<endl; cout<<"Hellow everyone!\n"; }
本程序的輸出如下:
c Hellow C++! C Hellow everyone!
endl和“\n”具有相同的功能,它們可以出現在cout語句中任何位置的<<的后面。“\n”還可以直接放在字符串常數的后面,如語句“cout<<"Hellow everyone!\n"”最后的“\n”。
(4)輸出數值類型的數據
數值型常量數據可以利用cout直接輸出,例如:
cout<<1<<2<<3<<endl;
將在屏幕上顯示:123。數值變量的輸出也是如此,如下面的程序段:
int x1=23; float x2=34.1; double x3=67.12; cout<<x1<<x2<<x3<<900;
其中的cout語句將在屏幕上輸出“2334.167.12900”。
從上面兩條輸出語句的結果可以看出:cout在輸出多個數據時,不會在數據之間插入任何間隔符,其結果是使輸出數據變得含混不清,如數值1,2,3被輸出成了123。
針對這種情況,需要在cout輸出語句中添加一些數據間隔符。例如,可將上面的語句改寫為:
cout<<1<<" "<<2<<" "<<3<<endl; cout<<"x1="<<x1<<" "<<"x2="<<x2<<" "<<"x3="<<x3<<endl<<900<<endl;
下面是這兩條語句的輸出結果,顯然它比前面的輸出結果更清晰。
1 2 3 x1=23 x2=34.1 x3=67.12 900
1.5.4 輸出格式控制符
在程序運行過程中,常常需要按照一定的格式輸出其運行結果,如設置數值精度、設置小數點的位置、設置輸出數據寬度或對齊方式……數據輸出格式的設置是程序設計的一個重要內容,影響到程序結果的清晰性。
C++提供了許多控制數據輸入輸出格式的函數和操縱符(也稱為操縱函數或操縱算子),如setprecision、setw、right等,它們都是在iomanip.h中定義的,應用它們時要包含該頭文件。
(1)設置浮點數的精度
在需要設置輸出數據的精度時,可以用操縱函數setprecision()。其用法如下:
setprecision(n)
其中,n代表有效數位,包括整數的位數和小數的位數。如setprecision(3)將所有數值的輸出精度都指定為3位有效數字,直到再次用setprecision()改變輸出精度為止。setprecision()是在iomanip.h中定義的,在使用時要包含該頭文件。例如,語句
cout<<setprecision(3)<<3.1415926<<" "<<2.4536<<endl;
將輸出“3.14 2.45”。
(2)設置輸出域寬和對齊方式
在C++中,可以用操縱函數setw()設置輸出數據占用的列數(域寬,即占用的字符個數)。setw()的用法如下:
setw(n)
其中,n是輸出數據占用屏幕寬度的字符個數,在默認情況下,輸出數據按右對齊。若輸出數據的位數比n小,則左邊留空。若輸出數據的實際位數比n大,則輸出數據將自動擴展到所需占用的列數。例如:
cout<<"1234567812345678"<<endl; //L1 cout<<setw(8)<<23.27<<setw(8)<<78<<endl; //L2 cout<<setw(8)<<"Abc"<<78<<endl; //L3
上述語句的輸出結果如下:
1234567812345678 23.27 78 Abc78
setw()只對緊隨其后的一個輸出數據有效,語句L3中的setw(8)只對跟在其后的字符串"Abc"有效,所以最后的“78”就按默認方式輸出,緊接在"Abc"的后邊。
(3)設置對齊方式
操縱函數setiosflags()和resetiosflags()可用于設置或取消輸入/輸出數據的各種格式,包括改變數制基數、設置浮點數的精度、轉換字母大小寫、設置對齊方式等。它們的用法如下:
setiosflags(long f); resetiosflags(long f);
在iostream.h中還定義了兩個表示對齊方式的常數,表示左對齊的常數值是ios::left,表示右對齊的常數值是ios::right,它們可作為setiosflags( )和resetiosflags( )操縱符的參數,用于設置輸出數據的對齊方式。
在默認方式下,C++按右對齊方式輸出數據。當用setiosflags()設置輸出對齊方式成功后,將一直有效,直到用resetiosflags()取消它。
【例1-5】 用setiosflags()和resetiosflags()設置和取消輸出數據的對齊方式。
//Eg1-5.cpp #include<iostream.h> //L1 #include<iomanip.h> //L2 void main(){ //L3 cout<<"123456781234567812345678"<<endl; //L4 cout<<setiosflags(ios::left)<<setw(8)<<456<<setw(8)<<123<<endl; //L5 cout<<resetiosflags(ios::left)<<setw(8)<<123<<endl; //L6 }
這個程序的輸出結果如下:
123456781234567812345678 456 123 123
輸出結果的第1行是語句行L4輸出的;第2行是語句行L5輸出的,輸出的兩個數據各占8位,且設置了左對齊方式;第3行是語句行L6的輸出,輸出數據占8位,由于在輸出之前用resetiosflags(ios::left)操縱符取消了左對齊,使數據輸出又成了默認的右對齊方式,所以輸出數據的左邊留了5個空白。
1.5.5 數制基數
C++在iostream.h中預定義了hex、oct、dec等操縱符。分別表示十六進制數、八進制數和十進制數。在默認方式下,C++按照十進制數形式輸入、輸出數據。當要按其他進制輸入、輸出數據時,就需要在cin和cout語句中指定數據的基數。在用鍵盤輸入數據時:
十進制整數:直接輸入數據本身,如78。
十六進整數:在要輸入的數據前加0x或0X,如0x1A(對應的十進制數是26)。
八進制整數:在輸入的數據前加0,如043(代表十進制數35)。
【例1-6】 輸入、輸出不同進制的數據。
//Eg1-6.cpp #include<iostream.h> void main(){ int x=34; cout<<hex<<17 <<" "<<x<<" "<<18<<endl; cout<<17 <<" "<<oct <<x<<" "<<18<<endl; cout<<dec<<17 <<" "<<x<<" "<<18<<endl; int x1, x2, x3, x4; cout<<"輸入 x1(oct), x2(oct), x3(hex), x4(dec):"<<endl; cin>>oct>>x1; //八進制數 cin>>x2; //八進制數 cin>>hex>>x3; //輸入十六進制數 cin>>dec>>x4; //輸入十進制數 cout<<"x1="<<x1<<"\tx2="<<x2<<"\tx3="<<x3<<"\tx4="<<x4<<endl; }
設置數制基數后,它將一直有效,直到遇到下一個基數設置。本程序運行結果如圖1-6所示。

圖1-6 程序運行結果
其中,第1行和第2行的11是十六進制數,第2行的42和22是八進制數,第3行是十進制數。第5行是從鍵盤輸入的數據,013、034是八進制數,0x2a是十六進制數,18是十進制數。最后一行是按十進制輸出的數據。
- Practical Data Analysis
- 中文版Photoshop CS5數碼照片處理完全自學一本通
- Mastercam 2017數控加工自動編程經典實例(第4版)
- 傳感器技術實驗教程
- Mastering VMware vSphere 6.5
- 圖形圖像處理(Photoshop)
- 電腦上網直通車
- 80x86/Pentium微型計算機原理及應用
- WordPress Theme Development Beginner's Guide(Third Edition)
- 貫通Java Web開發三劍客
- RedHat Linux用戶基礎
- R Data Analysis Projects
- 巧學活用Photoshop
- 系統建模與控制導論
- 歐姆龍CP1H型PLC編程與應用