九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

譚浩強《C++程序設(shè)計》課件 第13章.ppt

上傳人:xin****828 文檔編號:15527090 上傳時間:2020-08-17 格式:PPT 頁數(shù):99 大小:398.50KB
收藏 版權(quán)申訴 舉報 下載
譚浩強《C++程序設(shè)計》課件 第13章.ppt_第1頁
第1頁 / 共99頁
譚浩強《C++程序設(shè)計》課件 第13章.ppt_第2頁
第2頁 / 共99頁
譚浩強《C++程序設(shè)計》課件 第13章.ppt_第3頁
第3頁 / 共99頁

下載文檔到電腦,查找使用更方便

14.9 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《譚浩強《C++程序設(shè)計》課件 第13章.ppt》由會員分享,可在線閱讀,更多相關(guān)《譚浩強《C++程序設(shè)計》課件 第13章.ppt(99頁珍藏版)》請在裝配圖網(wǎng)上搜索。

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

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

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

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

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

6、t)和輸出(output)。istream類支持輸入操作,ostream類支持輸出操作,iostream類支持輸入輸出操作。 iostream類是從istream類和ostream類通過多重繼承而派生的類。其繼承層次見圖13.1表示。,圖13.1 C+對文件的輸入輸出需要用ifstream和ofstream類,兩個類名中第1個字母i和o分別代表輸入和輸出,第2個字母f代表文件(file)。ifstream支持對文件的輸入操作,ofstream支持對文件的輸出操作。類ifstream繼承了類istream,類ofstream繼承了類ostream,類fstream繼承了類iostream。見圖1

7、3.2。,圖13.2 I/O類庫中還有其他類,見圖13.3。,圖13.3,2. 與iostream類庫有關(guān)的頭文件 iostream類庫中不同的類的聲明被放在不同的頭文件中,用戶在自己的程序中用#include命令包含了有關(guān)的頭文件就相當(dāng)于在本程序中聲明了所需要用到的類。可以換一種說法: 頭文件是程序與類庫的接口,iostream類庫的接口分別由不同的頭文件來實現(xiàn)。常用的有 iostream包含了對輸入輸出流進行操作所需的基本信息。 fstream用于用戶管理的文件的I/O操作。 strstream用于字符串流I/O。 stdiostream用于混合使用C和C+的I/O機制時。 iomanip

8、在使用格式化I/O時應(yīng)包含此頭文件。,3. 在iostream頭文件中定義的流對象 在iostream頭文件中定義的類有ios,istream,ostream,iostream,istream _withassign, ostream_withassign,iostream_withassign等。 iostream.h包含了對輸入輸出流進行操作所需的基本信息。因此大多數(shù)C+程序都包括iostream.h。在iostream.h頭文件中不僅定義了有關(guān)的類,還定義了4種流對象,見書中表13.2。 cin是istream的派生類istream_withassign的對象,它是從標準輸入設(shè)備(鍵盤)

9、輸入到內(nèi)存的數(shù)據(jù)流,稱為cin流或標準輸入流。cout是ostream的派生類ostream_withassign的對象,它是從內(nèi)存輸入到標準輸出設(shè)備(顯示器) 的數(shù)據(jù)流,稱為cout流或標準輸出流。,cerr和clog作用相似,均為向輸出設(shè)備(顯示器) 輸出出錯信息。因此用鍵盤輸入時用cin流,向顯示器輸出時用cout流。向顯示器輸出出錯信息時用cerr和clog流。 在iostream頭文件中定義以上4個流對象用以下的形式(以cout為例): ostream cout (stdout); 在定義cout為ostream流類對象時,把標準輸出設(shè)備stdout作為參數(shù),這樣它就與標準輸出設(shè)備(

10、顯示器)聯(lián)系起來,如果有 cout3; 就會在顯示器的屏幕上輸出3。,4. 在iostream頭文件中重載運算符 “”本來在C+中是被定義為左位移運算符和右位移運算符的,由于在iostream頭文件中對它們進行了重載,使它們能用作標準類型數(shù)據(jù)的輸入和輸出運算符。所以,在用它們的程序中必須用#include命令把iostream包含到程序中。 #include 在istream和ostream類(這兩個類都是在iostream中聲明的)中分別有一組成員函數(shù)對位移運算符“”進行重載,以便能用它輸入或輸出各種標準數(shù)據(jù)類型的數(shù)據(jù)。對于不同的標準數(shù)據(jù)類型要分別進行重載,如 ostream operato

11、r (int );/用于向輸出流插入一個int數(shù)據(jù) ostream operator (float ); /用于向輸出流插入一個float數(shù)據(jù),ostream operator ”重載為對以下標準類型的提取運算符: char,signed char,unsigned char,short,unsigned short,int,unsigned int,long,unsigned long,float, double,long double, char*,signed char*,unsigned char*等。 在ostream類中將“”用于自己聲明的類型的數(shù)據(jù),就不能簡單地采用包含iostr

12、eam頭文件來解決,必須自己用第11章的方法對“”進行重載。 怎樣理解運算符“”的作用呢?它們指出了數(shù)據(jù)移動的方向,例如 a 箭頭方向表示把數(shù)據(jù)放入a中。而 a 箭頭方向表示從a中拿出數(shù)據(jù)。+,標準輸出流是流向標準輸出設(shè)備(顯示器)的數(shù)據(jù)。,13.2 標準輸出流,ostream類定義了3個輸出流對象,即cout,cerr,clog。分述如下。 1. cout流對象 cout是console output的縮寫,意為在控制臺(終端顯示器)的輸出。 (1) cout不是C+預(yù)定義的關(guān)鍵字,它是ostream流類的對象,在iostream中定義。 (2) 用“cout”輸出基本類型的數(shù)據(jù)時,可以不必

13、考慮數(shù)據(jù)是什么類型,系統(tǒng)會判斷數(shù)據(jù)的類型,并根據(jù)其類型選擇調(diào)用與之匹配的運算符重載函數(shù)。,13.2.1 cout,cerr和clog流,(3) cout流在內(nèi)存中對應(yīng)開辟了一個緩沖區(qū),用來存放流中的數(shù)據(jù),當(dāng)向cout流插入一個endl時,不論緩沖區(qū)是否已滿,都立即輸出流中所有數(shù)據(jù),然后插入一個換行符,并刷新流(清空緩沖區(qū))。 (4) 在iostream中只對“”運算符用于標準類型數(shù)據(jù)的輸入輸出進行了重載,但未對用戶聲明的類型數(shù)據(jù)的輸入輸出進行重載。,2. cerr流對象 cerr流對象是標準錯誤流。cerr流已被指定為與顯示器關(guān)聯(lián)。cerr的作用是向標準錯誤設(shè)備(standard error

14、device)輸出有關(guān)出錯信息。cerr與標準輸出流cout的作用和用法差不多。但有一點不同: cout流通常是傳送到顯示器輸出,但也可以被重定向輸出到磁盤文件,而cerr流中的信息只能在顯示器輸出。當(dāng)調(diào)試程序時,往往不希望程序運行時的出錯信息被送到其他文件,而要求在顯示器上及時輸出,這時應(yīng)該用cerr。cerr流中的信息是用戶根據(jù)需要指定的。,例13.1 有一元二次方程ax2+bx+c=0,其一般解為 x1,2=(-bb2-4ac)/2a,但若a=0,或b2-4ac #include using namespace std; int main( ) float a,b,c,disc; cou

15、tabc; if (a=0) cerra is equal to zero,error!endl; /將有關(guān)出錯信息插入cerr流,在屏幕輸出 else,if (disc=b*b-4*a*c)0) cerrdisc=b*b-4*a*c0endl; /將有關(guān)出錯信息插入cerr流,在屏幕輸出 else coutx1=(-b+sqrt(disc)/(2*a)endl; coutx2=(-b-sqrt(disc)/(2*a)endl; return 0; 運行情況如下: please input a,b,c: 0 2 3 a is equal to zero,error! please input

16、a,b,c: 5 2 3 sc=b*b-4*a*c0 please input a,b,c: 1 2.5 1.5 x1=-1 x2=-1.5,3. clog流對象 clog流對象也是標準錯誤流,它是console log的縮寫。它的作用和cerr相同,都是在終端顯示器上顯示出錯信息。區(qū)別: cerr是不經(jīng)過緩沖區(qū),直接向顯示器上輸出有關(guān)信息,而clog中的信息存放在緩沖區(qū)中,緩沖區(qū)滿后或遇endl時向顯示器輸出。,在輸出數(shù)據(jù)時,有時希望數(shù)據(jù)按指定的格式輸出。有兩種方法可以達到此目的。一種是第3章已介紹過的使用控制符的方法;第2種是使用流對象的有關(guān)成員函數(shù)。 1. 使用控制符控制輸出格式 輸出數(shù)

17、據(jù)的控制符見書中表13.3。 應(yīng)當(dāng)注意,這些控制符是在頭文件iomanip中定義的,因而程序中應(yīng)當(dāng)包含iomanip。,13.2.2 格式輸出,例13.2 用控制符控制輸出格式。 #include #include /不要忘記包含此頭文件 using namespace std; int main() int a; couta; coutdec:decaendl; /以十進制形式輸出整數(shù) couthex:hexaendl; /以十六進制形式輸出整數(shù)a coutoct:setbase(8)aendl; /以八進制形式輸出整數(shù)a char *pt=China; /pt指向字符串China cout

18、setw(10)ptendl; /指定域?qū)挒?0,輸出字符串 coutsetfill(*)setw(10)ptendl; /指定域?qū)?0,輸出字符串,空白處以*填充 double pi=22.0/7.0; /計算pi值 coutsetiosflags(ios:scientific)setprecision(8);/按指數(shù)形式輸出,8位小數(shù) coutpi=piendl; /輸出pi值 coutpi=setprecision(4)piendl; /改為4位小數(shù) coutpi=setiosflags(ios:fixed)piendl;/改為小數(shù)形式輸出 return 0; ,運行結(jié)果如下: inpu

19、t a:34(輸入a的值) dec:34 (十進制形式) hex:22 (十六進制形式) oct:42 (八進制形式) China (域?qū)挒?0) *China (域?qū)挒?0,空白處以*填充) pi=3.14285714e+00 (指數(shù)形式輸出,8位小數(shù)) pi=3.1429e+00 (指數(shù)形式輸出,4位小數(shù)) pi=3.143 (小數(shù)形式輸出,精度仍為4),2. 用流對象的成員函數(shù)控制輸出格式 除了可以用控制符來控制輸出格式外,還可以通過調(diào)用流對象cout中用于控制輸出格式的成員函數(shù)來控制輸出格式。用于控制輸出格式的常用的成員函數(shù)見書中表13.4。 流成員函數(shù)setf和控制符setiosfl

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

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

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

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

24、是在屏幕上顯示一個字符a。put函數(shù)的參數(shù)可以是字符或字符的ASCII代碼(也可以是一個整型表達式)。如 cout.put(65+32); 也顯示字符a,因為97是字符a的ASCII代碼。 可以在一個語句中連續(xù)調(diào)用put函數(shù)。如 cout.put(71).put(79).pu(79).put(68).put(n); 在屏幕上顯示GOOD。,13.2.3 用流成員函數(shù)put輸出字符,例13.4 有一個字符串BASIC,要求把它們按相反的順序輸出。 #include using namespace std; int main( ) char *a=BASIC;/字符指針指向B for(int i=

25、4;i=0;i-) cout.put(*(a+i); /從最后一個字符開始輸出 cout.put(n); return 0; 運行時在屏幕上輸出: CISAB 還可以用putchar函數(shù)輸出一個字符。putchar函數(shù)是C語言中使用的,在stdio.h頭文件中定義。C+保留了這個函數(shù),在iostream頭文件中定義。,例13.4也可以改用putchar函數(shù)實現(xiàn)。 #include /也可以用#include ,同時不要下一行 using namespace std; int main( ) char *a=BASIC; for(int i=4;i=0;i-) putchar(*(a+i); p

26、utchar(n); 運行結(jié)果與前相同。 成員函數(shù)put不僅可以用cout流對象來調(diào)用,而且也可以用ostream類的其他流對象調(diào)用。,標準輸入流是從標準輸入設(shè)備(鍵盤)流向程序的數(shù)據(jù)。,13.3 標準輸入流,在上一節(jié)中已知,在頭文件iostream.h中定義了cin,cout,cerr,clog 4個流對象,cin是輸入流,cout,cerr,clog是輸出流。 cin是istream類的對象,它從標準輸入設(shè)備(鍵盤)獲取數(shù)據(jù),程序中的變量通過流提取符“”從流中提取數(shù)據(jù)。流提取符“”從流中提取數(shù)據(jù)時通常跳過輸入流中的空格、tab鍵、換行符等空白字符。 注意: 只有在輸入完數(shù)據(jù)再按回車鍵后,該

27、行數(shù)據(jù)才被送入鍵盤緩沖區(qū),形成輸入流,提取運算符“”才能從中提取數(shù)據(jù)。需要注意保證從流中讀取數(shù)據(jù)能正常進行。,13.3.1 cin流,例13.5 通過測試cin的真值,判斷流對象是否處于正常狀態(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; 運行情況如下:,enter

28、 grade: 67 enter grade: 89 89 GOOD! enter grade: 56 56 fail! enter grade: 100 100 GOOD! enter grade: Z/鍵入文件結(jié)束符 The end. 如果某次輸入的數(shù)據(jù)為 enter grade: 100/2 輸出The end.。 在不同的C+系統(tǒng)下運行此程序,在最后的處理上有些不同。以上是在GCC環(huán)境下運行程序的結(jié)果,如果在VC+環(huán)境下運行此程序,在鍵入Ctrl+Z時,程序運行馬上結(jié)束,不輸出The end.。,除了可以用cin輸入標準類型的數(shù)據(jù)外,還可以用istream類流對象的一些成員函數(shù),實現(xiàn)字

29、符的輸入。 1. 用get函數(shù)讀入一個字符 流成員函數(shù)get有3種形式: 無參數(shù)的,有一個參數(shù)的,有3個參數(shù)的。 (1) 不帶參數(shù)的get函數(shù) 其調(diào)用形式為 cin.get() 用來從指定的輸入流中提取一個字符,函數(shù)的返回值就是讀入的字符。若遇到輸入流中的文件結(jié)束符,則函數(shù)值返回文件結(jié)束標志EOF(End Of File) 。,13.3.2 用于字符輸入的流成員函數(shù),例13.6 用get函數(shù)讀入字符。 #include int main( ) int c; coutenter a sentence:endl; while(c=cin.get()!=EOF) cout.put(c); retur

30、n 0; 運行情況如下: enter a sentence: I study C+ very hard.(輸入一行字符) I study C+ very hard. (輸出該行字符) Z(程序結(jié)束) C語言中的getchar函數(shù)與流成員函數(shù)cin.get( )的功能相同,C+保留了C的這種用法。,(2) 有一個參數(shù)的get函數(shù) 其調(diào)用形式為 cin.get(ch) 其作用是從輸入流中讀取一個字符,賦給字符變量ch。如果讀取成功則函數(shù)返回非0值(真),如失敗(遇文件結(jié)束符) 則函數(shù)返回0值(假)。例13.6可以改寫如下: #include int main( ) char c; coutente

31、r a sentence:endl; while(cin.get(c) /讀取一個字符賦給字符變量c,如果讀取成功,cin.get(c)為真 cout.put(c); coutendendl; return 0; ,(3) 有3個參數(shù)的get函數(shù) 其調(diào)用形式為 cin.get(字符數(shù)組,字符個數(shù)n,終止字符) 或 cin.get(字符指針,字符個數(shù)n,終止字符) 其作用是從輸入流中讀取n-1個字符,賦給指定的字符數(shù)組(或字符指針指向的數(shù)組),如果在讀取n-1個字符之前遇到指定的終止字符,則提前結(jié)束讀取。如果讀取成功則函數(shù)返回非0值(真),如失敗(遇文件結(jié)束符) 則函數(shù)返回0值(假)。再將例13

32、.6改寫如下: #include using namespace std; int main( ),char ch20; coutenter a sentence:endl; cin.get(ch,10,n);/指定換行符為終止字符 coutchendl; return 0; 運行情況如下: enter a sentence: I study C+ very hard. I study get函數(shù)中第3個參數(shù)可以省寫,此時默認為n。下面兩行等價: cin.get(ch,10,n); cin.get(ch,10); 終止字符也可以用其他字符。如 cin.get(ch,10,x);,2. 用成員函

33、數(shù)getline函數(shù)讀入一行字符 getline函數(shù)的作用是從輸入流中讀取一行字符,其用法與帶3個參數(shù)的get函數(shù)類似。即 cin.getline(字符數(shù)組(或字符指針),字符個數(shù)n,終止標志字符) 例13.7 用getline函數(shù)讀入一行字符。 #include using namespace std; int main( ) char ch20; coutch; coutThe string read with cin is:chendl; cin.getline(ch,20,/);/讀19個字符或遇/結(jié)束 coutThe second part is:chendl; cin.getlin

34、e(ch,20); /讀19個字符或遇/n結(jié)束 coutThe third part is:chendl; return 0; ,程序運行情況如下: enter a sentence: I like C+./I study C+./I am happy. The string read with cin is:I The second part is: like C+. The third part is:I study C+./I am h,除了以上介紹的用于讀取數(shù)據(jù)的成員函數(shù)外,istream類還有其他在輸入數(shù)據(jù)時用得著的一些成員函數(shù)。常用的有以下幾種: 1. eof 函數(shù) eof是end

35、 of file的縮寫,表示“文件結(jié)束”。從輸入流讀取數(shù)據(jù),如果到達文件末尾(遇文件結(jié)束符),eof函數(shù)值為非零值(表示真),否則為0(假)。,13.3.3 istream類的其他成員函數(shù),例13.8 逐個讀入一行字符,將其中的非空格字符輸出。 #include using namespace std; int main( ) char c; while(!cin.eof( )/eof( )為假表示未遇到文件結(jié)束符 if(c=cin.get( )!= ) /檢查讀入的字符是否為空格字符 cout.put(c); return 0; 運行情況如下: C+ is very interesting.

36、 C+isveryinteresting. Z(結(jié)束),2. peek函數(shù) peek是“觀察”的意思,peek函數(shù)的作用是觀測下一個字符。其調(diào)用形式為 c=cin.peek( );cin.peek 函數(shù)的返回值是指針指向的當(dāng)前字符,但它只是觀測,指針仍停留在當(dāng)前位置,并不后移。如果要訪問的字符是文件結(jié)束符,則函數(shù)值是EOF(-1)。,3. putback函數(shù) 其調(diào)用形式為 cin.putback(ch); 其作用是將前面用get或getline函數(shù)從輸入流中讀取的字符ch返回到輸入流,插入到當(dāng)前指針位置,以供后面讀取。 例13.9 peek函數(shù)和putback函數(shù)的用法。 #include u

37、sing 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 character(ASCII code) is:chendl; cin.putback(c0); /將I插入到指針所指處 cin.getline(c,15,/); coutThe second part is:cendl; return 0; 運行情況如下:

38、 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(下一個字符是空格) The second part is:I am a student 圖13.4,4. ignore函數(shù) 其調(diào)用形式為 cin,ignore(n, 終止字符) 函數(shù)作用是跳過輸入流中n個字符,或在遇到指定的終止字符時提前結(jié)束(此時跳過包括終止字符在內(nèi)的若干字符)。如 ighore(5, A)/跳過輸入流中5個字符,遇A后就不再跳了 也可以

39、不帶參數(shù)或只帶一個參數(shù)。如 ignore( )(n默認值為1,終止字符默認為EOF) 相當(dāng)于 ignore(1,EOF),例13.10用ignore函數(shù)跳過輸入流中的字符。 先看不用ignore函數(shù)的情況: #include using namespace std; int main( ) char ch20; cin.get(ch,20,/); coutThe first part is:chendl; cin.get(ch,20,/); coutThe second part is:chendl; return 0; 運行結(jié)果如下: I like C+./I study C+./I am

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

41、e second part is:chendl; return 0; 運行結(jié)果如下: I like C+./I study C+./I am happy. The first part is:I like C+. The second part is:I study C+.,以上介紹的各個成員函數(shù),不僅可以用cin流對象來調(diào)用,而且也可以用istream類的其他流對象調(diào)用。,迄今為止,我們討論的輸入輸出是以系統(tǒng)指定的標準設(shè)備(輸入設(shè)備為鍵盤,輸出設(shè)備為顯示器)為對象的。在實際應(yīng)用中,常以磁盤文件作為對象。即從磁盤文件讀取數(shù)據(jù),將數(shù)據(jù)輸出到磁盤文件。 所謂“文件”,一般指存儲在外部介質(zhì)上數(shù)據(jù)的集

42、合。一批數(shù)據(jù)是以文件的形式存放在外部介質(zhì)上的。操作系統(tǒng)是以文件為單位對數(shù)據(jù)進行管理的。要向外部介質(zhì)上存儲數(shù)據(jù)也必須先建立一個文件(以文件名標識),才能向它輸出數(shù)據(jù)。,13.4 文件操作與文件流 13.4.1 文件的概念,外存文件包括磁盤文件、光盤文件和U盤文件。目前使用最廣泛的是磁盤文件。 對用戶來說,常用到的文件有兩大類,一類是程序文件(program file)。一類是數(shù)據(jù)文件(data file)。程序中的輸入和輸出的對象就是數(shù)據(jù)文件。 根據(jù)文件中數(shù)據(jù)的組織形式,可分為ASCII文件和二進制文件。 對于字符信息,在內(nèi)存中是以ASCII代碼形式存放的,因此,無論用ASCII文件輸出還是用二

43、進制文件輸出,其數(shù)據(jù)形式是一樣的。但是對于數(shù)值數(shù)據(jù),二者是不同的。例如有一個長整數(shù)100000,在內(nèi)存中占4個字節(jié),如果按內(nèi)部格式直接輸出,在磁盤文件中占4個字節(jié),如果將它轉(zhuǎn)換為ASCII碼形式輸出,則要占6個字節(jié),見圖13.5。,圖13.5 C+提供低級的I/O功能和高級的I/O功能。高級的I/O功能是把若干個字節(jié)組合為一個有意義的單位,然后以ASCII字符形式輸入和輸出。傳輸大容量的文件時由于數(shù)據(jù)格式轉(zhuǎn)換,速度較慢,效率不高。 所謂低級的I/O功能是以字節(jié)為單位輸入和輸出的,在輸入和輸出時不進行數(shù)據(jù)格式的轉(zhuǎn)換。這種輸入輸出速度快、效率高,一般大容量的文件傳輸用無格式轉(zhuǎn)換的I/O。但使用時會

44、感到不大方便。,文件流是以外存文件為輸入輸出對象的數(shù)據(jù)流。輸出文件流是從內(nèi)存流向外存文件的數(shù)據(jù),輸入文件流是從外存文件流向內(nèi)存的數(shù)據(jù)。每一個文件流都有一個內(nèi)存緩沖區(qū)與之對應(yīng)。 請區(qū)分文件流與文件的概念。文件流本身不是文件,而只是以文件為輸入輸出對象的流。若要對磁盤文件輸入輸出,就必須通過文件流來實現(xiàn)。 在C+的I/O類庫中定義了幾種文件類,專門用于對磁盤文件的輸入輸出操作。在圖13.2中可以看到除了已介紹過的標準輸入輸出流類istream,ostream和iostream類外,還有3個用于文件操作的文件類:,13.4.2 文件流類與文件流對象,(1) ifstream類,它是從istream類

45、派生的。 用來支持從磁盤文件的輸入。 (2) ofstream類,它是從ostream類派生的。 用來支持向磁盤文件的輸出。 (3) fstream類,它是從iostream類派生的。 用來支持對磁盤文件的輸入輸出。 要以磁盤文件為對象進行輸入輸出,必須定義一個文件流類的對象,通過文件流對象將數(shù)據(jù)從內(nèi)存輸出到磁盤文件,或者通過文件流對象從磁盤文件將數(shù)據(jù)輸入到內(nèi)存。 其實在用標準設(shè)備為對象的輸入輸出中,也是要定義流對象的,如cin,cout就是流對象,C+是通過流對象進行輸入輸出的。,由于cin,cout已在iostream.h中事先定義,所以用戶不需自己定義。在用磁盤文件時,由于情況各異,無法

46、事先統(tǒng)一定義,必須由用戶自己定義。此外,對磁盤文件的操作是通過文件流對象(而不是cin和cout)實現(xiàn)的。文件流對象是用文件流類定義的,而不是用istream和ostream類來定義的。 可以用下面的方法建立一個輸出文件流對象: ofstream outfile; 現(xiàn)在在程序中定義了outfile為ofstream類(輸出文件流類)的對象。但是有一個問題還未解決: 在定義cout時已將它和標準輸出設(shè)備建立關(guān)聯(lián),而現(xiàn)在雖然建立了一個輸出文件流對象,但是還未指定它向哪一個磁盤文件輸出,需要在使用時加以指定。,1. 打開磁盤文件 打開文件是指在文件讀寫之前做必要的準備工作,包括: (1) 為文件流對

47、象和指定的磁盤文件建立關(guān)聯(lián),以便使文件流流向指定的磁盤文件。 (2) 指定文件的工作方式。 以上工作可以通過兩種不同的方法實現(xiàn)。 (1) 調(diào)用文件流的成員函數(shù)open。如 ofstream outfile;/定義ofstream類(輸出文件流類)對象outfile outfile.open(f1.dat,ios:out); /使文件流與f1.dat文件建立關(guān)聯(lián) 調(diào)用成員函數(shù)open的一般形式為,13.4.3 文件的打開與關(guān)閉,文件流對象.open(磁盤文件名,輸入輸出方式); 磁盤文件名可以包括路徑,如c:newf1.dat,如缺省路徑,則默認為當(dāng)前目錄下的文件。 (2) 在定義文件流對象時指

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

49、調(diào)用構(gòu)造函數(shù)的方式打開文件的,則流對象的值為0。,2. 關(guān)閉磁盤文件 在對已打開的磁盤文件的讀寫操作完成后,應(yīng)關(guān)閉該文件。關(guān)閉文件用成員函數(shù)close。如 outfile.close( );/將輸出文件流所關(guān)聯(lián)的磁盤文件關(guān)閉 所謂關(guān)閉,實際上是解除該磁盤文件與文件流的關(guān)聯(lián),原來設(shè)置的工作方式也失效,這樣,就不能再通過文件流對該文件進行輸入或輸出。此時可以將文件流與其他磁盤文件建立關(guān)聯(lián),通過文件流對新的文件進行輸入或輸出。如 outfile.open(f2.dat,ios:app|ios:nocreate); 此時文件流outfile與f2.dat建立關(guān)聯(lián),并指定了f2.dat的工作方式。,如果

50、文件的每一個字節(jié)中均以ASCII代碼形式存放數(shù)據(jù),即一個字節(jié)存放一個字符,這個文件就是ASCII文件(或稱字符文件)。程序可以從ASCII文件中讀入若干個字符,也可以向它輸出一些字符。 對ASCII文件的讀寫操作可以用以下兩種方法: (1) 用流插入運算符“”輸入輸出標準類型的數(shù)據(jù)。 (2) 用本章13.2.3節(jié)和13.3.2節(jié)中介紹的文件流的put,get,geiline等成員函數(shù)進行字符的輸入輸出。,13.4.4 對ASCII文件的操作,例13.11 有一個整型數(shù)組,含10個元素,從鍵盤輸入10個整數(shù)給數(shù)組,將此數(shù)組送到磁盤文件中存放。 #include using namespace s

51、td; int main( ) int a10; ofstream outfile(f1.dat,ios:out);/定義文件流對象,打開磁盤文件f1.dat if(!outfile) /如果打開失敗,outfile返回0值 cerrai; outfileai ; /向磁盤文件f1.dat輸出數(shù)據(jù) outfile.close(); /關(guān)閉磁盤文件f1.dat return 0; ,運行情況如下: enter 10 integer numbers: 1 3 5 2 4 6 10 8 7 9 請注意: 在向磁盤文件輸出一個數(shù)據(jù)后,要輸出一個(或幾個)空格或換行符,以作為數(shù)據(jù)間的分隔,否則以后從磁盤

52、文件讀數(shù)據(jù)時,10個整數(shù)的數(shù)字連成一片無法區(qū)分。,例13.12 從例13.11建立的數(shù)據(jù)文件f1.dat中讀入10個整數(shù)放在數(shù)組中,找出并輸出10個數(shù)中的最大者和它在數(shù)組中的序號。 #include int main( ) int a10,max,i,order; ifstream infile(f1.dat,ios:in|ios:nocreate); /定義輸入文件流對象,以輸入方式打開磁盤文件f1.dat if(!infile) cerrai;/從磁盤文件讀入10個整數(shù),順序存放在a數(shù)組中 coutai ; /在顯示器上順序顯示10個數(shù) coutendl; max=a0;,order=0;

53、 for(i=1;imax) max=ai; /將當(dāng)前最大值放在max中 order=i; /將當(dāng)前最大值的元素序號放在order中 coutmax=maxendlorder=orderendl; infile.close(); return 0; 運行情況如下: 1 3 5 2 4 6 10 8 7 9(在磁盤文件中存放的10個數(shù)) max=10 (最大值為10) order=6 (最大值是數(shù)組中序號為6的元素),例13.13 從鍵盤讀入一行字符,把其中的字母字符依次存放在磁盤文件f2.dat中。再把它從磁盤文件讀入程序,將其中的小寫字母改為大寫字母,再存入磁盤文件f3.dat。 #incl

54、ude using namespace std; / save_to_file函數(shù)從鍵盤讀入一行字符,并將其中的字母存入磁盤文件 void save_to_file( ) ofstream outfile(f2.dat); /定義輸出文件流對象outfile,以輸出方式打開磁盤文件f2.dat if(!outfile) cerr=65 /將字母字符存入磁盤文件f2.dat,coutci; /同時送顯示器顯示 coutendl; outfile.close(); /關(guān)閉f2.dat /從磁盤文件f2.dat讀入字母字符,將其中的小寫字母改為大寫字母,再存入f3.dat void get_from

55、_file() char ch; ifstream infile(f2.dat,ios:in|ios:nocreate); /定義輸入文件流outfile,以輸入方式打開磁盤文件f2.dat if(!infile) cerropen f2.dat error!endl; exit(1); ofstream outfile(f3.dat); /定義輸出文件流outfile,以輸出方式打開磁盤文件f3.dat if(!outfile) cerropen f3.dat error!endl; exit(1); ,while(infile.get(ch)/當(dāng)讀取字符成功時執(zhí)行下面的復(fù)合語句 if(ch

56、=97 運行情況如下: New Beijing, Great Olypic, 2008, China. NewBeijingGreatOlypicChina(將字母寫入磁盤文件f2.dat,同時在屏幕顯示) NEWBEIJINGGREATOLYPICCHINA (改為大寫字母),磁盤文件f3.dat的內(nèi)容雖然是ASCII字符,但人們是不能直接看到的,如果想從顯示器上觀看磁盤上ASCII文件的內(nèi)容,可以采用以下兩個方法: (1) 在DOS環(huán)境下用TYPE命令,如 D:C+TYPE f3.dat(假設(shè)當(dāng)前目錄是D:C+ ) 在顯示屏上會輸出 NEWBEIJINGGREATOLYPICCHINA 如

57、果用GCC編譯環(huán)境,可選擇File菜單中的DOS Shell菜單項,即可進入DOS環(huán)境。想從DOS返回GCC主窗口,從鍵盤輸入exit即可。 (2) 編一程序?qū)⒋疟P文件內(nèi)容讀入內(nèi)存,然后輸出到顯示器??梢跃幰粋€專用函數(shù)。 #include using namespace std;,void display_file(char *filename) ifstream infile(filename,ios:in|ios:nocreate); if(!infile) cerropen error!endl; exit(1); char ch; while(infile.get(ch) cout.p

58、ut(ch); coutendl; infile.close(); 然后在調(diào)用時給出文件名即可: int main( ) display_file(f3.dat);/將f3.dat的入口地址傳給形參filename return 0; 運行時輸出f3.dat中的字符: NEWBEIJINGGREATOLYPICCHINA,二進制文件不是以ASCII代碼存放數(shù)據(jù)的,它將內(nèi)存中數(shù)據(jù)存儲形式不加轉(zhuǎn)換地傳送到磁盤文件,因此它又稱為內(nèi)存數(shù)據(jù)的映像文件。因為文件中的信息不是字符數(shù)據(jù),而是字節(jié)中的二進制形式的信息,因此它又稱為字節(jié)文件。 對二進制文件的操作也需要先打開文件,用完后要關(guān)閉文件。在打開時要用io

59、s:binary指定為以二進制形式傳送和存儲。二進制文件除了可以作為輸入文件或輸出文件外,還可以是既能輸入又能輸出的文件。這是和ASCII文件不同的地方。,13.4.5 對二進制文件的操作,1. 用成員函數(shù)read和write讀寫二進制文件 對二進制文件的讀寫主要用istream類的成員函數(shù)read和write來實現(xiàn)。這兩個成員函數(shù)的原型為 istream,例13.14 將一批數(shù)據(jù)以二進制形式存放在磁盤文件中。 #include using namespace std; struct student char name20; int num; int age; char sex; ; int

60、main( ) student stud3=Li,1001,18,f,Fun,1002,19,m,Wang,1004,17,f; ofstream outfile(stud.dat,ios:binary); if(!outfile) cerropen error!endl; abort( );/退出程序, for(int i=0;i3;i+) outfile.write(char*) 執(zhí)行一次write函數(shù)即輸出了結(jié)構(gòu)體數(shù)組的全部數(shù)據(jù)。 可以看到,用這種方法一次可以輸出一批數(shù)據(jù),效率較高。在輸出的數(shù)據(jù)之間不必加入空格,在一次輸出之后也不必加回車換行符。在以后從該文件讀入數(shù)據(jù)時不是靠空格作為數(shù)據(jù)

61、的間隔,而是用字節(jié)數(shù)來控制。,例13.15 將剛才以二進制形式存放在磁盤文件中的數(shù)據(jù)讀入內(nèi)存并在顯示器上顯示。 #include using namespace std; struct student string name; int num; int age; char sex; ; int main( ) student stud3; int i; ifstream infile(stud.dat,ios:binary); if(!infile) cerropen error!endl; abort( ); ,for(i=0;i3;i+) infile.read(char*) 運行時在顯示

62、器上顯示: NO.1 name: Li num: 1001 age: 18 sex: f,NO.2 name: Fun num: 1001 age: 19 sex: m NO.3 name: Wang num: 1004 age: 17 sex: f 請思考: 能否一次讀入文件中的全部數(shù)據(jù),如 infile.read(char*),2. 與文件指針有關(guān)的流成員函數(shù) 在磁盤文件中有一個文件指針,用來指明當(dāng)前應(yīng)進行讀寫的位置。對于二進制文件,允許對指針進行控制,使它按用戶的意圖移動到所需的位置,以便在該位置上進行讀寫。文件流提供一些有關(guān)文件指針的成員函數(shù)。為了查閱方便,將它們歸納為書中表13.7,

63、并作必要的說明。 說明: (1) 這些函數(shù)名的第一個字母或最后一個字母不是g就是p。 (2) 函數(shù)參數(shù)中的“文件中的位置”和“位移量”已被指定為long型整數(shù),以字節(jié)為單位?!皡⒄瘴恢谩笨梢允窍旅嫒咧?,ios:beg文件開頭(beg是begin的縮寫),這是默認值。 ios:cur指針當(dāng)前的位置(cur是current的縮寫)。 ios:end文件末尾。 它們是在ios類中定義的枚舉常量。 舉例如下: infile.seekg(100);/輸入文件中的指針向前移到100字節(jié)位置 infile.seekg(-50,ios:cur); /輸入文件中的指針從當(dāng)前位置后移50字節(jié) outfile

64、.seekp(-75,ios:end); /輸出文件中的指針從文件尾后移50字節(jié),3. 隨機訪問二進制數(shù)據(jù)文件 一般情況下讀寫是順序進行的,即逐個字節(jié)進行讀寫。但是對于二進制數(shù)據(jù)文件來說,可以利用上面的成員函數(shù)移動指針,隨機地訪問文件中任一位置上的數(shù)據(jù),還可以修改文件中的內(nèi)容。 例13.16 有5個學(xué)生的數(shù)據(jù),要求: (1) 把它們存到磁盤文件中; (2) 將磁盤文件中的第1,3,5個學(xué)生數(shù)據(jù)讀入程序,并顯示出來; (3) 將第3個學(xué)生的數(shù)據(jù)修改后存回磁盤文件中的原有位置。 (4) 從磁盤文件讀入修改后的5個學(xué)生的數(shù)據(jù)并顯示出來。,要實現(xiàn)以上要求,需要解決3個問題: (1) 由于同一磁盤文件在程序中需要頻繁地進行輸入和輸出,因此可將文件的工作方式指定為輸入輸出文件,即ios:in|ios:out|ios:binary。 (2) 正確計算好每次訪問時指針的

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

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!