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

下載本文檔

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

文檔簡介

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è)備中,如同河流一樣,故此叫流。備中,如同河流一樣,故此叫流。流對象定義流對象定義說說 明明ostream cout; cout與標(biāo)準(zhǔn)輸出設(shè)備相關(guān)聯(lián)(顯示器)ostream cerr; cerr與標(biāo)準(zhǔn)錯誤輸出設(shè)備相關(guān)聯(lián)(非緩沖方式)ostream clog; clog與標(biāo)準(zhǔn)錯誤輸出設(shè)備相關(guān)聯(lián)(緩沖方式)istream cin;與標(biāo)準(zhǔn)輸入設(shè)備相關(guān)聯(lián)(鍵盤)9.2 使用cin與cout輸入

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

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

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

5、ouble z;char ch;下面的語句說明數(shù)據(jù)輸入的含義。語句 輸入內(nèi)存變量的值cinch; Ach=Acinch; ABch=A,而B被保留在輸入流中等待被讀取cina; 32a=32cina; 32.23a=32,.23留在輸入流中等待被讀取cinz; 76.21z=76.21cinz; 65z=65.0語句 輸入內(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,等待輸入下一個數(shù)據(jù)存入zcinaz; 2 3.2 24a=2,z=3.2,24被保留在輸入流中

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

7、數(shù)據(jù)時,應(yīng)注意在數(shù)據(jù)之間插入間隔符。因為cout輸出不帶任何格式。確定數(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();/還有重載其它類型數(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ù)使用說明(1)get()函數(shù)int get() 不帶參數(shù)的get()從輸入流中提取一個字符(包括空白字符),并返回該字符作為函數(shù)的調(diào)用值。當(dāng)遇到文件結(jié)束時,返回文件結(jié)束符EOF。istream& get(char *c,int n,char=n) 從輸入流中提取n-1個字符(包括空白字符)存入字

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

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

11、符讀入數(shù)組中,但會清除結(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個字符coutaendl;/顯示12345678cin.ignore();/清除上次輸入的ncoutuse getline(s1,10) input c

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

13、t);.;4.ostream成員函數(shù)使用說明(1)ostream& put(char c) 插入一個無格式的字節(jié)到輸出流中。其中c是要輸出的字符,函數(shù)返回輸出流對象的引用。(2)ostream& write(const char *c,int n) 插入一個無格式的字符序列到輸出流中。其中c是要輸出的字符數(shù)組,n是要輸出的字符個數(shù),函數(shù)返回輸出流對象的引用。(3)ostream& flush() 緩沖輸出:數(shù)據(jù)寫入緩沖區(qū),緩沖區(qū)滿時才將數(shù)據(jù)送輸出設(shè)備。緩沖輸出的輸出數(shù)據(jù)會有所延遲。 非緩沖輸出:數(shù)據(jù)寫入緩沖區(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類中的有關(guān)格式控制的成員函數(shù) 格式控制狀態(tài)標(biāo)志 輸入輸出的格式由各種狀態(tài)標(biāo)志來確定,這些標(biāo)志在ios類中定義為枚舉量,用一個十六位二進(jìn)制數(shù)表示。ios:skipws跳過輸入流中的空白字符ios:left輸出數(shù)據(jù)按左對齊,如12 ios:right輸出數(shù)據(jù)按右對齊,如 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用大寫字母輸出十六進(jìn)制數(shù)(即ABCDEF,默認(rèn)是小寫)ios:showpos在正數(shù)前加“+”ios:scientific用科學(xué)計數(shù)法輸出浮點(diǎn)數(shù),如2.122E2ios:fixed用定點(diǎn)數(shù)形式輸出浮點(diǎn)數(shù),如212.2ios:unitbuf完成后立即刷新緩沖區(qū)設(shè)置標(biāo)志 用ios類的成員函數(shù)setf()設(shè)置,格式為: cin.setf(ios:標(biāo)志位 |);/“|”表

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

18、寬n位并返回原來域?qū)?cout.width( );/返回當(dāng)前域?qū)?填充字符 用ios類的成員函數(shù)fill()設(shè)置,與width()配合,格式為: cout.fill(字符);/設(shè)置填充字符并返回原來填充字符 cout.fill( );/返回當(dāng)前填充字符設(shè)置精度 用ios類的成員函數(shù)precision()設(shè)置,格式為: cout.precision(n);/設(shè)置顯示精度為n位并返回原來精度 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個字符 cout.fill(*);/填充字符“*” cout.setf(ios:right);/輸出右對齊(默認(rèn)) coutc“-L1”endl;/輸出c,左邊填充“*”cout.width(30); /每個輸出語句需要設(shè)置寬度 cout.setf(ios:left);/左對齊 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)與符號位 cout.width(30);/每個輸出語句需要設(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ù)控制格式 改變格式比較簡單的方法是使用特殊的、類似于函數(shù)的運(yùn)算符,

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

22、oct/hex十進(jìn)制/八進(jìn)制/十六進(jìn)制left/right設(shè)置數(shù)據(jù)輸出對齊方式為:左/右 對齊fixed以小數(shù)形式顯示浮點(diǎn)數(shù)scientific用科學(xué)計數(shù)法顯示浮點(diǎn)數(shù)flush刷新輸出緩沖區(qū)ends插入空白字符,然后刷新ostream緩沖區(qū)endl插入換行字符,然后刷新ostream緩沖區(qū)ws跳過開始的空白操縱符函數(shù)setfill(ch)設(shè)置以ch中的字符為填充字符setprecision(n)設(shè)置精度為n位有效數(shù)字setw(w)設(shè)置數(shù)據(jù)的輸出寬度為w個字符setbase(b)基數(shù)設(shè)置為b(b=8,10,16)進(jìn)制例:實數(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、式為右對齊缺省格式為右對齊 coutDefault is on right:endlsetw(10)xendlendl; /修改為左對齊修改為左對齊 cout.setf(ios:left); coutsetw(10)xendlendl; /取消左對齊又變?yōu)橛覍R取消左對齊又變?yōu)橛覍R cout.unsetf(ios:left); coutsetw(10)xendl; 運(yùn)行結(jié)果:Default is on right: 1234512345 12345例:格式輸出中空白的填充 #include #include void main() int x=12345; /缺省為右對齊缺省為右對齊 cou

25、tDefault is on right:endlsetw(10)xendlendl; /右對齊,左邊填充右對齊,左邊填充“*” cout.fill(*); coutsetw(10)xendlendl; /左對齊,右邊填充左對齊,右邊填充“%” cout.setf(ios:left); coutsetw(10)setfill(%)xendl; 運(yùn)行結(jié)果:Default is on right: 12345*1234512345%例:科學(xué)計算等格式輸出 #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)文件的概念 文件是存儲在存儲介質(zhì)上(如磁盤、磁帶、光盤)的數(shù)據(jù)集合。(2)文件的類型文本文件 文本文件在磁盤上存放相關(guān)字符的ASCII碼,所以又稱為ASCII文件。二進(jìn)制文件 二進(jìn)制文件在磁盤上存儲相關(guān)數(shù)據(jù)的二進(jìn)制代碼,它是把內(nèi)存中的數(shù)據(jù),按其在內(nèi)存中的存儲形式原樣寫到磁盤上而形成的文件。(3)流與文件 C+將文件看成是一個個字符在磁盤上的有序集合,用流來實現(xiàn)文件的讀寫操作 。 輸入:數(shù)據(jù)流從文件流入內(nèi)存。 輸出:數(shù)據(jù)流從內(nèi)存流入文件。 從

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

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

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

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

32、 cout cannot open file: test; myout10 123.45 objectn; /向文件寫數(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)/逐個讀出字符到ch,直到結(jié)束標(biāo)志0myout.put(ch); /將ch中的字符寫入到文件,最后自動寫入結(jié)束標(biāo)志 myin.close(); myou

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

35、數(shù)據(jù)。 read和write 按數(shù)據(jù)塊的方式讀寫文件數(shù)據(jù)。例:用二進(jìn)制方式建立一個磁盤文件,將ASCII 編碼為090之間的字符寫入到文件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)順序訪問與隨機(jī)訪問 順序訪問:是指按照從前到后的順序依次對文件進(jìn)行讀寫操作,有些存儲設(shè)備只支持順序訪問,如磁帶。 隨機(jī)訪問:也稱為直接訪問,可以按任意次序?qū)ξ募M(jìn)行讀寫操作。(2)順序文件與隨機(jī)文件 順序文件:用于順序訪問的文件。 隨機(jī)文件:用于隨機(jī)訪問的文件。(3)隨機(jī)文件的問題多次讀同一文件,每次從頭讀起,如何完成?如何指向文件的結(jié)尾?如何知道文件已結(jié)束? 解決方式:對于隨機(jī)文件,C+流類提供了一個操作它的文件讀寫指針,該指針可在文件中移

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

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

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

40、of (double)表示讀取n個double變量。n等于1 時存寫一個double變量等等。 一般地 read 總是讀取原先由write存寫的數(shù)據(jù),即read()與write()配對使用。例例9.18 文件的隨機(jī)讀寫操作文件的隨機(jī)讀寫操作/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); /寫入寫入014共共15個數(shù)個數(shù)streampos pos=file.tellp();/寫入寫入014后的當(dāng)前指針位置后的當(dāng)前指針位置60,每個數(shù)據(jù),每個數(shù)據(jù)4字節(jié)字節(jié)cout“Current byte number: ”posendlfor(i=15;i45;i+)file.write(char *)&i,sizeof(int);/寫入寫入1544共共3

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論