(C++-面向?qū)ο蟪绦蛟O(shè)計(jì)-譚浩強(qiáng))第13章-輸入輸出流_第1頁
(C++-面向?qū)ο蟪绦蛟O(shè)計(jì)-譚浩強(qiáng))第13章-輸入輸出流_第2頁
(C++-面向?qū)ο蟪绦蛟O(shè)計(jì)-譚浩強(qiáng))第13章-輸入輸出流_第3頁
(C++-面向?qū)ο蟪绦蛟O(shè)計(jì)-譚浩強(qiáng))第13章-輸入輸出流_第4頁
(C++-面向?qū)ο蟪绦蛟O(shè)計(jì)-譚浩強(qiáng))第13章-輸入輸出流_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第章 輸入輸出流13.1 C+的輸入和輸出13.2 標(biāo)準(zhǔn)輸出流13.3 標(biāo)準(zhǔn)輸入流13.4 文件操作與文件流13.5 字符串流以前所用到的輸入和輸出,都是以終端為對(duì)象的,即從鍵盤輸入數(shù)據(jù),運(yùn)行結(jié)果輸出到顯示器屏幕上。從操作系統(tǒng)的角度看,每一個(gè)與主機(jī)相連的輸入輸出設(shè)備都被看作一個(gè)文件。除了以終端為對(duì)象進(jìn)行輸入和輸出外,還經(jīng)常用磁盤(光盤)作為輸入輸出對(duì)象,磁盤文件既可以作為輸入文件,也可以作為輸出文件。程序的輸入指的是從輸入文件將數(shù)據(jù)傳送給程序,程序的輸出指的是從程序?qū)?shù)據(jù)傳送給輸出文件。C+的輸入與輸出包括以下方面的內(nèi)容: 13.1 C+的輸入和輸出 13.1.1 輸入輸出的含義(1) 對(duì)系統(tǒng)

2、指定的標(biāo)準(zhǔn)設(shè)備的輸入和輸出。即從鍵盤輸入數(shù)據(jù),輸出到顯示器屏幕。這種輸入輸出稱為標(biāo)準(zhǔn)的輸入輸出,簡(jiǎn)稱標(biāo)準(zhǔn)I/O。(2) 以外存磁盤文件為對(duì)象進(jìn)行輸入和輸出,即從磁盤文件輸入數(shù)據(jù),數(shù)據(jù)輸出到磁盤文件。以外存文件為對(duì)象的輸入輸出稱為文件的輸入輸出,簡(jiǎn)稱文件I/O。(3) 對(duì)內(nèi)存中指定的空間進(jìn)行輸入和輸出。通常指定一個(gè)字符數(shù)組作為存儲(chǔ)空間(實(shí)際上可以利用該空間存儲(chǔ)任何信息)。這種輸入和輸出稱為字符串輸入輸出,簡(jiǎn)稱串I/O。C+采取不同的方法來實(shí)現(xiàn)以上種輸入輸出。為了實(shí)現(xiàn)數(shù)據(jù)的有效流動(dòng),C+系統(tǒng)提供了龐大的I/O類庫(kù),調(diào)用不同的類去實(shí)現(xiàn)不同的功能。在C語言中,用printf和scanf進(jìn)行輸入輸出,往

3、往不能保證所輸入輸出的數(shù)據(jù)是可靠的安全的。在C+的輸入輸出中,編譯系統(tǒng)對(duì)數(shù)據(jù)類型進(jìn)行嚴(yán)格的檢查,凡是類型不正確的數(shù)據(jù)都不可能通過編譯。因此C+的I/O操作是類型安全(type safe)的。C+的I/O操作是可擴(kuò)展的,不僅可以用來輸入輸出標(biāo)準(zhǔn)類型的數(shù)據(jù),也可以用于用戶自定義類型的數(shù)據(jù)。C+對(duì)標(biāo)準(zhǔn)類型的數(shù)據(jù)和對(duì)用戶聲明類型數(shù)據(jù)的輸入輸出,采用同樣的方法處理。C+通過I/O類庫(kù)來實(shí)現(xiàn)豐富的I/O功能。C+的輸入輸出優(yōu)于C語言中的printf和scanf,但是比較復(fù)雜,要掌握許多細(xì)節(jié)。13.1.2 C+的I/O對(duì)C的發(fā)展類型安全和可擴(kuò)展性C+的輸入輸出流是指由若干字節(jié)組成的字節(jié)序列,這些字節(jié)中的數(shù)據(jù)

4、按順序從一個(gè)對(duì)象傳送到另一對(duì)象。流表示了信息從源到目的端的流動(dòng)。在輸入操作時(shí),字節(jié)流從輸入設(shè)備(如鍵盤、磁盤)流向內(nèi)存,在輸出操作時(shí),字節(jié)流從內(nèi)存流向輸出設(shè)備(如屏幕、打印機(jī)、磁盤等)。流中的內(nèi)容可以是ASCII字符、二進(jìn)制形式的數(shù)據(jù)、圖形圖像、數(shù)字音頻視頻或其他形式的信息。實(shí)際上,在內(nèi)存中為每一個(gè)數(shù)據(jù)流開辟一個(gè)內(nèi)存緩沖區(qū),用來存放流中的數(shù)據(jù)。流是與內(nèi)存緩沖區(qū)相對(duì)應(yīng)的,或者說,緩沖區(qū)中的數(shù)據(jù)就是流。13.1.3 C+的輸入輸出在C+中,輸入輸出流被定義為類。C+的I/O庫(kù)中的類稱為流類(stream class)。用流類定義的對(duì)象稱為流對(duì)象。cout和cin并不是C+語言中提供的語句,它們是i

5、ostream類的對(duì)象,在未學(xué)習(xí)類和對(duì)象時(shí),在不致引起誤解的前提下,為敘述方便,把它們稱為cout語句和cin語句。在學(xué)習(xí)了類和對(duì)象后,我們對(duì)C+的輸入輸出應(yīng)當(dāng)有更深刻的認(rèn)識(shí)。1. iostream類庫(kù)中有關(guān)的類C+編譯系統(tǒng)提供了用于輸入輸出的iostream類庫(kù)。iostream這個(gè)單詞是由個(gè)部分組成的,即i-o-stream,意為輸入輸出流。在iostream類庫(kù)中包含許多用于輸入輸出的類。常用的見書中表.1。ios是抽象基類,由它派生出istream類和ostream類,兩個(gè)類名中第個(gè)字母i和o分別代表輸入(input)和輸出(output)。istream類支持輸入操作,ostream

6、類支持輸出操作,iostream類支持輸入輸出操作。iostream類是從istream類和ostream類通過多重繼承而派生的類。其繼承層次見圖.1表示。圖.1C+對(duì)文件的輸入輸出需要用ifstream和ofstream類,兩個(gè)類名中第個(gè)字母i和o分別代表輸入和輸出,第個(gè)字母f代表文件(file)。ifstream支持對(duì)文件的輸入操作,ofstream支持對(duì)文件的輸出操作。類ifstream繼承了類istream,類ofstream繼承了類ostream,類fstream繼承了類iostream。見圖.2。圖.2I/O類庫(kù)中還有其他類,見圖.圖2. 與iostream類庫(kù)有關(guān)的頭文件iost

7、ream類庫(kù)中不同的類的聲明被放在不同的頭文件中,用戶在自己的程序中用#include命令包含了有關(guān)的頭文件就相當(dāng)于在本程序中聲明了所需要用到的類??梢該Q一種說法: 頭文件是程序與類庫(kù)的接口,iostream類庫(kù)的接口分別由不同的頭文件來實(shí)現(xiàn)。常用的有iostream包含了對(duì)輸入輸出流進(jìn)行操作所需的基本信息。fstream用于用戶管理的文件的I/O操作。strstream用于字符串流I/O。stdiostream用于混合使用C和C+的I/O機(jī)制時(shí)。iomanip在使用格式化I/O時(shí)應(yīng)包含此頭文件。3. 在iostream頭文件中定義的流對(duì)象在iostream頭文件中定義的類有ios,istre

8、am,ostream,iostream,istream _withassign, ostream_withassign,iostream_withassign等。iostream.h包含了對(duì)輸入輸出流進(jìn)行操作所需的基本信息。因此大多數(shù)C+程序都包括iostream.h。在iostream.h頭文件中不僅定義了有關(guān)的類,還定義了種流對(duì)象,見書中表.2。cin是istream的派生類istream_withassign的對(duì)象,它是從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)輸入到內(nèi)存的數(shù)據(jù)流,稱為cin流或標(biāo)準(zhǔn)輸入流。cout是ostream的派生類ostream_withassign的對(duì)象,它是從內(nèi)存輸入到標(biāo)準(zhǔn)輸出設(shè)

9、備(顯示器) 的數(shù)據(jù)流,稱為cout流或標(biāo)準(zhǔn)輸出流。cerr和clog作用相似,均為向輸出設(shè)備(顯示器) 輸出出錯(cuò)信息。因此用鍵盤輸入時(shí)用cin流,向顯示器輸出時(shí)用cout流。向顯示器輸出出錯(cuò)信息時(shí)用cerr和clog流。在iostream頭文件中定義以上個(gè)流對(duì)象用以下的形式(以cout為例): ostream cout (stdout);在定義cout為ostream流類對(duì)象時(shí),把標(biāo)準(zhǔn)輸出設(shè)備stdout作為參數(shù),這樣它就與標(biāo)準(zhǔn)輸出設(shè)備(顯示器)聯(lián)系起來,如果有cout3;就會(huì)在顯示器的屏幕上輸出。4. 在iostream頭文件中重載運(yùn)算符“”本來在C+中是被定義為左位移運(yùn)算符和右位移運(yùn)算符

10、的,由于在iostream頭文件中對(duì)它們進(jìn)行了重載,使它們能用作標(biāo)準(zhǔn)類型數(shù)據(jù)的輸入和輸出運(yùn)算符。所以,在用它們的程序中必須用#include命令把iostream包含到程序中。#include 在istream和ostream類(這兩個(gè)類都是在iostream中聲明的)中分別有一組成員函數(shù)對(duì)位移運(yùn)算符“”進(jìn)行重載,以便能用它輸入或輸出各種標(biāo)準(zhǔn)數(shù)據(jù)類型的數(shù)據(jù)。對(duì)于不同的標(biāo)準(zhǔn)數(shù)據(jù)類型要分別進(jìn)行重載,如ostream operator (int );/用于向輸出流插入一個(gè)int數(shù)據(jù)ostream operator (float ); /用于向輸出流插入一個(gè)float數(shù)據(jù)ostream operato

11、r (char ); /用于向輸出流插入一個(gè)char數(shù)據(jù)ostream operator (char *); /用于向輸出流插入一個(gè)字符串?dāng)?shù)據(jù)等。如果在程序中有下面的表達(dá)式: coutC+;根據(jù)第章所介紹的知識(shí),上面的表達(dá)式相當(dāng)于cout.operator”重載為對(duì)以下標(biāo)準(zhǔn)類型的提取運(yùn)算符: char,signed char,unsigned char,short,unsigned short,int,unsigned int,long,unsigned long,float, double,long double, char*,signed char*,unsigned char*等。 在o

12、stream類中將“”重載為插入運(yùn)算符,其適用類型除了以上的標(biāo)準(zhǔn)類型外,還增加了一個(gè)void*類型。如果想將“”用于自己聲明的類型的數(shù)據(jù),就不能簡(jiǎn)單地采用包含iostream頭文件來解決,必須自己用第章的方法對(duì)“”進(jìn)行重載。怎樣理解運(yùn)算符“”的作用呢?它們指出了數(shù)據(jù)移動(dòng)的方向,例如a箭頭方向表示把數(shù)據(jù)放入a中。而a箭頭方向表示從a中拿出數(shù)據(jù)。+標(biāo)準(zhǔn)輸出流是流向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù)。13.2 標(biāo)準(zhǔn)輸出流ostream類定義了個(gè)輸出流對(duì)象,即cout,cerr,clog。分述如下。1. cout流對(duì)象cout是console output的縮寫,意為在控制臺(tái)(終端顯示器)的輸出。(1) c

13、out不是C+預(yù)定義的關(guān)鍵字,它是ostream流類的對(duì)象,在iostream中定義。(2) 用“cout”輸出基本類型的數(shù)據(jù)時(shí),可以不必考慮數(shù)據(jù)是什么類型,系統(tǒng)會(huì)判斷數(shù)據(jù)的類型,并根據(jù)其類型選擇調(diào)用與之匹配的運(yùn)算符重載函數(shù)。13.2.1 (3) cout流在內(nèi)存中對(duì)應(yīng)開辟了一個(gè)緩沖區(qū),用來存放流中的數(shù)據(jù),當(dāng)向cout流插入一個(gè)endl時(shí),不論緩沖區(qū)是否已滿,都立即輸出流中所有數(shù)據(jù),然后插入一個(gè)換行符,并刷新流(清空緩沖區(qū))。(4) 在iostream中只對(duì)“”運(yùn)算符用于標(biāo)準(zhǔn)類型數(shù)據(jù)的輸入輸出進(jìn)行了重載,但未對(duì)用戶聲明的類型數(shù)據(jù)的輸入輸出進(jìn)行重載。2. cerr流對(duì)象cerr流對(duì)象是標(biāo)準(zhǔn)錯(cuò)誤流

14、。cerr流已被指定為與顯示器關(guān)聯(lián)。cerr的作用是向標(biāo)準(zhǔn)錯(cuò)誤設(shè)備(standard error device)輸出有關(guān)出錯(cuò)信息。cerr與標(biāo)準(zhǔn)輸出流cout的作用和用法差不多。但有一點(diǎn)不同: cout流通常是傳送到顯示器輸出,但也可以被重定向輸出到磁盤文件,而cerr流中的信息只能在顯示器輸出。當(dāng)調(diào)試程序時(shí),往往不希望程序運(yùn)行時(shí)的出錯(cuò)信息被送到其他文件,而要求在顯示器上及時(shí)輸出,這時(shí)應(yīng)該用cerr。cerr流中的信息是用戶根據(jù)需要指定的。例.1 有一元二次方程ax2+bx+c=0,其一般解為x1,2=(-bb2-4ac)/2a,但若a=0,或b2-4ac0時(shí),用此公式出錯(cuò)。編程序,從鍵盤輸入

15、a,b,c的值,求x1和x2。如果a=0或b2-4ac0,輸出出錯(cuò)信息。#include #include using namespace std;int main( )float a,b,c,disc; coutabc; if (a=0)cerra is equal to zero,error!endl; /將有關(guān)出錯(cuò)信息插入cerr流,在屏幕輸出 elseif (disc=b*b-4*a*c)0)cerrdisc=b*b-4*a*c0endl; /將有關(guān)出錯(cuò)信息插入cerr流,在屏幕輸出elsecoutx1=(-b+sqrt(disc)/(2*a)endl; coutx2=(-b-sqrt

16、(disc)/(2*a)endl; return 0;運(yùn)行情況如下:please input a,b,c: 0 2 3a is equal to zero,error!please input a,b,c: 5 2 3sc=b*b-4*a*c0please input a,b,c: 1 2.5 1.5x1=-1x2=-1.53. clog流對(duì)象clog流對(duì)象也是標(biāo)準(zhǔn)錯(cuò)誤流,它是console log的縮寫。它的作用和cerr相同,都是在終端顯示器上顯示出錯(cuò)信息。區(qū)別: cerr是不經(jīng)過緩沖區(qū),直接向顯示器上輸出有關(guān)信息,而clog中的信息存放在緩沖區(qū)中,緩沖區(qū)滿后或遇endl時(shí)向顯示器輸出。在

17、輸出數(shù)據(jù)時(shí),有時(shí)希望數(shù)據(jù)按指定的格式輸出。有兩種方法可以達(dá)到此目的。一種是第章已介紹過的使用控制符的方法;第種是使用流對(duì)象的有關(guān)成員函數(shù)。1. 使用控制符控制輸出格式輸出數(shù)據(jù)的控制符見書中表.3。應(yīng)當(dāng)注意,這些控制符是在頭文件iomanip中定義的,因而程序中應(yīng)當(dāng)包含iomanip。13.2.2 例.2 用控制符控制輸出格式。#include #include /不要忘記包含此頭文件using namespace std;int main()int a; couta; coutdec:decaendl; /以十進(jìn)制形式輸出整數(shù) couthex:hexaendl; /以十六進(jìn)制形式輸出整數(shù)a c

18、outoct:setbase(8)aendl; /以八進(jìn)制形式輸出整數(shù)a char *pt=China; /pt指向字符串China coutsetw(10)ptendl; /指定域?qū)挒?輸出字符串coutsetfill(*)setw(10)ptendl; /指定域?qū)?輸出字符串,空白處以*填充 double pi=22.0/7.0; /計(jì)算pi值 coutsetiosflags(ios:scientific)setprecision(8);/按指數(shù)形式輸出,8位小數(shù) coutpi=piendl; /輸出pi值 coutpi=setprecision(4)piendl; /改為位小數(shù) cout

19、pi=setiosflags(ios:fixed)piendl;/改為小數(shù)形式輸出 return 0;運(yùn)行結(jié)果如下:input a:34(輸入a的值)dec:34 (十進(jìn)制形式)hex:22 (十六進(jìn)制形式)oct:42 (八進(jìn)制形式) China (域?qū)挒?*China (域?qū)挒?空白處以*填充)pi=3.e+00 (指數(shù)形式輸出,8位小數(shù))pi=3.1429e+00 (指數(shù)形式輸出,4位小數(shù))pi=3.143 (小數(shù)形式輸出,精度仍為)2. 用流對(duì)象的成員函數(shù)控制輸出格式除了可以用控制符來控制輸出格式外,還可以通過調(diào)用流對(duì)象cout中用于控制輸出格式的成員函數(shù)來控制輸出格式。用于控制輸出格

20、式的常用的成員函數(shù)見書中表.4。流成員函數(shù)setf和控制符setiosflags括號(hào)中的參數(shù)表示格式狀態(tài),它是通過格式標(biāo)志來指定的。格式標(biāo)志在類ios中被定義為枚舉值。因此在引用這些格式標(biāo)志時(shí)要在前面加上類名ios和域運(yùn)算符“:”。格式標(biāo)志見書中表.5。例.3 用流控制成員函數(shù)輸出數(shù)據(jù)。#include using namespace std;int main( )int a=21 cout.setf(ios:showbase);/顯示基數(shù)符號(hào)(0x或) coutdec:aendl; /默認(rèn)以十進(jìn)制形式輸出a cout.unsetf(ios:dec); /終止十進(jìn)制的格式設(shè)置 cout.set

21、f(ios:hex); /設(shè)置以十六進(jìn)制輸出的狀態(tài) couthex:aendl; /以十六進(jìn)制形式輸出acout.unsetf(ios:hex); /終止十六進(jìn)制的格式設(shè)置 cout.setf(ios:oct); /設(shè)置以八進(jìn)制輸出的狀態(tài) coutoct:aendl; /以八進(jìn)制形式輸出acout.unseft(ios:oct); char *pt=China; /pt指向字符串China cout.width(10); /指定域?qū)挒?coutptendl; /輸出字符串 cout.width(10); /指定域?qū)挒閏out.fill(*); /指定空白處以*填充 coutptendl; /輸

22、出字符串 double pi=22.0/7.0; /輸出pi值cout.setf(ios:scientific); /指定用科學(xué)記數(shù)法輸出coutpi=; /輸出pi=cout.width(14); /指定域?qū)挒閏outpiendl; /輸出pi值cout.unsetf(ios:scientific); /終止科學(xué)記數(shù)法狀態(tài)cout.setf(ios:fixed); /指定用定點(diǎn)形式輸出cout.width(12); /指定域?qū)挒閏out.setf(ios:showpos); /正數(shù)輸出“+”號(hào)cout.setf(ios:internal); /數(shù)符出現(xiàn)在左側(cè)cout.precision(6)

23、; /保留位小數(shù)coutpiendl; /輸出pi,注意數(shù)符“+”的位置return 0;運(yùn)行情況如下: dec:21(十進(jìn)制形式)hex:0x15 (十六進(jìn)制形式,以x開頭)oct:025 (八進(jìn)制形式,以開頭) China (域?qū)挒?*China (域?qū)挒?空白處以*填充)pi=*3.e+00 (指數(shù)形式輸出,域?qū)?默認(rèn)位小數(shù))+*3. (小數(shù)形式輸出,精度為,最左側(cè)輸出數(shù)符“+”)ostream類除了提供上面介紹過的用于格式控制的成員函數(shù)外,還提供了專用于輸出單個(gè)字符的成員函數(shù)put。如cout.put(a);調(diào)用該函數(shù)的結(jié)果是在屏幕上顯示一個(gè)字符a。put函數(shù)的參數(shù)可以是字符或字符的A

24、SCII代碼(也可以是一個(gè)整型表達(dá)式)。如cout.put(65+32);也顯示字符a,因?yàn)槭亲址鸻的ASCII代碼??梢栽谝粋€(gè)語句中連續(xù)調(diào)用put函數(shù)。如cout.put(71).put(79).pu(79).put(68).put(n);在屏幕上顯示GOOD。13.2.3 用流成員函數(shù)put輸出字符例.4 有一個(gè)字符串BASIC,要求把它們按相反的順序輸出。#include using namespace std;int main( )char *a=BASIC;/字符指針指向B for(int i=4;i=0;i-) cout.put(*(a+i); /從最后一個(gè)字符開始輸出 cout.

25、put(n); return 0;運(yùn)行時(shí)在屏幕上輸出: CISAB還可以用putchar函數(shù)輸出一個(gè)字符。putchar函數(shù)是C語言中使用的,在stdio.h頭文件中定義。C+保留了這個(gè)函數(shù),在iostream頭文件中定義。例.4也可以改用putchar函數(shù)實(shí)現(xiàn)。#include /也可以用#include ,同時(shí)不要下一行using namespace std;int main( )char *a=BASIC; for(int i=4;i=0;i-) putchar(*(a+i); putchar(n);運(yùn)行結(jié)果與前相同。成員函數(shù)put不僅可以用cout流對(duì)象來調(diào)用,而且也可以用ostrea

26、m類的其他流對(duì)象調(diào)用。標(biāo)準(zhǔn)輸入流是從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)流向程序的數(shù)據(jù)。13.3 標(biāo)準(zhǔn)輸入流在上一節(jié)中已知,在頭文件iostream.h中定義了cin,cout,cerr,clog 4個(gè)流對(duì)象,cin是輸入流,cout,cerr,clog是輸出流。cin是istream類的對(duì)象,它從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)獲取數(shù)據(jù),程序中的變量通過流提取符“”從流中提取數(shù)據(jù)。流提取符“”從流中提取數(shù)據(jù)時(shí)通常跳過輸入流中的空格、tab鍵、換行符等空白字符。注意: 只有在輸入完數(shù)據(jù)再按回車鍵后,該行數(shù)據(jù)才被送入鍵盤緩沖區(qū),形成輸入流,提取運(yùn)算符“”才能從中提取數(shù)據(jù)。需要注意保證從流中讀取數(shù)據(jù)能正常進(jìn)行。13.3例.5

27、 通過測(cè)試cin的真值,判斷流對(duì)象是否處于正常狀態(tài)。#include using namespace std;int main( )float grade; coutgrade)/能從cin流讀取數(shù)據(jù)if(grade=85) coutgradeGOOD!endl;if(grade60) coutgradefail!endl;coutenter grade:; coutThe end.endl; return 0;運(yùn)行情況如下: enter grade: 67enter grade: 8989 GOOD!enter grade: 5656 fail!enter grade: 100100 GOO

28、D!enter grade: Z/鍵入文件結(jié)束符The end.如果某次輸入的數(shù)據(jù)為enter grade: 100/2輸出The end.。在不同的C+系統(tǒng)下運(yùn)行此程序,在最后的處理上有些不同。以上是在GCC環(huán)境下運(yùn)行程序的結(jié)果,如果在VC+環(huán)境下運(yùn)行此程序,在鍵入Ctrl+Z時(shí),程序運(yùn)行馬上結(jié)束,不輸出The end.。除了可以用cin輸入標(biāo)準(zhǔn)類型的數(shù)據(jù)外,還可以用istream類流對(duì)象的一些成員函數(shù),實(shí)現(xiàn)字符的輸入。1. 用get函數(shù)讀入一個(gè)字符流成員函數(shù)get有種形式: 無參數(shù)的,有一個(gè)參數(shù)的,有個(gè)參數(shù)的。(1) 不帶參數(shù)的get函數(shù)其調(diào)用形式為cin.get()用來從指定的輸入流中提

29、取一個(gè)字符,函數(shù)的返回值就是讀入的字符。若遇到輸入流中的文件結(jié)束符,則函數(shù)值返回文件結(jié)束標(biāo)志EOF(End Of File) 。13.3.2 用于字符輸入的流成員函數(shù)例.6 用get函數(shù)讀入字符。#include int main( )int c; coutenter a sentence:endl; while(c=cin.get()!=EOF) cout.put(c); return 0;運(yùn)行情況如下: enter a sentence:I study C+ very hard.(輸入一行字符)I study C+ very hard. (輸出該行字符)Z(程序結(jié)束)C語言中的getcha

30、r函數(shù)與流成員函數(shù)cin.get( )的功能相同,C+保留了C的這種用法。(2) 有一個(gè)參數(shù)的get函數(shù)其調(diào)用形式為cin.get(ch)其作用是從輸入流中讀取一個(gè)字符,賦給字符變量ch。如果讀取成功則函數(shù)返回非值(真),如失敗(遇文件結(jié)束符) 則函數(shù)返回值(假)。例.6可以改寫如下: #include int main( )char c; coutenter a sentence:endl; while(cin.get(c) /讀取一個(gè)字符賦給字符變量c,如果讀取成功,cin.get(c)為真cout.put(c); coutendendl; return 0;(3) 有個(gè)參數(shù)的get函數(shù)其

31、調(diào)用形式為cin.get(字符數(shù)組,字符個(gè)數(shù)n,終止字符)或cin.get(字符指針,字符個(gè)數(shù)n,終止字符)其作用是從輸入流中讀取n-1個(gè)字符,賦給指定的字符數(shù)組(或字符指針指向的數(shù)組),如果在讀取n-1個(gè)字符之前遇到指定的終止字符,則提前結(jié)束讀取。如果讀取成功則函數(shù)返回非值(真),如失敗(遇文件結(jié)束符) 則函數(shù)返回值(假)。再將例.6改寫如下: #include using namespace std;int main( )char ch20; coutenter a sentence:endl; cin.get(ch,10,n);/指定換行符為終止字符 coutchendl; return

32、 0; 運(yùn)行情況如下: enter a sentence:I study C+ very hard.I study get函數(shù)中第個(gè)參數(shù)可以省寫,此時(shí)默認(rèn)為n。下面兩行等價(jià): cin.get(ch,10,n);cin.get(ch,10);終止字符也可以用其他字符。如cin.get(ch,10,x);2. 用成員函數(shù)getline函數(shù)讀入一行字符getline函數(shù)的作用是從輸入流中讀取一行字符,其用法與帶個(gè)參數(shù)的get函數(shù)類似。即cin.getline(字符數(shù)組(或字符指針),字符個(gè)數(shù)n,終止標(biāo)志字符)例.7 用getline函數(shù)讀入一行字符。#include using namespace

33、std;int main( )char ch20; coutenter a sentence:ch; coutThe string read with cin is:chendl; cin.getline(ch,20,/);/讀個(gè)字符或遇/結(jié)束 coutThe second part is:chendl; cin.getline(ch,20); /讀個(gè)字符或遇/n結(jié)束 coutThe third part is:chendl; return 0;程序運(yùn)行情況如下:enter a sentence: I like C+./I study C+./I am happy.The string rea

34、d with cin is:IThe second part is: like C+.The third part is:I study C+./I am h除了以上介紹的用于讀取數(shù)據(jù)的成員函數(shù)外,istream類還有其他在輸入數(shù)據(jù)時(shí)用得著的一些成員函數(shù)。常用的有以下幾種: 1. eof 函數(shù)eof是end of file的縮寫,表示“文件結(jié)束”。從輸入流讀取數(shù)據(jù),如果到達(dá)文件末尾(遇文件結(jié)束符),eof函數(shù)值為非零值(表示真),否則為(假)。13.3.3 istream類的其他成員例.8 逐個(gè)讀入一行字符,將其中的非空格字符輸出。#include using namespace std;in

35、t main( )char c; while(!cin.eof( )/eof( )為假表示未遇到文件結(jié)束符if(c=cin.get( )!= ) /檢查讀入的字符是否為空格字符 cout.put(c); return 0;運(yùn)行情況如下:C+ is very interesting.C+isveryinteresting.Z(結(jié)束)2. peek函數(shù)peek是“觀察”的意思,peek函數(shù)的作用是觀測(cè)下一個(gè)字符。其調(diào)用形式為c=cin.peek( );cin.peek函數(shù)的返回值是指針指向的當(dāng)前字符,但它只是觀測(cè),指針仍停留在當(dāng)前位置,并不后移。如果要訪問的字符是文件結(jié)束符,則函數(shù)值是EOF(-1

36、)。3. putback函數(shù)其調(diào)用形式為cin.putback(ch);其作用是將前面用get或getline函數(shù)從輸入流中讀取的字符ch返回到輸入流,插入到當(dāng)前指針位置,以供后面讀取。例.9 peek函數(shù)和putback函數(shù)的用法。#include using namespace std;int main( )char c20; int ch; coutplease enter a sentence:endl; cin.getline(c,15,/); coutThe first part is:cendl;ch=cin.peek( );/觀看當(dāng)前字符 coutThe next charac

37、ter(ASCII code) is:chendl; cin.putback(c0); /將I插入到指針?biāo)柑?cin.getline(c,15,/); coutThe second part is:cendl; return 0;運(yùn)行情況如下:please enter a sentence: I am a boy./ am a student./The first part is:I am a boy.The next character(ASCII code) is:32(下一個(gè)字符是空格)The second part is:I am a student 圖.44. ignore函數(shù)其調(diào)

38、用形式為cin,ignore(n, 終止字符)函數(shù)作用是跳過輸入流中n個(gè)字符,或在遇到指定的終止字符時(shí)提前結(jié)束(此時(shí)跳過包括終止字符在內(nèi)的若干字符)。如ighore(5, A)/跳過輸入流中個(gè)字符,遇A后就不再跳了也可以不帶參數(shù)或只帶一個(gè)參數(shù)。如ignore( )(n默認(rèn)值為,終止字符默認(rèn)為EOF)相當(dāng)于ignore(1,EOF) 例.10用ignore函數(shù)跳過輸入流中的字符。先看不用ignore函數(shù)的情況:#include using namespace std;int main( )char ch20; cin.get(ch,20,/); coutThe first part is:che

39、ndl;cin.get(ch,20,/); coutThe second part is:chendl;return 0;運(yùn)行結(jié)果如下:I like C+./I study C+./I am happy.The first part is:I like C+.The second part is:(字符數(shù)組ch中沒有從輸入流中讀取有效字符)如果希望第二個(gè)cin.get函數(shù)能讀取I study C+.,就應(yīng)該設(shè)法跳過輸入流中第一個(gè)/,可以用ignore函數(shù)來實(shí)現(xiàn)此目的,將程序改為#include using namespace std;int main( )char ch20; cin.get(

40、ch,20,/); coutThe first part is:chendl; cin.ignore( );/跳過輸入流中一個(gè)字符 cin.get(ch,20,/); coutThe second part is:chendl; return 0;運(yùn)行結(jié)果如下:I like C+./I study C+./I am happy.The first part is:I like C+.The second part is:I study C+.以上介紹的各個(gè)成員函數(shù),不僅可以用cin流對(duì)象來調(diào)用,而且也可以用istream類的其他流對(duì)象調(diào)用。迄今為止,我們討論的輸入輸出是以系統(tǒng)指定的標(biāo)準(zhǔn)設(shè)備(輸

41、入設(shè)備為鍵盤,輸出設(shè)備為顯示器)為對(duì)象的。在實(shí)際應(yīng)用中,常以磁盤文件作為對(duì)象。即從磁盤文件讀取數(shù)據(jù),將數(shù)據(jù)輸出到磁盤文件。 所謂“文件”,一般指存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合。一批數(shù)據(jù)是以文件的形式存放在外部介質(zhì)上的。操作系統(tǒng)是以文件為單位對(duì)數(shù)據(jù)進(jìn)行管理的。要向外部介質(zhì)上存儲(chǔ)數(shù)據(jù)也必須先建立一個(gè)文件(以文件名標(biāo)識(shí)),才能向它輸出數(shù)據(jù)。13.4 文件操作與文件流 13.4.1 文件的外存文件包括磁盤文件、光盤文件和U盤文件。目前使用最廣泛的是磁盤文件。對(duì)用戶來說,常用到的文件有兩大類,一類是程序文件(program file)。一類是數(shù)據(jù)文件(data file)。程序中的輸入和輸出的對(duì)象就是數(shù)據(jù)文

42、件。根據(jù)文件中數(shù)據(jù)的組織形式,可分為ASCII文件和二進(jìn)制文件。對(duì)于字符信息,在內(nèi)存中是以ASCII代碼形式存放的,因此,無論用ASCII文件輸出還是用二進(jìn)制文件輸出,其數(shù)據(jù)形式是一樣的。但是對(duì)于數(shù)值數(shù)據(jù),二者是不同的。例如有一個(gè)長(zhǎng)整數(shù),在內(nèi)存中占個(gè)字節(jié),如果按內(nèi)部格式直接輸出,在磁盤文件中占個(gè)字節(jié),如果將它轉(zhuǎn)換為ASCII碼形式輸出,則要占個(gè)字節(jié),見圖.5。圖.5C+提供低級(jí)的I/O功能和高級(jí)的I/O功能。高級(jí)的I/O功能是把若干個(gè)字節(jié)組合為一個(gè)有意義的單位,然后以ASCII字符形式輸入和輸出。傳輸大容量的文件時(shí)由于數(shù)據(jù)格式轉(zhuǎn)換,速度較慢,效率不高。所謂低級(jí)的I/O功能是以字節(jié)為單位輸入和輸

43、出的,在輸入和輸出時(shí)不進(jìn)行數(shù)據(jù)格式的轉(zhuǎn)換。這種輸入輸出速度快、效率高,一般大容量的文件傳輸用無格式轉(zhuǎn)換的I/O。但使用時(shí)會(huì)感到不大方便。文件流是以外存文件為輸入輸出對(duì)象的數(shù)據(jù)流。輸出文件流是從內(nèi)存流向外存文件的數(shù)據(jù),輸入文件流是從外存文件流向內(nèi)存的數(shù)據(jù)。每一個(gè)文件流都有一個(gè)內(nèi)存緩沖區(qū)與之對(duì)應(yīng)。請(qǐng)區(qū)分文件流與文件的概念。文件流本身不是文件,而只是以文件為輸入輸出對(duì)象的流。若要對(duì)磁盤文件輸入輸出,就必須通過文件流來實(shí)現(xiàn)。在C+的I/O類庫(kù)中定義了幾種文件類,專門用于對(duì)磁盤文件的輸入輸出操作。在圖.2中可以看到除了已介紹過的標(biāo)準(zhǔn)輸入輸出流類istream,ostream和iostream類外,還有個(gè)

44、用于文件操作的文件類: 13.4.2 文件流類與文件流(1) ifstream類,它是從istream類派生的。用來支持從磁盤文件的輸入。(2) ofstream類,它是從ostream類派生的。用來支持向磁盤文件的輸出。(3) fstream類,它是從iostream類派生的。用來支持對(duì)磁盤文件的輸入輸出。要以磁盤文件為對(duì)象進(jìn)行輸入輸出,必須定義一個(gè)文件流類的對(duì)象,通過文件流對(duì)象將數(shù)據(jù)從內(nèi)存輸出到磁盤文件,或者通過文件流對(duì)象從磁盤文件將數(shù)據(jù)輸入到內(nèi)存。其實(shí)在用標(biāo)準(zhǔn)設(shè)備為對(duì)象的輸入輸出中,也是要定義流對(duì)象的,如cin,cout就是流對(duì)象,C+是通過流對(duì)象進(jìn)行輸入輸出的。由于cin,cout已在

45、iostream.h中事先定義,所以用戶不需自己定義。在用磁盤文件時(shí),由于情況各異,無法事先統(tǒng)一定義,必須由用戶自己定義。此外,對(duì)磁盤文件的操作是通過文件流對(duì)象(而不是cin和cout)實(shí)現(xiàn)的。文件流對(duì)象是用文件流類定義的,而不是用istream和ostream類來定義的??梢杂孟旅娴姆椒ń⒁粋€(gè)輸出文件流對(duì)象: ofstream outfile;現(xiàn)在在程序中定義了outfile為ofstream類(輸出文件流類)的對(duì)象。但是有一個(gè)問題還未解決: 在定義cout時(shí)已將它和標(biāo)準(zhǔn)輸出設(shè)備建立關(guān)聯(lián),而現(xiàn)在雖然建立了一個(gè)輸出文件流對(duì)象,但是還未指定它向哪一個(gè)磁盤文件輸出,需要在使用時(shí)加以指定。1. 打

46、開磁盤文件打開文件是指在文件讀寫之前做必要的準(zhǔn)備工作,包括: (1) 為文件流對(duì)象和指定的磁盤文件建立關(guān)聯(lián),以便使文件流流向指定的磁盤文件。(2) 指定文件的工作方式。以上工作可以通過兩種不同的方法實(shí)現(xiàn)。(1) 調(diào)用文件流的成員函數(shù)open。如ofstream outfile;/定義ofstream類(輸出文件流類)對(duì)象outfileoutfile.open(f1.dat,ios:out); /使文件流與f1.dat文件建立關(guān)聯(lián)調(diào)用成員函數(shù)open的一般形式為13.4.3 文件的打開與文件流對(duì)象.open(磁盤文件名,輸入輸出方式);磁盤文件名可以包括路徑,如c:newf1.dat,如缺省路徑

47、,則默認(rèn)為當(dāng)前目錄下的文件。(2) 在定義文件流對(duì)象時(shí)指定參數(shù)在聲明文件流類時(shí)定義了帶參數(shù)的構(gòu)造函數(shù),其中包含了打開磁盤文件的功能。因此,可以在定義文件流對(duì)象時(shí)指定參數(shù),調(diào)用文件流類的構(gòu)造函數(shù)來實(shí)現(xiàn)打開文件的功能。如ostream outfile(f1.dat,ios:out);一般多用此形式,比較方便。作用與open函數(shù)相同。輸入輸出方式是在ios類中定義的,它們是枚舉常量,有多種選擇,見書中表.6。說明: 新版本的I/O類庫(kù)中不提供ios:nocreate和ios:noreplace。每一個(gè)打開的文件都有一個(gè)文件指針。可以用“位或”運(yùn)算符“|”對(duì)輸入輸出方式進(jìn)行組合。如果打開操作失敗,op

48、en函數(shù)的返回值為(假),如果是用調(diào)用構(gòu)造函數(shù)的方式打開文件的,則流對(duì)象的值為。2. 關(guān)閉磁盤文件在對(duì)已打開的磁盤文件的讀寫操作完成后,應(yīng)關(guān)閉該文件。關(guān)閉文件用成員函數(shù)close。如outfile.close( );/將輸出文件流所關(guān)聯(lián)的磁盤文件關(guān)閉所謂關(guān)閉,實(shí)際上是解除該磁盤文件與文件流的關(guān)聯(lián),原來設(shè)置的工作方式也失效,這樣,就不能再通過文件流對(duì)該文件進(jìn)行輸入或輸出。此時(shí)可以將文件流與其他磁盤文件建立關(guān)聯(lián),通過文件流對(duì)新的文件進(jìn)行輸入或輸出。如outfile.open(f2.dat,ios:app|ios:nocreate);此時(shí)文件流outfile與f2.dat建立關(guān)聯(lián),并指定了f2.dat的工作方式。如果文件的每一個(gè)字節(jié)中均以ASCII代碼形式存放數(shù)據(jù),即一個(gè)字節(jié)存放一個(gè)字符,這個(gè)文件就是ASCII文件(或稱字符文件)。程序可以從ASCII文件中讀入若干個(gè)字符,也可以向它輸出一些字符。對(duì)ASCII文件的讀寫操作可以用以下兩種方法: (1) 用流插入運(yùn)算符“”輸入輸出標(biāo)準(zhǔn)類型的數(shù)據(jù)。(2) 用本章.2.3節(jié)和.3.2節(jié)中介紹的文件流的put,get,geiline等成員函數(shù)進(jìn)行字符的輸入輸出。13.4.4 對(duì)ASCII文件例.11 有一個(gè)整型數(shù)組,含個(gè)元素,從鍵盤輸入個(gè)整數(shù)給數(shù)組,將此數(shù)組送到磁盤文件中存放。#include using na

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論