第九章輸入輸出流庫(kù)_第1頁(yè)
第九章輸入輸出流庫(kù)_第2頁(yè)
第九章輸入輸出流庫(kù)_第3頁(yè)
第九章輸入輸出流庫(kù)_第4頁(yè)
第九章輸入輸出流庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩65頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、A8bct y x1234源設(shè)備源設(shè)備目標(biāo)設(shè)備目標(biāo)設(shè)備字符序列從源設(shè)備連續(xù)不斷地流向目標(biāo)設(shè)備,字符序列從源設(shè)備連續(xù)不斷地流向目標(biāo)設(shè)備,最后按先流出先到達(dá)的有序方式匯聚在目標(biāo)設(shè)最后按先流出先到達(dá)的有序方式匯聚在目標(biāo)設(shè)備中,如同河流一樣,故此叫流。備中,如同河流一樣,故此叫流。流對(duì)象定義流對(duì)象定義說(shuō)說(shuō) 明明ostream cout; cout與標(biāo)準(zhǔn)輸出設(shè)備相關(guān)聯(lián)(顯示器)ostream cerr; cerr與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相關(guān)聯(lián)(非緩沖方式)ostream clog; clog與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相關(guān)聯(lián)(緩沖方式)istream cin;與標(biāo)準(zhǔn)輸入設(shè)備相關(guān)聯(lián)(鍵盤(pán))9.2 使用cin與cout輸入

2、/輸出數(shù)據(jù) cin:設(shè)備輸入流對(duì)象(鍵盤(pán)),與運(yùn)算符一起完成輸入操作。 cout:設(shè)備輸出流對(duì)象(顯示器),與運(yùn)算符一起完成輸出操作。 :插入操作符,是重載的左移位運(yùn)算符,C+編譯時(shí)首先檢查其左右操作數(shù),以判斷是執(zhí)行移位還是插入操作,所以不會(huì)出現(xiàn)歧義。該操作符用來(lái)輸出變量數(shù)據(jù)。 格式為:cout:析取操作符,是重載的右移位運(yùn)算符,C+編譯時(shí)首先檢查其左右操作數(shù),以判斷是執(zhí)行移位還是析取操作,所以不會(huì)出現(xiàn)歧義。該操作符用來(lái)為變量輸入數(shù)據(jù)。 格式為:cin變量列表;1.使用cin輸入數(shù)據(jù)(1)語(yǔ)法輸入單個(gè)變量的值cinx;輸入多個(gè)變量的值cinx1x2x3x4xn; 其中x,x1,xn可以是內(nèi)置數(shù)

3、據(jù)類(lèi)型如int,char,float,double等。(2)注意事項(xiàng)在一條cin語(yǔ)句中同時(shí)為多個(gè)變量輸入數(shù)據(jù)時(shí),輸入數(shù)據(jù)的個(gè)數(shù)應(yīng)當(dāng)與cin語(yǔ)句中變量個(gè)數(shù)相同,各輸入數(shù)據(jù)之間用一個(gè)或多個(gè)空白(包括空格、回車(chē)、Tab)作為間隔符,全部數(shù)據(jù)輸入完成后,按Enter鍵結(jié)束。 在后面只能出現(xiàn)變量名,下面的語(yǔ)句是錯(cuò)誤的。 cinx=x;/錯(cuò)誤,后面含有字符串x= cin12x;/錯(cuò)誤,后面含有常數(shù)12cin具有自動(dòng)識(shí)別數(shù)據(jù)類(lèi)型的能力,析取運(yùn)算將根據(jù)它后面的變量的類(lèi)型從輸入流中為它們提取對(duì)應(yīng)的數(shù)據(jù)。 比如:cinx; 假設(shè)輸入數(shù)據(jù)2,析取運(yùn)算符將根據(jù)其后的x的類(lèi)型決定輸入的2到底是數(shù)字還是字符。若x是cha

4、r類(lèi)型,則2就是字符;若x是int,float之類(lèi)的類(lèi)型,則2就是一個(gè)數(shù)字。 再如,若輸入34,且x是char類(lèi)型,則只有字符3被存儲(chǔ)到x中,4將繼續(xù)保存在流中;若x是int或float,則34就會(huì)存儲(chǔ)x中。數(shù)值型數(shù)據(jù)的輸入 在讀取數(shù)值型數(shù)據(jù)時(shí),析取運(yùn)算符首先略掉數(shù)據(jù)前面的所有空白符號(hào),在遇到正、負(fù)號(hào)或數(shù)字,才開(kāi)始讀入,包括浮點(diǎn)型數(shù)據(jù)的小數(shù)點(diǎn),并在遇到空白符或其他非數(shù)字字符時(shí)停止。例如:int x1;double x2;char x3;cinx1x2x3; 假如輸入35.4A并按Enter鍵,x1是35、x2 是0.4、x3是A。(3)輸入數(shù)據(jù)案例分析假設(shè)有變量定義語(yǔ)句如下:int a,b;d

5、ouble z;char ch;下面的語(yǔ)句說(shuō)明數(shù)據(jù)輸入的含義。語(yǔ)句 輸入內(nèi)存變量的值cinch; Ach=Acinch; ABch=A,而B(niǎo)被保留在輸入流中等待被讀取cina; 32a=32cina; 32.23a=32,.23留在輸入流中等待被讀取cinz; 76.21z=76.21cinz; 65z=65.0語(yǔ)句 輸入內(nèi)存變量的值cinachz; 23 B 3.2a=23,ch=B,Z=3.2cinachz; 23B3.2a=23,ch=B,Z=3.2cinabz; 23 32a=23,b=32,等待輸入下一個(gè)數(shù)據(jù)存入zcinaz; 2 3.2 24a=2,z=3.2,24被保留在輸入流中

6、等待被讀取cinach; 132a=132,計(jì)算機(jī)等待輸入 ch的值cincha; 132ch=1,a=322.使用cout輸出數(shù)據(jù)(1)語(yǔ)法輸出單個(gè)變量的值coutx;輸出多個(gè)變量的值coutx1x2x3x4xn; 其中x,x1,xn可以是內(nèi)置數(shù)據(jù)類(lèi)型如int,char,float,double等。(2)注意事項(xiàng)cout既可輸出變量的值,也可輸出常量。對(duì)于字符變量和字符串變量,cout將把變量的值輸出到顯示器上。對(duì)于字符常量和字符串常量,cout將把它們?cè)瓨虞敵鲈谄聊簧?。與C語(yǔ)言一樣,在C+程序中也可以將一條命令寫(xiě)在多行上。輸出換行。在cout語(yǔ)句中換行可用:“n”或endl。在連續(xù)輸出多個(gè)

7、數(shù)據(jù)時(shí),應(yīng)注意在數(shù)據(jù)之間插入間隔符。因?yàn)閏out輸出不帶任何格式。確定數(shù)制基數(shù),輸出時(shí)可用hex(16進(jìn)制),oct(8進(jìn)制),dec(10進(jìn)制)指定輸出數(shù)值型數(shù)據(jù)的進(jìn)制。如:#includevoid main() int x=34; couthex17 x 18endl;/顯示11 22 12 cout17 octx 18endl;/顯示11 42 22 coutdec17 x 18(double &);istream& operator();/還有重載其它類(lèi)型數(shù)據(jù)的輸入int get();istream& get(char *,int,char =n);istrea

8、m& get(char &);istream& getline( char *,int,char =n);istream& read(char *,int);istream& ignore(int =1,int =EOF);. ;2.istream成員函數(shù)使用說(shuō)明(1)get()函數(shù)int get() 不帶參數(shù)的get()從輸入流中提取一個(gè)字符(包括空白字符),并返回該字符作為函數(shù)的調(diào)用值。當(dāng)遇到文件結(jié)束時(shí),返回文件結(jié)束符EOF。istream& get(char *c,int n,char=n) 從輸入流中提取n-1個(gè)字符(包括空白字符)存入字

9、符數(shù)組c中,并在字符串末尾自動(dòng)加0。 第3個(gè)參數(shù)用于指定字符結(jié)束的分隔符,默認(rèn)是n。該函數(shù)在下列情況會(huì)終止讀取字符的操作:讀取了n-1個(gè)字符;遇到了指定的結(jié)束分隔符;遇到了文件結(jié)束符。 注意:該函數(shù)不會(huì)將輸入流中的結(jié)束分隔符讀入數(shù)組中,數(shù)據(jù)讀取完成后結(jié)束分隔符仍保留在輸入流中,為后續(xù)數(shù)據(jù)讀入留下隱患。istream& get(char &c) 從輸入流中提取一個(gè)字符(包括空白字符)送字符引用c中。遇到文件結(jié)束符時(shí)返回0,否則返回istream對(duì)象的引用。(2)istream& read(char *c,int n) 從輸入流中讀取n個(gè)字節(jié)送字符數(shù)組c中。非格式化的讀,對(duì)

10、讀取的字節(jié)不作任何處理,數(shù)據(jù)由程序解釋。(3) istream& ignore(int n=1,int=EOF) 從輸入流中讀取n個(gè)(默認(rèn)1個(gè))字符不保存,遇到指定結(jié)束符(默認(rèn)EOF)時(shí)終止輸入。實(shí)質(zhì)上從輸入流中刪除n個(gè)字符。(4) istream& getline( char *c,int n,char=n) 從輸入流中提取n-1個(gè)字符(包括空白字符)存入字符數(shù)組c中,并在字符串末尾自動(dòng)加0。 第3個(gè)參數(shù)用于指定字符結(jié)束的分隔符,默認(rèn)是n。該函數(shù)在下列情況會(huì)終止讀取字符的操作:讀取了n-1個(gè)字符;遇到了指定的結(jié)束分隔符;遇到了文件結(jié)束符。 注意:該函數(shù)不會(huì)將輸入流中的結(jié)束分隔

11、符讀入數(shù)組中,但會(huì)清除結(jié)束分隔符,為后續(xù)數(shù)據(jù)讀入提供方便。例:用函數(shù)get和getline讀取數(shù)據(jù)。#include void main()char c,a80,s180;coutuse get() input char: ;while(c=cin.get()!=n)/輸入abcdcoutc;/顯示abcdcoutendl;coutuse get(a,10) input char: ;cin.get(a,10); /輸入12345678,不夠9個(gè)字符coutaendl;/顯示12345678cin.ignore();/清除上次輸入的ncoutuse getline(s1,10) input c

12、har: ;cin.getline(s1,10);/輸入this is a str,讀9個(gè)couts1endl;/顯示this is a 本例輸入流及數(shù)據(jù)讀取情況如下圖所示:3.ostream類(lèi)中的常用成員函數(shù)class ostream:virtual public iospublic: ostream& operator(long &); ostream& operator(); /還有重載其它類(lèi)型數(shù)據(jù)的輸出 . ostream& flush();ostream& put(char);ostream& write(const char *,in

13、t);.;4.ostream成員函數(shù)使用說(shuō)明(1)ostream& put(char c) 插入一個(gè)無(wú)格式的字節(jié)到輸出流中。其中c是要輸出的字符,函數(shù)返回輸出流對(duì)象的引用。(2)ostream& write(const char *c,int n) 插入一個(gè)無(wú)格式的字符序列到輸出流中。其中c是要輸出的字符數(shù)組,n是要輸出的字符個(gè)數(shù),函數(shù)返回輸出流對(duì)象的引用。(3)ostream& flush() 緩沖輸出:數(shù)據(jù)寫(xiě)入緩沖區(qū),緩沖區(qū)滿時(shí)才將數(shù)據(jù)送輸出設(shè)備。緩沖輸出的輸出數(shù)據(jù)會(huì)有所延遲。 非緩沖輸出:數(shù)據(jù)寫(xiě)入緩沖區(qū),并立即將數(shù)據(jù)送輸出設(shè)備。 輸出緩沖區(qū)刷新函數(shù)。用于刷新輸出流

14、,即不論緩沖區(qū)滿與不滿,立即將緩沖區(qū)中的數(shù)據(jù)送到輸出設(shè)備。例:用get讀取數(shù)據(jù),用put及write輸出。#includevoid main()char c;char a =This is a string!;coutuse get() input char: ;while(c=cin.get()!=n) /輸入how are you!cout.put(c);/顯示how are you!cout.put(n);cout.put(T).put(h).put(i).put(s).put(n);/顯示Thiscout.write(a,sizeof(a)-1).put(n);/顯示This is a

15、 string!cout“l(fā)ook”“there!”endl; /顯示look here! 9.4 數(shù)據(jù)輸入/輸出的格式控制1.格式控制的目的(1)進(jìn)行不同進(jìn)制之間的轉(zhuǎn)換:8進(jìn)制、16進(jìn)制、十進(jìn)制等。(2)精度的控制:小數(shù)點(diǎn)的位數(shù)等。(3)輸入/輸出的寬度控制。(4)格式之間的狀態(tài)轉(zhuǎn)換。2. 格式控制的方法(1)使用ios類(lèi)中的有關(guān)格式控制的成員函數(shù) 格式控制狀態(tài)標(biāo)志 輸入輸出的格式由各種狀態(tài)標(biāo)志來(lái)確定,這些標(biāo)志在ios類(lèi)中定義為枚舉量,用一個(gè)十六位二進(jìn)制數(shù)表示。ios:skipws跳過(guò)輸入流中的空白字符ios:left輸出數(shù)據(jù)按左對(duì)齊,如12 ios:right輸出數(shù)據(jù)按右對(duì)齊,如 12io

16、s:dec按十進(jìn)制數(shù)據(jù)輸出ios:oct按八進(jìn)制數(shù)據(jù)輸出ios:hex按十六進(jìn)制數(shù)據(jù)輸出ios:showbase在輸出數(shù)據(jù)前面顯示基數(shù)(八進(jìn)制是0,十六進(jìn)制是0 x)ios:showpoint浮點(diǎn)數(shù)輸出帶小數(shù)點(diǎn)ios:uppercase用大寫(xiě)字母輸出十六進(jìn)制數(shù)(即ABCDEF,默認(rèn)是小寫(xiě))ios:showpos在正數(shù)前加“+”ios:scientific用科學(xué)計(jì)數(shù)法輸出浮點(diǎn)數(shù),如2.122E2ios:fixed用定點(diǎn)數(shù)形式輸出浮點(diǎn)數(shù),如212.2ios:unitbuf完成后立即刷新緩沖區(qū)設(shè)置標(biāo)志 用ios類(lèi)的成員函數(shù)setf()設(shè)置,格式為: cin.setf(ios:標(biāo)志位 |);/“|”表

17、示同時(shí)設(shè)置若干個(gè)標(biāo)志 或cout.setf(ios:標(biāo)志位 |); 清除標(biāo)志 用ios類(lèi)的成員函數(shù)unsetf()設(shè)置,格式為: cin.unsetf(ios:標(biāo)志位 |); /“|”表示同時(shí)清除若干個(gè)標(biāo)志 或cout.unsetf(ios:標(biāo)志位 |);取狀態(tài)標(biāo)志 用ios類(lèi)的成員函數(shù)flags(),格式為: cin.flags(); cout.flags();/返回流的標(biāo)志位 或cin.flags(ios:標(biāo)志位 ); cout.flags(ios:標(biāo)志位 ); /重新設(shè)/置并返回流的標(biāo)志位設(shè)置域?qū)?用ios類(lèi)的成員函數(shù)width()設(shè)置,格式為: cout.width(n);/設(shè)置輸出域

18、寬n位并返回原來(lái)域?qū)?cout.width( );/返回當(dāng)前域?qū)?填充字符 用ios類(lèi)的成員函數(shù)fill()設(shè)置,與width()配合,格式為: cout.fill(字符);/設(shè)置填充字符并返回原來(lái)填充字符 cout.fill( );/返回當(dāng)前填充字符設(shè)置精度 用ios類(lèi)的成員函數(shù)precision()設(shè)置,格式為: cout.precision(n);/設(shè)置顯示精度為n位并返回原來(lái)精度 cout.precision( );/返回當(dāng)前顯示精度例:用ios成員函數(shù)及格式化標(biāo)志設(shè)置輸出數(shù)據(jù)的格式#includevoid main() char c=this is string; double d=

19、-1234.8976; cout.width(30);/設(shè)置域?qū)?0個(gè)字符 cout.fill(*);/填充字符“*” cout.setf(ios:right);/輸出右對(duì)齊(默認(rèn)) coutc“-L1”endl;/輸出c,左邊填充“*”cout.width(30); /每個(gè)輸出語(yǔ)句需要設(shè)置寬度 cout.setf(ios:left);/左對(duì)齊 coutc“-L2”endl; /輸出c,右邊填充“*“cout.setf(ios:dec|ios:showbase|ios:showpoint); cout.width(30);/十進(jìn)制,顯示基數(shù),浮點(diǎn)數(shù)輸出帶小數(shù)點(diǎn) coutd“-L3”“n”;/默

20、認(rèn)6位精度 cout.setf(ios:showpoint);/浮點(diǎn)數(shù)輸出帶小數(shù)點(diǎn) cout.precision(10);/精度10位,不含小數(shù)點(diǎn)與符號(hào)位 cout.width(30);/每個(gè)輸出語(yǔ)句需要設(shè)置寬度 coutd-L4n; cout.width(30); cout.setf(ios:oct);/顯示基數(shù),八進(jìn)制 cout100-L5n; 運(yùn)行結(jié)果:*this is string-L1this is string*-L2-1234.90*-L3-1234.897600*-L40144*-L5(2)使用操縱符及操縱符函數(shù)控制格式 改變格式比較簡(jiǎn)單的方法是使用特殊的、類(lèi)似于函數(shù)的運(yùn)算符,

21、稱(chēng)為操縱符,也叫操縱算子。它以一個(gè)流引用為參數(shù),并返回同一流的引用,并可以嵌入到輸入或輸出鏈中,即不要前綴流對(duì)象,直接調(diào)用操縱符。 使用操縱符及操縱符函數(shù)需要在源程序中包含頭文件“iomanip.h”操縱符Showbase(noshowbase)顯示(不顯示)數(shù)值的基數(shù)前綴Showpoint(noshowpoint) 顯示小數(shù)點(diǎn)(存在小數(shù)部分時(shí)才顯示小數(shù)點(diǎn))showpos(noshowpos) 在非負(fù)數(shù)中顯示(不顯示)”+”skipws(noskips) 輸入數(shù)據(jù)時(shí),跳過(guò)(不跳過(guò))空白字符uppercase(nouppercase)十六進(jìn)制顯示為0X(0 x) ,科學(xué)計(jì)數(shù)法顯示E(e)dec/

22、oct/hex十進(jìn)制/八進(jìn)制/十六進(jìn)制left/right設(shè)置數(shù)據(jù)輸出對(duì)齊方式為:左/右 對(duì)齊fixed以小數(shù)形式顯示浮點(diǎn)數(shù)scientific用科學(xué)計(jì)數(shù)法顯示浮點(diǎn)數(shù)flush刷新輸出緩沖區(qū)ends插入空白字符,然后刷新ostream緩沖區(qū)endl插入換行字符,然后刷新ostream緩沖區(qū)ws跳過(guò)開(kāi)始的空白操縱符函數(shù)setfill(ch)設(shè)置以ch中的字符為填充字符setprecision(n)設(shè)置精度為n位有效數(shù)字setw(w)設(shè)置數(shù)據(jù)的輸出寬度為w個(gè)字符setbase(b)基數(shù)設(shè)置為b(b=8,10,16)進(jìn)制例:實(shí)數(shù)的精度控制#include #include #include void

23、 main() double x=sqrt(2.0); for(int index=0;index9;index+) cout.precision(index); /使用ios的成員函數(shù)設(shè)置精度coutxendl; coutendl; for(index=0;index9;index+)coutsetprecision(index)xendl; /使用操縱符設(shè)置精度運(yùn)行結(jié)果: 1 1 1.4 1.41 1.414 1.4142 1.41421 1.414214 1.4142136例:輸出寬度的控制 #include #include void main( ) int x=12345; /缺省格

24、式為右對(duì)齊缺省格式為右對(duì)齊 coutDefault is on right:endlsetw(10)xendlendl; /修改為左對(duì)齊修改為左對(duì)齊 cout.setf(ios:left); coutsetw(10)xendlendl; /取消左對(duì)齊又變?yōu)橛覍?duì)齊取消左對(duì)齊又變?yōu)橛覍?duì)齊 cout.unsetf(ios:left); coutsetw(10)xendl; 運(yùn)行結(jié)果:Default is on right: 1234512345 12345例:格式輸出中空白的填充 #include #include void main() int x=12345; /缺省為右對(duì)齊缺省為右對(duì)齊 cou

25、tDefault is on right:endlsetw(10)xendlendl; /右對(duì)齊,左邊填充右對(duì)齊,左邊填充“*” cout.fill(*); coutsetw(10)xendlendl; /左對(duì)齊,右邊填充左對(duì)齊,右邊填充“%” cout.setf(ios:left); coutsetw(10)setfill(%)xendl; 運(yùn)行結(jié)果:Default is on right: 12345*1234512345%例:科學(xué)計(jì)算等格式輸出 #includevoid main() double x=0.001234567,y=1.946e9; coutDisplayed in def

26、ault format:endlxtyendlendl; /缺省格式輸出(定點(diǎn)) cout.setf(ios:scientific); /科學(xué)表示格式輸出 coutDisplayed in scientific format:endlxtyendl; cout.setf(ios:fixed); /定點(diǎn)格式輸出 coutDisplayed in fixed format:endlxtyendl; 運(yùn)行結(jié)果:Displayed in default format:0.00123457 1.946e+009 Displayed in scientific format:1.234567e-003 1

27、.946000e+009Displayed in fixed format:0.00123457 1.946e+0099.5 文件的輸入/輸出1.概述(1)文件的概念 文件是存儲(chǔ)在存儲(chǔ)介質(zhì)上(如磁盤(pán)、磁帶、光盤(pán))的數(shù)據(jù)集合。(2)文件的類(lèi)型文本文件 文本文件在磁盤(pán)上存放相關(guān)字符的ASCII碼,所以又稱(chēng)為ASCII文件。二進(jìn)制文件 二進(jìn)制文件在磁盤(pán)上存儲(chǔ)相關(guān)數(shù)據(jù)的二進(jìn)制代碼,它是把內(nèi)存中的數(shù)據(jù),按其在內(nèi)存中的存儲(chǔ)形式原樣寫(xiě)到磁盤(pán)上而形成的文件。(3)流與文件 C+將文件看成是一個(gè)個(gè)字符在磁盤(pán)上的有序集合,用流來(lái)實(shí)現(xiàn)文件的讀寫(xiě)操作 。 輸入:數(shù)據(jù)流從文件流入內(nèi)存。 輸出:數(shù)據(jù)流從內(nèi)存流入文件。 從

28、操作系統(tǒng)的觀點(diǎn),所有與主機(jī)相連的設(shè)備都視為文件,如鍵盤(pán)、顯示器、打印機(jī)等。(4)與文件相關(guān)的流 C+有3種文件流:輸入文件流ifstream、輸出文件流ofstream、輸入/輸出文件流fstream。這些文件流都定義在fstream.h文件中。2. 文件操作的一般步驟(1)在源程序中包含頭文件fstream.h;(2)為要進(jìn)行操作的文件建立一個(gè)流,即定義流對(duì)象; 如:ifstream in;/定義輸入流對(duì)象inofstream out;/定義輸出流對(duì)象outfstream io;/定義輸入輸出流對(duì)象io(3)使用open()函數(shù)建立(打開(kāi))文件。不存在則建立、存在則打開(kāi);(4)進(jìn)行文件的讀寫(xiě)

29、操作;(5)使用close()函數(shù)關(guān)閉文件。3. 文件的打開(kāi)與關(guān)閉(1)打開(kāi)文件open()函數(shù)的原型void open(char *filename,int mod,int access);*filename:指向文件名字符串的指針mod:文件的打開(kāi)方式文件打開(kāi)方式說(shuō) 明ios:in以輸入方式打開(kāi)文件,即讀文件(ifstream類(lèi)對(duì)象默認(rèn)方式)ios:out以輸出方式打開(kāi)文件,即寫(xiě)文件(ofstream類(lèi)對(duì)象默認(rèn)方式)ios:app以添加方式打開(kāi)文件,新增加的內(nèi)容添加在文件尾ios:ate以添加方式打開(kāi)文件,新增加的內(nèi)容添加在文件尾,但下次添加時(shí)則添加在當(dāng)前位置ios:trunc如文件存在就

30、打開(kāi)并清除其內(nèi)容,如不存在就建立新文件ios:binary以二進(jìn)制方式打開(kāi)文件(默認(rèn)為文本文件)ios:nocreate打開(kāi)已有文件,若文件不存在,則打開(kāi)失敗ios:noreplace若打開(kāi)的文件已經(jīng)存在,則打開(kāi)失敗access:文件的訪問(wèn)方式,缺省值為“0” 0:一般文件;1:只讀文件;2:隱藏文件;3:系統(tǒng)文件打開(kāi)格式 流對(duì)象.open(filename,mod,access);討論 第一、ofstream out;/定義流類(lèi)對(duì)象out out.open(“test”, ios:out, 0); /打開(kāi) 或:out. open(“test”);/缺省為輸出例9.14 一個(gè)簡(jiǎn)單的輸入輸出例子

31、/Save as main.cpp#include void main()ofstream ostrm;/定義輸出流對(duì)象ostrm.open(“f1.dat”);/創(chuàng)建文件ostrm120endl;/寫(xiě)文件ostrm310.85nd;/讀文件coutn,dendl;istrm.close();/關(guān)閉文件運(yùn)行結(jié)果:例9.15 把一個(gè)整數(shù)、一個(gè)浮點(diǎn)數(shù)和一個(gè)字符串寫(xiě)入磁盤(pán)文件test中。/Save as main.cpp#include /包含輸入輸出文件流的頭文件void main( ) ofstream myout(“test”); /定義流對(duì)象myout并創(chuàng)建文件test if(!myout)

32、 cout cannot open file: test; myout10 123.45 objectn; /向文件寫(xiě)數(shù)據(jù) myout.close( ); /關(guān)閉文件例9.16 將例9.15產(chǎn)生的文件test中的數(shù)據(jù)讀出并顯示。/Save as main.cpp#include void main() int a;float b;char *str=new char80; ifstream myin(“test”); if(!myin) coutabstr; /從文件讀數(shù)據(jù)到變量a、b、str couta“ ”b“ ”str;/顯示數(shù)據(jù) coutendl; myin.close(); /關(guān)閉文

33、件例9.17 將文件 file_from 的內(nèi)容拷貝到文件 file_to 中 #include void main() char ch; ifstream myin(file_from); if(!myin) coutcannot open file: file_from; ofstream myout(file_to); if(!myout) coutcannot open file: file_to; while(myin.get(ch)/逐個(gè)讀出字符到ch,直到結(jié)束標(biāo)志0myout.put(ch); /將ch中的字符寫(xiě)入到文件,最后自動(dòng)寫(xiě)入結(jié)束標(biāo)志 myin.close(); myou

34、t.close(); 4.二進(jìn)制文件 前面介紹的文件都是文本文件,文本文件是字符流;二進(jìn)制文件是字節(jié)流。(1)二進(jìn)制文件與文本文件的區(qū)別 在讀文件時(shí),它們判定文件結(jié)束標(biāo)志的方法存在區(qū)別。在讀文本文件的過(guò)程中,當(dāng)get 之類(lèi)的成員函數(shù)遇到文件結(jié)束符時(shí),它返回常量EOF作為文件結(jié)束標(biāo)志。二進(jìn)制文件不能用EOF作為文件結(jié)束的判定值,因?yàn)镋OF的值是-1,而-1在二進(jìn)制文件中是一個(gè)有效的數(shù)據(jù)。 因此,C+提供成員函數(shù)eof來(lái)解決這個(gè)問(wèn)題,用法如下:int xx:eof() 其中,xx代表輸入流對(duì)象,到達(dá)文件末尾時(shí),返回一個(gè)非0值,否則返回0。(2)二進(jìn)制文件操作方法 用get和put按字節(jié)方式讀寫(xiě)文件

35、數(shù)據(jù)。 read和write 按數(shù)據(jù)塊的方式讀寫(xiě)文件數(shù)據(jù)。例:用二進(jìn)制方式建立一個(gè)磁盤(pán)文件,將ASCII 編碼為090之間的字符寫(xiě)入到文件d:dka.dat中,然后用二進(jìn)制文件方式讀出并在屏幕上顯示a.dat的內(nèi)容#include #include void main() char ch; ofstream out(d:dka.dat,ios:out|ios:binary); /dk已存在 for(int i=0;i90;i+) if(!(i%30)out.put(n);out.put(char(i);out.put( );out.close(); ifstream in(d:dka.dat,

36、ios:in|ios:binary); while(in.get(ch)coutch; coutendl;in.close(); 5. 隨機(jī)存取文件(1)順序訪問(wèn)與隨機(jī)訪問(wèn) 順序訪問(wèn):是指按照從前到后的順序依次對(duì)文件進(jìn)行讀寫(xiě)操作,有些存儲(chǔ)設(shè)備只支持順序訪問(wèn),如磁帶。 隨機(jī)訪問(wèn):也稱(chēng)為直接訪問(wèn),可以按任意次序?qū)ξ募M(jìn)行讀寫(xiě)操作。(2)順序文件與隨機(jī)文件 順序文件:用于順序訪問(wèn)的文件。 隨機(jī)文件:用于隨機(jī)訪問(wèn)的文件。(3)隨機(jī)文件的問(wèn)題多次讀同一文件,每次從頭讀起,如何完成?如何指向文件的結(jié)尾?如何知道文件已結(jié)束? 解決方式:對(duì)于隨機(jī)文件,C+流類(lèi)提供了一個(gè)操作它的文件讀寫(xiě)指針,該指針可在文件中移

37、動(dòng),將它指向要讀寫(xiě)的字節(jié)位置,然后從該位置讀取或?qū)懭胫付ㄗ止?jié)數(shù)的數(shù)據(jù)塊,這樣就實(shí)現(xiàn)了文件數(shù)據(jù)的隨機(jī)訪問(wèn)。(4)移動(dòng)文件指針 seekg(pos) 和seekp(pos) pos為long型。這兩個(gè)函數(shù)都是從文件頭開(kāi)始,把文件指針向后移動(dòng)pos個(gè)字符(字節(jié)),seekg用于輸入文件;seekp用于輸出文件。seekg(pos,origin)和seekp(pos,origin) pos為long型。從文件中指定位置開(kāi)始移動(dòng)文件指針,參數(shù)origin表示文件指針位置,pos表示相對(duì)于這個(gè)位置的位移量。origin有3種取值: ios:beg:表示從文件頭開(kāi)始,pos為正。 ios:cur:表示從當(dāng)前

38、位置開(kāi)始,pos可正(后移)可負(fù)(前移)。 ios:end:表示從文件尾部開(kāi)始,pos為負(fù)。tellg()和tellp() 這兩個(gè)函數(shù)返回文件指針的當(dāng)前位置,tellg()用于輸入文件,tellp()用于輸出文件。(5)read() istream類(lèi)成員函數(shù)read的原型為: istream &read (char *pDst,int size); 第一個(gè)參數(shù)pDst定位讀取數(shù)據(jù)的存放位置,可以匹配任意類(lèi)型的起始地址,但調(diào)用時(shí)應(yīng)強(qiáng)制轉(zhuǎn)換為char *。 第二個(gè)參數(shù)size指出等待讀取的字節(jié)數(shù),可以設(shè)置為: size = n*sizeof (type) 如果type取值為類(lèi)類(lèi)型名如CTy

39、pe, 則當(dāng)size = n*sizeof(CType),表示讀取n個(gè)對(duì)象。n等于1時(shí)讀取一個(gè)對(duì)象。type也可以是double,此時(shí)表示讀取的數(shù)據(jù)是double型的變量。(6)write() ostream類(lèi)成員函數(shù)write的原型為: ostream &write(const char *pSrc,int size); 第一個(gè)形參pSrc定位所寫(xiě)數(shù)據(jù)源的位置,可匹配任意類(lèi)型的起始地址,但調(diào)用時(shí)應(yīng)強(qiáng)制轉(zhuǎn)換為char * 。 第二個(gè)參數(shù)size指出等待存寫(xiě)的字節(jié)數(shù),可以設(shè)置為: size = n*sizeof (type) 如果type取值為double,則當(dāng)size = n*size

40、of (double)表示讀取n個(gè)double變量。n等于1 時(shí)存寫(xiě)一個(gè)double變量等等。 一般地 read 總是讀取原先由write存寫(xiě)的數(shù)據(jù),即read()與write()配對(duì)使用。例例9.18 文件的隨機(jī)讀寫(xiě)操作文件的隨機(jī)讀寫(xiě)操作/Save as main.cpp#include #include void main()fstream file(“f6.dat”,ios:in|ios:out|ios:binary)if(!file)coutf6.dat cant open!n;for(int i=0;i15;i+)file.write(char *)&i,sizeof(int); /寫(xiě)入寫(xiě)入014共共15個(gè)數(shù)個(gè)數(shù)streampos pos=file.tellp();/寫(xiě)入寫(xiě)入014后的當(dāng)前指針位置后的當(dāng)前指針位置60,每個(gè)數(shù)據(jù),每個(gè)數(shù)據(jù)4字節(jié)字節(jié)cout“Current byte number: ”posendlfor(i=15;i45;i+)file.write(char *)&i,sizeof(int);/寫(xiě)入寫(xiě)入1544共共3

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論