




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第8章 C+輸入輸出類層次,ffh,目錄,8.1 概述 8.2 格式化輸入/輸出 8.3 重載流的插入符和提取符 8.4 常用成員函數(shù)I/O 8.5 流的錯(cuò)誤處理 8.6 文件流操作 8.7 字符串流,8.1 概述,輸入輸出操作在C語(yǔ)言中沒(méi)有定義,但提供了一個(gè)I/O流庫(kù) C+輸入輸出類核心是:流! 一個(gè)流就是一個(gè)字節(jié)序列,如果流向程序,這個(gè)流就稱為輸入流:如果流出程序,則稱為輸出流。 如果輸入流來(lái)源于鍵盤,表明你的程序要從鍵盤獲取輸入;如果輸入流來(lái)源于一個(gè)文件,表明程序要從那個(gè)文件獲取輸入。類似地,輸出流可以發(fā)送給屏幕或文件。 主要包括: 標(biāo)準(zhǔn)流類:處理與標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)和輸出設(shè)備(顯示器
2、)關(guān)聯(lián)的數(shù)據(jù)流,8.1 概述,文件流類:處理與磁盤文件關(guān)聯(lián)的數(shù)據(jù)流 字符串流類:利用內(nèi)存中的字符數(shù)組處理數(shù)據(jù)的輸入輸出 異常類等:處理異常錯(cuò)誤 其他:網(wǎng)絡(luò)流等 文件 文件是指存儲(chǔ)在外部介質(zhì)上具有名稱的數(shù)據(jù)集合,8.1.1 標(biāo)準(zhǔn)輸入輸出層次體系,8.1.1 標(biāo)準(zhǔn)輸入輸出層次體系,Ios_base:流的抽象基類,描述了流的基本性質(zhì),不考慮流的字符集 basic_ios:流的抽象基類,描述了流的基本性質(zhì),考慮流的字符集 basic_istream:描述流中讀寫和移動(dòng)數(shù)據(jù)的方法;重載 basic_ostream basic_ifstream:對(duì)文件進(jìn)行讀取 basic_ofstream basic_f
3、stream:從fstreambase類和iostream類中派生,可對(duì)文件進(jìn)行插入和提取操作 basic_istringstream basic_iostream basic_ostringstream basic_stringstream,8.1.2 輸入輸出庫(kù)中的緩沖類層次,C+輸入輸出類結(jié)構(gòu),如圖,系統(tǒng)預(yù)定義4個(gè)流類的對(duì)象:,在使用下述類時(shí),總要包含iostream.h文件: cin:它是istream類的對(duì)象,用來(lái)處理標(biāo)準(zhǔn)輸入,即鍵盤輸入 cout:它是ostream類的對(duì)象,用來(lái)處理標(biāo)準(zhǔn)輸出,即屏幕輸出 cerr:它是ostream類的對(duì)象,用來(lái)處理標(biāo)準(zhǔn)出錯(cuò)信息,它提供不帶緩沖區(qū)的
4、輸出 clog:它是ostream類的對(duì)象,用來(lái)處理標(biāo)準(zhǔn)出錯(cuò)信息,它提供帶緩沖區(qū)的輸出,支持文件的流類,8.2 格式化輸入/輸出,8.2.1 使用ios類的成員函數(shù)進(jìn)行格式控制 8.2.2 使用控制符進(jìn)行格式控制,8.2.1 使用ios類的成員函數(shù)進(jìn)行格式控制,用ios類的成員函數(shù)來(lái)對(duì)輸入/輸出的格式進(jìn)行控制,如格式標(biāo)志字、域?qū)挕⒊涮钭址拜敵鼍鹊取?1使用ios類的成員函數(shù)設(shè)置標(biāo)志字 ios類中聲明了一個(gè)數(shù)據(jù)成員,用于記錄當(dāng)前流的格式化狀態(tài),這個(gè)數(shù)據(jù)成員稱為標(biāo)志字。標(biāo)志字的每一位用于記錄一種格式。 使用標(biāo)志常量或直接用對(duì)應(yīng)的十六進(jìn)制值設(shè)置輸入輸出流的格式。 下表列出了主要標(biāo)志常量名及其意義
5、。,8.2.1 使用ios類的成員函數(shù)進(jìn)行格式控制,8.2.1 使用ios類的成員函數(shù)進(jìn)行格式控制,8.2.1 使用ios類的成員函數(shù)進(jìn)行格式控制,Ios的幾個(gè)直接操作標(biāo)志字的公有成員函數(shù): (1) long flags():該函數(shù)用來(lái)返回標(biāo)志字。 (2) long flags(long):該函數(shù)使用參數(shù)值來(lái)更新標(biāo)志字,并返回更新前的標(biāo)志字。 (3) long setf(long setbits,long field):該函數(shù)用來(lái)將field所指定的標(biāo)志位清零,將setbits為1的標(biāo)志位置為1,并返回設(shè)置前的標(biāo)志字。 (4) long setf(long):該函數(shù)用來(lái)設(shè)置參數(shù)所指定的那些標(biāo)志
6、位,并返回更新前的標(biāo)志字。 (5)long unsetf(long) :該函數(shù)用來(lái)清除參數(shù)所指定的那些標(biāo)志位,并返回更新前的標(biāo)志字。,8.2.1 使用ios類的成員函數(shù)進(jìn)行格式控制,例8.1:以幾種不同的格式輸出同一浮點(diǎn)數(shù),示例如何使用成員函數(shù)來(lái)操作標(biāo)志字。 #include using namespace std; int main( ) double a=12.34;couta=aendl; cout.setf(ios:showpos); cout.setf(0 x0100); couta=aendl; cout.setf(0 x1000); couta=aendl; return 0;
7、,結(jié)果: a=12.34 a=+12.34 a=+1.234000e+001,8.2.1 使用ios類的成員函數(shù)進(jìn)行格式控制,例8.2:以幾種不同的進(jìn)制輸出同一整數(shù)。示例ios定義的公有靜態(tài)符號(hào)常量的作用。 #include using namespace std; int main( ) double a=12; cout.setf(ios:showbase); cout以十進(jìn)制輸出12為:; cout.setf(ios:dec,ios:basefield); cout12endl; cout“以八進(jìn)制輸出12為:“; cout.setf(ios:oct,ios:basefield); co
8、ut12endl; cout以十六進(jìn)制輸出12為:; cout.setf(ios:hex,ios:basefield); cout12endl; return 0; ,輸出結(jié)果 以十進(jìn)制輸出12為:12 以八進(jìn)制輸出12為:014 以十六進(jìn)制輸出12為:0 xc,8.2.1 使用ios類的成員函數(shù)進(jìn)行格式控制,2使用ios類的成員函數(shù)設(shè)置域?qū)?、充填字符及輸出精?在ios類定義了一些設(shè)置域?qū)?、充填字符及輸出精度等成員函數(shù): (1) 設(shè)置輸出數(shù)據(jù)所占寬度的函數(shù): int width() 該函數(shù)用來(lái)返回當(dāng)前輸出的數(shù)據(jù)寬度。 int width(int) 該函數(shù)用來(lái)設(shè)置當(dāng)前輸出的數(shù)據(jù)寬度,并返回更新
9、之前的寬度值。 (2) 填充當(dāng)前寬度內(nèi)的填充字符函數(shù) char fill() 該函數(shù)用來(lái)返回當(dāng)前所使用的填充字符。 charfill(char) 該函數(shù)用來(lái)設(shè)置當(dāng)前填充字符為參數(shù)所表示的字符,并返回更新前的填充字符。,8.2.1 使用ios類的成員函數(shù)進(jìn)行格式控制,(3) 設(shè)置浮點(diǎn)數(shù)輸出精度函數(shù) int precision() 該函數(shù)用來(lái)返回當(dāng)前浮點(diǎn)數(shù)的有效數(shù)字的個(gè)數(shù)。 int precision(int) 該函數(shù)用來(lái)設(shè)置當(dāng)前浮點(diǎn)數(shù)輸出時(shí)的有效數(shù)字個(gè)數(shù)為該函數(shù)的參數(shù)值,并返回更新前的值。,8.2.1 使用ios類的成員函數(shù)進(jìn)行格式控制,例8.3:示例如何使用ios類的成員函數(shù)設(shè)置域?qū)挕⒊涮钭址?/p>
10、及輸出精度。 #include #include using namespace std; int main() double values = 1.23,35.36,653.7,4358.24; char *names = aaaaaaa, bbbb, ccccc, dddddd;,for (int i=0;i4;i+) cout.setf(ios:left);/設(shè)置左對(duì)齊 cout.fill(*);/充填字符為* cout.width(10);/設(shè)置域?qū)挒?0 cout.precision(5);/輸出精度為5 coutnamesi , ”valuesi endl; return 0; 運(yùn)
11、行結(jié)果: aaaaaaa*, 1.23 bbbb*, 35.36 ccccc*, 653.7 dddddd*, 4358.2,8.2.2 使用控制符進(jìn)行格式控制,8.2.2 使用控制符進(jìn)行格式控制,8.2.2 使用控制符進(jìn)行格式控制,例8.4 使用控制符進(jìn)行格式控制,完成例8.3同樣的功能。 #include #include using namespace std; int main() double values = 1.23,35.36,653.7,4358.24; char *names = aaaaaaa, bbbb, ccccc, dddddd; for (int i=0;i4;i
12、+) coutsetiosflags(ios:left) setfill(*)setw(10) namesi, ; coutsetprecision(5) valuesi endl; return 0; ,8.3 重載流的插入符和提取符,運(yùn)算符重載有兩種形式:重載為成員函數(shù)或者是重載為友元函數(shù)。由于重載插入符和提取符時(shí),其左邊的參數(shù)是流,而右邊的參數(shù)是類的對(duì)象,因此,插入符和提取符只能重載為友元函數(shù)。 插入符重載的一般格式如下: ostream ,8.3 重載流的插入符和提取符,例8.5:重載流的插入符和提取符,完成復(fù)數(shù)類的功能。 #include using namespace std; c
13、lass Complex public: Complex(double r=0,double i=0); friend Complex operator + (Complex c1,Complex c2);/重載加 friend Complex operator - (Complex c1,Complex c2);/二元減 friend istream,8.3 重載流的插入符和提取符,Complex :Complex(double r,double i) real=r;imag=i; Complex operator+(Complex c1, Complex c2) Complex temp;
14、 temp.real=c1.real + c2.real; temp.imag=c1.imag + c2.imag; return temp; Complex operator-(Complex c1, Complex c2) Complex temp; temp.real=c1.real - c2.real; temp.imag=c1.imag - c2.imag; return temp; ,8.3 重載流的插入符和提取符,istream ,8.4 常用成員函數(shù)I/O,8.4.1 輸入流的常用成員函數(shù) 8.4.2 輸出流的常用成員函數(shù),8.4.1 輸入流的常用成員函數(shù),1.read()函數(shù)
15、 istream ,Ans:,執(zhí)行該程序顯示如下信息: Input abcd 輸出如下: abcd,8.4.1 輸入流的常用成員函數(shù),2.get()函數(shù) 該函數(shù)有3種主要形式: istream cout Input: ; while(ch = cin.get( )! = EOF) / EOF = -1,包含在 iostream cout.put(ch); cout ok!; Ans: Input: abc xyz 123 z Ok!,8.4.1 輸入流的常用成員函數(shù),3.getline() 與帶3個(gè)參數(shù)的get成員函數(shù)類似,它讀取一行字符串后在字符數(shù)組末尾加入0。不同的是,getline要從輸
16、入流中刪除分隔符(即讀取并刪除它),而不是把它存放在數(shù)組中。 4.gcount()函數(shù) 無(wú)參函數(shù),統(tǒng)計(jì)最后一次輸入操作讀取的字符數(shù)。 例:求每行字符個(gè)數(shù),最長(zhǎng)行字符個(gè)數(shù),多少行 const int SIZE=80; void main( ) int lcnt = 0, lmax=-1; / 行數(shù),最長(zhǎng)行的輸入字符個(gè)數(shù) char bufSIZE; cout Inputn;,while(cin.getline(buf, SIZE) int count = cin.gcount( ); / 輸入字符的個(gè)數(shù) lcnt+; if(count lmax) lmax = count; cout Line #
17、 lcnt t chars read: count endl; cout.write(buf, count).put(n).put(n); cout endl; cout Total line: lcnt endl; cout Longest line: lmax endl; ,Ans:,Input this is a string. Line #1 chars read:18 this is a string. you are a student. Line #2 chars read:19 you are a student. the four seacons of the year. L
18、ine #3 chars read:30 the four seasons of the year. change to a N.332 bus. Line #4 chars read:25 change to a N.332 bus. 輸入后,輸出: Total line:4 Longest line:30,8.4.1 輸入流的常用成員函數(shù),5.ignore()函數(shù) 該函數(shù)原型為: istream 遇到指定的終止字符t時(shí)提前結(jié)束或跳過(guò)輸入流中n個(gè)字符結(jié)束(此時(shí)跳過(guò)包括終止字符內(nèi)的若干個(gè)字符)。終止字符仍停留在輸入流中。,8.4.1 輸入流的常用成員函數(shù),6. putback()函數(shù) 該函數(shù)原
19、型為: istream cout 6,8.4.2 輸出流的常用成員函數(shù),1.write()函數(shù) ostream ,例: 函數(shù)write( ),void main( ) char str = I love C+“; cout The string is: str endl; PrintString(str); PrintString(this is a string); Ans: The string is: I love C+ I love C+ I love this is a str this i,8.4.2 輸出流的常用成員函數(shù),2. put()函數(shù) ostream Ans: a, b
20、a, b AB,8.4.2 輸出流的常用成員函數(shù),例8.6:從輸入的串中分離數(shù)字串,示例常用成員函數(shù)I/O #include using namespace std; int main() char str10; int i=0; cout輸入一個(gè)字符串(最多9個(gè)字符); cin.get(str,10,!);/輸入一個(gè)字符串 char c=stri; cout數(shù)字串為:endl;,8.4.2 輸出流的常用成員函數(shù),while (icin.gcount() if (isdigit(c)/輸出數(shù)字串 cout.put(c); if(isdigit(c) ,8.5 流錯(cuò)誤的處理,8.5.1 I/0流
21、的錯(cuò)誤狀態(tài)字 8.5.2 I/0流的狀態(tài)函數(shù),在對(duì)流進(jìn)行操作時(shí),可能會(huì)發(fā)生錯(cuò)誤 必須有一種能夠檢測(cè)到錯(cuò)誤狀態(tài)的機(jī)制和清除錯(cuò)誤的方法 通過(guò)幾種方法都可以檢測(cè)出錯(cuò)誤,并查明其錯(cuò)誤性質(zhì),然后調(diào)用clear( )函數(shù)清除錯(cuò)誤狀態(tài),可以使得流能夠恢復(fù)處理。,8.5.1 I/0流的錯(cuò)誤狀態(tài)字,ios類定義了一個(gè)數(shù)據(jù)成員,用它來(lái)記錄各種錯(cuò)誤的性質(zhì),稱為狀態(tài)字: goodbit = 0 x00 表示狀態(tài)正常,沒(méi)有位設(shè)置。 fofbit = 0 x01 表示到達(dá)文件末尾。 failbit = 0 x02 表示I/O操作失敗。流沒(méi)有受到破壞,可以恢復(fù)。 badbit = 0 x04 表示試圖進(jìn)行非法操作。設(shè)備硬件
22、故障,不可恢復(fù)。 hardbit = 0 x80 表示致命錯(cuò)誤 使用clear( )函數(shù)可以清除除hardbit以外的其他錯(cuò)所設(shè)置的位。,返回本節(jié),8.5.2 I/0流的狀態(tài)函數(shù),1檢查一個(gè)流對(duì)象當(dāng)前狀態(tài)的成員函數(shù) 有幾個(gè)函數(shù)可用來(lái)檢查一個(gè)流對(duì)象的當(dāng)前狀態(tài),它們都是ios類的成員函數(shù): int rdstate() /返回當(dāng)前的流狀態(tài)字 int eof() /如果提取操作已到達(dá)文件尾,則返回非零值 int fail() /若failbit位置位,返回非零值 int bad() /若badbit位置位,返回非零值 int good() /若狀態(tài)字沒(méi)有置位,則返回非零值 可以使用這些函數(shù)檢查當(dāng)前流的
23、狀態(tài)。,利用函數(shù)來(lái)檢測(cè)流是否出錯(cuò),例如: fstream istrm(f1.dat); if(istrm.good( ) /文件打開(kāi)成功,進(jìn)行某些操作 例如: ofstream ostrm(f2.dat); if(!ostrm.good( ) /文件沒(méi)有被打開(kāi),退出該程序 例如: if(!cin.eof( ) /文件沒(méi)有結(jié)束,可進(jìn)行讀操作 成員函數(shù):int ios:operator !( ) 可判斷流狀態(tài)是否正常 ifstream istrm(f1.dat); if(!istrm) cout f1.dat cant open.n;,8.5.2 I/0流的狀態(tài)函數(shù),2檢查一個(gè)流對(duì)象當(dāng)前狀態(tài)的運(yùn)算
24、符函數(shù) 如果不關(guān)心具體是哪一位置位(具體的錯(cuò)誤性質(zhì)),則可以使用ios類中重載的兩個(gè)運(yùn)算符函數(shù): int ios:operator!(); 在設(shè)置了failbit、badbit或hardbit位的情況下返回非零,而成員函數(shù): ios:operator void*(); 在上述這些位沒(méi)有設(shè)置的情況下(正常狀態(tài))返回非零。這兩個(gè)函數(shù)提供了從兩個(gè)方面測(cè)試流狀態(tài)是否為正常情況的手段。,8.5.2 I/0流的狀態(tài)函數(shù),3清除/設(shè)置流狀態(tài)位函數(shù) ios類的成員函數(shù): void ios:clear(int=0); 用于清除/設(shè)置流的狀態(tài)位(它不能設(shè)置/清除hardfail位)。函數(shù)clear()更多地是用于
25、在己知流發(fā)生錯(cuò)誤的情況下清除流的錯(cuò)誤狀態(tài),也可以用于設(shè)置流的錯(cuò)誤狀態(tài)。例如:,8.6 文件流操作,8.6.1 文件流 8.6.2 文件的打開(kāi)與關(guān)閉 8.6.3 文件的讀寫,8.6.1 文件流,在C+中,文件被看作是元素的序列,即文件是由一個(gè)個(gè)的元素?cái)?shù)據(jù)順序組成的。不考慮記錄的界限,因此這種文件稱為流式文件。 按數(shù)據(jù)的存儲(chǔ)形式來(lái)分類,文件可分為文本文件和二進(jìn)制文件。 在文本文件中,每個(gè)字節(jié)存放一個(gè)ASCII代碼表示一個(gè)字符,文本文件的優(yōu)點(diǎn)是可直接按字符形式輸出,供人們閱讀。 二進(jìn)制文件則是把數(shù)據(jù)的內(nèi)部存儲(chǔ)形式原樣存放到文件中,這種文件的優(yōu)點(diǎn)是與數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式保持一致,因此存儲(chǔ)效率高,無(wú)須
26、進(jìn)行存儲(chǔ)形式的轉(zhuǎn)換,但不能直接按字符形式輸出。,8.6.1 文件流,按數(shù)據(jù)的存取方式來(lái)分類,文件可分為順序文件和隨機(jī)讀寫文件。在C+中,文件既可以進(jìn)行順序訪問(wèn),也可以進(jìn)行隨機(jī)訪問(wèn)。 在C+中,文件定義為文件流類的一個(gè)對(duì)象。 要進(jìn)行文件的輸入輸出,必須先創(chuàng)建個(gè)文件流對(duì)象,并與指定的文件相關(guān)聯(lián),即打開(kāi)文件;然后才能進(jìn)行讀寫操作;完成后再關(guān)閉這個(gè)文件。 文件流是以外存文件為輸入/輸出對(duì)象的數(shù)據(jù)流。輸出文件流是從內(nèi)存流向外存文件的數(shù)據(jù),輸入文件流是從外存文件流向內(nèi)存的數(shù)據(jù)。每一個(gè)文件流都有一個(gè)內(nèi)存緩沖區(qū)與之對(duì)應(yīng)。 C+有三種文件流:輸入文件流、輸出文件流和輸入/輸出文件流。,8.6.2 文件的打開(kāi)與關(guān)
27、閉,1. 打開(kāi)文件 有兩種方法: 先建立流對(duì)象,然后調(diào)用函數(shù)open連接外部文件 流類 對(duì)象名; 對(duì)象名.open(文件名,方式); 調(diào)用流類帶參數(shù)的構(gòu)造函數(shù),建立流對(duì)象的同時(shí)連接外部文件 流類 對(duì)象名(文件名,方式); 其中,“流類”是C+流類庫(kù)定義的文件流類,為ifstream、ofstream或fstream。,8.6.2 文件的打開(kāi)與關(guān)閉,如: ofstream ostrm; ostrm.open(f1.txt); 或 fstream outfile(“f1.txt”, ios:out); 寫 ifstream istrm; istrm.open(f2.txt); 或 ifstream
28、 istrm(“f2.txt”); 讀,ios 文件訪問(wèn)方式常量,方式名 用途 in 以輸入(讀)方式打開(kāi)文件 out 以輸出(寫)方式打開(kāi)文件 app 以輸出追加方式打開(kāi)文件 ate 文件打開(kāi)時(shí),文件指針位于文件尾 trune 如果文件存在,將其長(zhǎng)度截?cái)酁?,并清除原有內(nèi)容;如果文件不存在,則創(chuàng)建新文件 binary 以二進(jìn)制方式打開(kāi)文件,缺省時(shí)為文本方式 nocreate 打開(kāi)一個(gè)已有文件,如該文件不存在,打開(kāi)失敗 noreplace 如果文件存在,除非設(shè)置ios:ate或ios:app,否則打開(kāi)操作失敗 ios:in|ios:out 以讀和寫的方式打開(kāi)文件 ios:out|ios:bin
29、ary 以二進(jìn)制寫方式打開(kāi)文件 ios:in|ios:binary 以二進(jìn)制讀方式打開(kāi)文件,說(shuō)明:,缺省文件的讀寫位置指針位于文件頭 用 ios:app 方式打開(kāi)文件時(shí)文件讀寫位置指針位于文件尾 在以ios:out方式打開(kāi)文件,而未指定ios:in,ios:ate,ios:app 方式時(shí),則隱含為ios:trunc方式 通過(guò)位或操作結(jié)合起來(lái),表示具有幾種方式的操作。例如: ios:in | ios:out | ios:binary / 二進(jìn)制的讀寫 未指定binary方式時(shí),文件都以文本方式打開(kāi)。若指定了 binary方式,則文件以二進(jìn)制方式打開(kāi),8.6.2 文件的打開(kāi)與關(guān)閉,8.6.2 文件
30、的打開(kāi)與關(guān)閉,2. 關(guān)閉文件 當(dāng)結(jié)束一個(gè)文件的操作后,要及時(shí)將該文件關(guān)閉 使用close()成員函數(shù)進(jìn)行關(guān)閉: . close() 其中,是待關(guān)閉的文件流的對(duì)象名。 例如,關(guān)閉文件標(biāo)識(shí)符為 outfile 的文件,使用下面格式: outfile.close( );,例: 文件流被打開(kāi)、關(guān)閉,#include void main( ) ofstream ostrm; ostrm.open(f1.dat); ostrm n d; cout n , d endl; istrm.close( ); Ans: 12,310.85,8.6.3 文件的讀寫,1文本文件的讀寫 文本文件用默認(rèn)方式打開(kāi)。 例8.
31、7:從輸入的串中分離數(shù)字串,先將其存入磁盤文件,然后將其讀出并在屏幕上顯示出來(lái)。 #include #include using namespace std;,int main() char str10;int i=0; cout輸入一個(gè)字符串(最多9個(gè)字符)“; cin.get(str,10,!);/輸入一個(gè)字符串 ofstream outfile(“f1.txt”); /以輸出方式打開(kāi)文件f1.txt if (!outfile) cout“File cannot be opened”endl; return 0; char c=stri; while (icin.gcount() if (
32、isdigit(c) outfilec; /將數(shù)字串存入文件outfile if(isdigit(c) ,outfile0; outfile.close(); ifstream infile(“f1.txt”); /以輸入方式打開(kāi)文件f1.txt if (!infile) cout“File cannot be opened”endl; return 0; cout存入f1.txt文件中的數(shù)字串為:endl; while(!infile.eof() /從文件中讀出數(shù)據(jù),并輸出到屏幕上。 infile.getline(str,sizeof(str);/從文件中讀出一行數(shù)據(jù) coutstrendl
33、; infile.close(); return 0; ,例 單字符讀寫函數(shù) get( )和put( ),#include using namespace std; #include #include #include void main( ) fstream outfile, infile; outfile.open(f3.dat, ios:out); if(!outfile) cout f3.dat cant open.n; abort( ); char str = this is a C+ program.; for(int i = 0; i= strlen(str); i+) outf
34、ile.put(stri); outfile.close( );,例 單字符讀寫函數(shù) get( )和put( ),infile.open(f3.dat, ios:in); if(!infile) cout f3.dat cant open.n; abort( ); char ch; while(infile.get(ch) cout ch; cout endl; infile.close( ); Ans: this is a C+ program.,例: 文件拷貝,#include using namespace std; #include #include void main( ) fstr
35、eam infile, outfile; infile.open(f2.dat, ios:in); if(!infile) cout f2.dat can?t open.n; abort( ); outfile.open(f4.dat, ios:out); if(!outfile) cout f4.dat cant open.n; abort( ); char ch; while(infile.get(ch) outfile.put(ch); infile.close( );outfile.close( ); ,8.6.3 文件的讀寫,2二進(jìn)制文件的讀寫 打開(kāi)二進(jìn)制文件時(shí),在 open( )函
36、數(shù)中要加上 ios:binary 寫入信息時(shí),使用write( )函數(shù) 讀信息,使用read( )函數(shù) 例8.8:用二進(jìn)制文件處理學(xué)生信息 #include #include /文件流頭文件 #include using namespace std;,class student private: long num; string name; float score; public: void setnum() /輸入學(xué)號(hào)num coutnum; void setname() /輸入姓名name coutname; void setscore() /輸入學(xué)號(hào)成績(jī) coutscore; ,long
37、 getnum() return num; / 得到學(xué)號(hào) string getname() return name; /得到姓名 float getscore() return score; /得到成績(jī) ; int main() ofstream outfile(student.dat,ios:binary); if(!outfile) coutFile cannot be opened.endl;return 0; student stud100; char ch; int i=0;,while(1) coutch; if(ch=n|ch=N) break; i=i+1; studi.set
38、num(); /輸入學(xué)號(hào) studi.setname(); /輸入姓名 studi.setscore(); /輸入成績(jī) outfile.write(char*),coutch; if(ch=Y|ch=y) ifstream infile(student.dat,ios:binary); if(!infile) coutFile cannot be opened.endl; return 0; cout學(xué)號(hào)t姓名t成績(jī)endl; infile.read(char*) ,8.6.3 文件的讀寫,3文件的隨機(jī)讀寫 文件打開(kāi)以后,系統(tǒng)自動(dòng)生成兩個(gè)隱含的流指針:讀指針和寫指針。 在輸入文件流類中,有關(guān)讀
39、指針的函數(shù)如下: (1) 移動(dòng)讀指針函數(shù) istream 其中,origin的類型seek_dir是一個(gè)枚舉類型,可有以下三種取值: ios:beg 表示指針的起始位置為文件頭 ios:cur 表示指針的起始位置為當(dāng)前位置 ios:end 表示指針的起始位置為文件尾 該函數(shù)的功能是從origin指定的開(kāi)始位置起,將文件指針移動(dòng)offset個(gè)字節(jié)數(shù)。,例,假設(shè)input是一個(gè)istream類型的流: input.seekg(-100, ios:cur); 以當(dāng)前位置為基準(zhǔn)向前(流的開(kāi)始位置方向)移動(dòng)100各字節(jié)處 input.seekg(100, ios:beg); 從流開(kāi)始的位置后移100個(gè)字
40、節(jié)處 input.seekg(-100, ios:end); 相對(duì)于流結(jié)尾處前移100個(gè)字節(jié)處,8.6.3 文件的讀寫,(2)返回讀指針當(dāng)前指向的位置值 streampos istream:tellg( ); 該函數(shù)的功能是確定文件指針的當(dāng)前位置。 相應(yīng)地,ostream類提供有關(guān)寫指針的函數(shù)如下: (1) 移動(dòng)寫指針函數(shù) ostream 函數(shù)參數(shù)的意義與讀指針函數(shù)一樣。,例 讀、寫指針操作,#include #include #include void main( ) fstream file(f6.dat, ios:in | ios:out | ios:binary); if(!file)
41、 cout f6.dat cant open.n“; abort( ); for(int i=0; i15; i+) / 每個(gè) int,占4 個(gè) byte file.write(char *),file.seekg(pos); / 輸入文件,讀 file.read(char *) ,Ans:,Current byte number: 60 The data stored is 15 The data stored is 95 The data stored is 21 Current byte number: 88,例: 數(shù)組,#include #include #include void m
42、ain( ) struct student char name20; long number; double totalscord; stu5=Ma,97001,85.72, Li,97002,92.62, Hu,97003,89.25,Yan,97004,90.84,Lu,97005,80.92; fstream file; student one;,file.open(f7.dat, ios:out | ios:in | ios:binary); if (!file1) cout “f7.dat cant open.n; abort( ); for(int i=0; i 5; i+) fi
43、le1.write(char *) ,Ans:,Lu 97005 80.92 Li 97002 92.62,8.6.3 文件的讀寫,例8.9:用二進(jìn)制文件隨機(jī)處理學(xué)生信息 #include #include /文件流頭文件 #include using namespace std; class student private: long num; string name; float score;,8.6.3 文件的讀寫,public: void setnum() cinnum; /輸入學(xué)號(hào) void setname() cinname; /輸入姓名 void setscore() cinsc
44、ore; /輸入成績(jī) long getnum() return num; / 得到學(xué)號(hào) string getname() return name; /得到姓名 float getscore() return score; /得到成績(jī) ; int main() fstream file; file.open(student.dat,ios:in|ios:out|ios:binary); if(!file) cout“File cannot be opened.”endl; return 0; student stud100,s;,8.6.3 文件的讀寫,cout首先輸入3個(gè)學(xué)生的信息:endl;
45、 cout學(xué)號(hào)t姓名t成績(jī)endl; for(int i=0;i3;i+) studi.setnum(); /輸入學(xué)號(hào) studi.setname(); /輸入姓名 studi.setscore(); /輸入成績(jī) file.write(char*),8.6.3 文件的讀寫,cout輸出第2,4個(gè)學(xué)生的信息:endl; cout學(xué)號(hào)t姓名t成績(jī)endl; file.seekg(sizeof(student)*1);/讀指針移到第2條記錄 file.read(char*) ,8.6.4 其它有關(guān)文件操作的函數(shù),1. 跳過(guò)輸入流中指定數(shù)量的字符的函數(shù) 該函數(shù)原型如下: istream 功能是從流中跳
46、過(guò)n個(gè)字符,或者直到發(fā)現(xiàn)終止符t為止 一般的使用 ctrl+z 鍵結(jié)束從鍵盤上鍵入的輸入流,例:輸入整數(shù),發(fā)現(xiàn)錯(cuò)誤,則跳過(guò)當(dāng)前輸入,等待下一次輸入 void main( ) int a; cout a; while(!cin) /判斷輸入流 cin 是否有錯(cuò),有錯(cuò)時(shí)cin 為 0 cin.clear( ); /清楚錯(cuò)誤標(biāo)志位,等待下次輸入 /最多跳過(guò)80字符或遇n為止,等待下次輸入 cin.ignore(80,n); cout a; cout The integer entered is a endl; ,Ans:,Input an integer:a789y Try again! 678a
47、The integer you entered is 678,2.退回一個(gè)字符到輸入流的函數(shù) 函數(shù)原型如下: istream void main( ) char buf80; cout Enter stream:n; while(getnum(buf) cout Digit string is: buf endl; ,int getnum(char *s) / 每次處理一個(gè)數(shù)字串 int flag(0); /標(biāo)志量,沒(méi)有數(shù)字串返回為 0 char ch; while(cin.get(ch) ,Ans: 執(zhí)行該程序顯示如下信息: Enter stream: ab768 54xy128m96 n763 輸出如下結(jié)果: Digitstring is 768 Digitstring is 54 Digitstring is 128 Digitstring is 96 Digitstring is 763 按Ctrl+z鍵,退出該程序,3. 返回輸入流中下一個(gè)字符的函數(shù) 函數(shù)原型為: int istream:peek( ); 功能是返回
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆中建七局秋季校園招聘正式啟動(dòng)“七”待有你共建未來(lái)筆試參考題庫(kù)附帶答案詳解
- 個(gè)人經(jīng)營(yíng)借款合同范本
- 動(dòng)車輪椅租賃合同范本
- 產(chǎn)品代銷售合同范本
- mcn商務(wù)推廣合同范本
- 借款續(xù)約合同范本
- 傳媒行業(yè)培訓(xùn)合同范本
- 武侯衛(wèi)生間補(bǔ)漏施工方案
- 保利地產(chǎn)施工合同范本
- 專利免責(zé)合同范例
- 《駱駝祥子》通讀指導(dǎo)手冊(cè)
- 股東會(huì)會(huì)議系列文件(通知、議程、簽到表、表決票、決議)
- 非法占用農(nóng)田建房舉報(bào)信范文
- 伐樹(shù)工程施工合同范本
- 數(shù)據(jù)挖掘(第2版)PPT全套完整教學(xué)課件
- 工程開(kāi)工報(bào)告(5篇)
- 配電箱試驗(yàn)項(xiàng)目
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制課件第一章運(yùn)動(dòng)技能學(xué)習(xí)與控制概述
- 溫室大棚花卉苗圃采暖方案空氣源熱泵
- BEC商務(wù)英語(yǔ)高級(jí)考試歷年真題
- 初二地理中考復(fù)習(xí)備考策略與計(jì)劃
評(píng)論
0/150
提交評(píng)論