版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第12章 流類體系與文件操作目的與要求12.1 流類體系12.2 文件操作本章小結(jié)目的與要求 通過本章學(xué)習(xí),應(yīng)理解I/O流、流類與流類體系的概念,掌握流的輸入/輸出控制格式。了解C+有關(guān)文件的概念及文件的使用方法,理解文件流類體系結(jié)構(gòu),掌握實(shí)現(xiàn)文件操作成員函數(shù)的使用方法,學(xué)會文本文件與二進(jìn)制文件的打開、讀/寫、關(guān)閉等操作的編程方法。 12.1 流類體系 12.1.1 流Stream)1流類:用于完成輸入/輸出操作的類稱為流類,所有流類的集合稱為流類庫。2流:用流類定義的對象稱為流,如cin、cout等。3流的分類(1文本流:由一串ASCII字符組成 (2二進(jìn)制流:是由一串二進(jìn)制數(shù)組成4緩沖流與
2、非緩沖流 系統(tǒng)在主存中開辟的用于臨時(shí)存放輸入/輸出流信息的內(nèi)存區(qū)稱緩沖區(qū) 12.1.2 基本流類體系 基類iosstreambuf輸入類istream輸出類ostream輸入/輸出類iostream基本流類體系類ostream_withassign類istream_withassign當(dāng)程序中使用輸入/輸出流時(shí),要包含頭文件iostream.h。 12.1.3 標(biāo)準(zhǔn)輸入輸出流 1標(biāo)準(zhǔn)輸入流cin緩沖流) 標(biāo)準(zhǔn)輸入流cin通過重載“”運(yùn)算符執(zhí)行數(shù)據(jù)的輸入操作,執(zhí)行輸入操作可看作為從流中提取一個(gè)字符序列。 cin 為緩沖流。 2標(biāo)準(zhǔn)輸出流cout、clog緩沖流)、cerr非緩沖流) 標(biāo)準(zhǔn)輸出流c
3、out、cerr、clog是通過重載“”運(yùn)算符執(zhí)行數(shù)據(jù)的輸出操作,執(zhí)行輸出操作看作為向流中插入一個(gè)字符序列 。 cout、clog為緩沖流、cerr為非緩沖流?!纠?2.1】 使用流cerr和clog實(shí)現(xiàn)數(shù)據(jù)的輸出。 例程例程3標(biāo)準(zhǔn)輸出流默認(rèn)設(shè)置(1整數(shù):十進(jìn)制、域?qū)挒?、右對齊、以空格填充。(2實(shí)數(shù):十進(jìn)制、域?qū)挒?、右對齊、以空格填充、精度6位小數(shù)、浮點(diǎn)輸出。(3字符串:域?qū)挒?、右對齊、以空格填充。按實(shí)際字符串長度輸出。 12.1.4 流的格式控制 C+提供了格式控制成員函數(shù)與預(yù)定義格式控制函數(shù)供用戶控制數(shù)據(jù)的輸入/輸出格式。 (1格式控制成員函數(shù) ios類定義的格式控制成員函數(shù)的調(diào)用格
4、式為: (實(shí)參); (2預(yù)定義格式控制函數(shù) C+直接提供的預(yù)定義格式控制函數(shù)的調(diào)用格式為: (實(shí)參) ; 1流的輸出控制格式 使用流對象cout與插入運(yùn)算符“”運(yùn)算符來實(shí)現(xiàn)的。 輸入數(shù)據(jù)時(shí),要注意數(shù)據(jù)間的分隔符、數(shù)據(jù)類型的一致和回車的使用。【例12.7】使用預(yù)定義格式控制符dec、oct、hex及輸入流對象cin 輸入十進(jìn)制數(shù)、八進(jìn)制數(shù)、十六進(jìn)制數(shù)。例程例程12.1.5數(shù)據(jù)輸入輸出成員函數(shù) 1數(shù)據(jù)輸入成員函數(shù) (1字符輸入成員函數(shù) :get() (2字符串輸入成員函數(shù) :getline() 【例12.8】讀取字符和字符串。2數(shù)據(jù)輸出成員函數(shù) 字符輸出成員函數(shù) :put()例程例程12.2 文件
5、操作 12.2.1 C+文件概述1文件(1文件:由文件名標(biāo)識的一組有序數(shù)據(jù)的集合稱為文件。文件常放在磁盤上。(2文件名:由字母數(shù)字序列組成。如:myfile.txt,youfile.txt。2文件的數(shù)據(jù)格式(1二進(jìn)制文件:由二進(jìn)制數(shù)據(jù)組成(2文本文件:由字符的ASCII碼組成,最小存取單位為字符。3文件的使用方法 (1打開文件; (2對文件進(jìn)行讀/寫操作; (3關(guān)閉文件。 12.2.2 C+的文件流類體系 基類iosstreambuf輸入類istream輸出類ostream輸入/輸出類iostream C+ 預(yù)定義的文件流類體系filebuf輸出文件類ofstream輸入文件類ifstream
6、輸入/輸出文件類fstream當(dāng)程序中使用文件時(shí),要包含頭文件fstream.h。 12.2.3 文件的使用方法 1定義文件流對象(1讀文件流對象定義格式: ifstream ;例如:ifstream infile; /infile為讀文件流對象(2寫文件流對象定義格式: ofstream ;例如:ofstream outfile; /outfile為寫文件流對象(3讀/寫文件流對象定義格式: fstream ;例如:fstream iofile; /iofile為讀/寫文件流對象 2打開文件 (1使用成員函數(shù)open()打開文件打開文件的格式為: 文件流對象.open(“文件名”,ios:m
7、oda);文件打開方式: moda=in、out、app、nocreate、noreplace、binary。例如:infile.open(myfile.txt,ios:in); 或 infile.open(myfile.txt); outfile.open(youfile.txt,ios:out); 或 outfile.open(youfile.txt);(2定義文件流對象時(shí)通過構(gòu)造函數(shù)打開文件在定義文件流對象時(shí)直接調(diào)用構(gòu)造函數(shù)打開文件。例如: ifstream infile (myfile.txt,ios:in); 或 ifstream infile (myfile.txt); ofstr
8、eam outfile (“youfile.txt”,ios:out); 或 ofstream outfile (youfile.txt);(3判斷文件打開成功 無論是調(diào)用成員函數(shù)open()來打開文件,還是用構(gòu)造函數(shù)來打開文件,在打開后,都要判斷打開是否成功。若文件打開成功,則文件流對象值為非零值;若打開不成功,則其值為0。 例如:按只讀方式打開文件myfile.txt的一般過程為: ifstream infile(myfile.txt); if (!infile) cout不能打開的文件:myfile.txtendl; exit(1); 判斷文件打開成功或char filename256;
9、coutfilename;ifstream infile;infile.open(filename);if (!infile) cout不能打開的文件:filename”或插入運(yùn)算符“ch; /從輸入流infile所關(guān)聯(lián)的文件myfile.txt中 /提取一個(gè)字符賦于變量ch outfile”和插入運(yùn)算符“”將源程序文件拷貝到目的文件中。例程例程例程例程文本文件的使用 【例12.11】用輸入輸出文件類fstream定義文件流對象,用文件流對象的成員函數(shù)打開文件。使用成員函數(shù)getline與插入運(yùn)算符“”、插入運(yùn)算符“”與插入運(yùn)算符“ch) outfilech ; 用成員函數(shù)get()、getl
10、ine()與put() 對文件讀寫。例如: char ch,buff500; while( infile.get(ch) outfile.put(ch); while(infile.getline(buff,500) ) outfilebuff;(4關(guān)閉文件 用成員函數(shù)close關(guān)閉文件,例如: infile.close(); outfile.close(); 關(guān)閉文件時(shí),系統(tǒng)將與該文件相關(guān)聯(lián)的內(nèi)存緩沖區(qū)中的數(shù)據(jù)寫到文件中,收回與該文件相關(guān)的主存空間,將文件名與文件對象之間建立的關(guān)聯(lián)斷開。5二進(jìn)制文件的使用 二進(jìn)制文件的使用與文本文件的使用類似,首先要定義文件流對象,然后用open函數(shù)打開文件
11、,打開方式必須使用ios:binary。讀/寫文件時(shí)要使用讀函數(shù)read()與寫函數(shù)write(),并可用定位函數(shù)seekg與seekp移動文件指針,隨機(jī)讀/寫文件中任一字節(jié)單元的內(nèi)容。文件使用完畢后,要用close函數(shù)關(guān)閉文件。例12.1# include void main(void) cerra; clog”a*a=”a*aendl;返回返回例12.2# include void main() float a=11,22.2,33.33,44.444,55.5555; for (int i=0;i5;i+) cout.width(10); /設(shè)置輸出域?qū)挒?0 coutain; 返回返回
12、例12.3# include # include void main(void) char *name=Zhou,Zhao,Liu,Chen,Li; double score=11,22.2,33.33,44.444,55.5555; for (int i=0;i5;i+) coutsetw(6)nameisetw(10)scorein; 返回返回例12.4# include # include void main(void) char *name=Zhou,Zhao,Liu,Chen,Li; double score=11,22.2,33.33,44.444,55.5555; for (in
13、t i=0;i5;i+) coutsetiosflags(ios:left)setw(6)namei/設(shè)置輸出姓名左對齊、域?qū)挒? resetiosflags(ios:left) /取消輸出左對齊 setiosflags(ios:right | ios:scientific) /設(shè)置右對齊、科學(xué)記數(shù)法 setw(10)scorein; /設(shè)置輸出域?qū)挒?0 返回返回例12.5# include # include void main(void) char *name=Zhou,Zhao,Liu,Chen,Li; double score=11,22.2,33.33,44.444,55.5555
14、; for (int i=0;i5;i+) coutsetiosflags(ios:left)setw(6)namei resetiosflags(ios:left) setiosflags(ios:fixed) /先設(shè)置定點(diǎn)方式 setprecision(1)scorein; /再設(shè)置小數(shù)點(diǎn)后一位有效數(shù)字 返回返回例12.6#include #include main() int x=64; coutsetiosflags(ios:oct)xtresetiosflags(ios:oct) setiosflags(ios:hex)xtresetiosflags(ios:hex)setiosfl
15、ags(ios:dec)xendl; coutoctxthexxtdecxendl;返回返回例12.7# include void main(void) int a,b,c; coutdeca; coutoctb; couthexc; couta=decaendl; coutb=decbendl; coutc=deccendl;返回返回例12.81)#include void main(void) char c1,c2,c3; char str180,str2100; cout輸入三個(gè)字符:; c1=cin.get(); cin.get(c2); cin.get(c3); cin.get();
16、 /A cout輸入第一行字符串:; cin.get(str1,80); cin.get(); /B例12.82) cout輸入第二行字符串:; cin.getline(str2,100); coutc1=c1endl; coutc2=c2endl; coutc3=c3endl; coutstr1=str1endl; coutstr2=str2endl;返回返回例12.91)# include # include # include void main(void) char fname1256,fname2256; coutfname1; coutfname2; ifstream infile
17、; infile.open(fname1); ofstream outfile; outfile.open(fname2);例12.92) if (!infile) cout不能打開輸入文件:fname1endl; exit(1); if (!outfile) cout不能打開目的文件:fname2endl; exit(1); infile.unsetf(ios:skipws); /設(shè)置為不要跳過文件中的空格。 char ch; while (infile.get(ch) /從源文件中提取一個(gè)字符到變量ch中; outfile.put(ch); /將ch中的字符寫入目的文件中。 infile.
18、close(); /關(guān)閉源文件 outfile.close(); /關(guān)閉目的文件返回返回例12.101)# include # include # include void main(void) char fname1256,fname2256; coutfname1; coutfname2; ifstream infile(fname1); /用構(gòu)造函數(shù)打開源文件 ofstream outfile(fname2); /用構(gòu)造函數(shù)打開目標(biāo)文件 例12.102)if (!infile) cout”不能打開輸入文件:”fname1endl; exit(1); if (!outfile) cout”
19、不能打開目的文件:”fname2ch) /從源文件中提取一個(gè)字符到變量ch中; outfilech; / 將ch中的字符寫入目的文件中。 infile.close(); /關(guān)閉源文件 outfile.close(); /關(guān)閉目的文件返回返回例12.111)# include # include # include void main(void) char fname1256,fname2256; char buff300; coutfname1; coutfname2; fstream infile,outfile; infile.open(fname1,ios:in | ios:nocrea
20、te); outfile.open(fname2,ios:out | ios:noreplace);例12.112) if (!infile) cout源文件不存在,不能打開源文件!endl; exit(1); if (!outfile) cout目標(biāo)文件已存在,不能新建目標(biāo)文件!endl; exit(2); while (infile.getline(buff,300) /從源文件中讀一行字符到緩沖區(qū); outfilebuffn; / 將緩沖區(qū)中一行字符寫入目的文件中。 infile.close(); /關(guān)閉源文件 outfile.close(); /關(guān)閉目的文件 返回返回例12.121)#
21、 include # include # include void main(void) float a33; int i,j; char fname256; coutfname; ofstream outfile; outfile.open(fname);例12.122) if (!outfile) cout不能打開目的文件:fname; exit(1); cout輸入數(shù)組元素:endl; for ( i=0 ;i3;i+) for (j=0;jaij; for(i=0;i3;i+) for(j=0;j3;j+) outfilesetw(10)aij; outfilen; outfile.c
22、lose(); 返回返回例12.131)# include # include # include void main(void) float a33; int i,j; char fname256; coutfname; ifstream infile; infile.open(fname,ios:in | ios:nocreate);例12.132) if (!infile) cout不能打開輸入文件fname; exit(1); for (i=0;i3;i+) for (j=0;jaij;/從文本文件中提取數(shù)據(jù)到二維數(shù)組元素中 float max=a00; for (i=0;i3;i+)
23、 for (j=0;jmax) max=aij; /求出二維數(shù)組元素的最大值例12.133)cout二維數(shù)組的元素值:endl; for (i=0;i3;i+) for (j=0;j3;j+) coutsetw(10)aij;/輸出二維數(shù)組的元素值 coutendl; coutmax=maxendl; /輸出二維數(shù)組的最大值 infile.close(); 返回返回例12.141)# include # include void main(void) float a33; int i,j; char fname256; coutfname; ofstream outfile; outfile.
24、open(fname, ios:out | ios:binary); if (!outfile) cout不能打開目的文件:fname; exit(1); 例12.142) cout輸入數(shù)組元素:; for ( i=0 ;i3;i+) for (j=0;jaij; for(i=0;i3;i+) for(j=0;j3;j+) outfile.write(char *) &aij,sizeof(float); outfile.close(); 返回返回例12.151)# include # include void main(void) float a33; int i,j; char fname
25、256; coutfname; ifstream infile; infile.open(fname,ios:in | ios:binary);例12.152)if (!infile) cout不能打開輸入文件fname; exit(1); for (i=0;i3;i+) for (j=0;j3;j+) infile.read(char * )&aij, sizeof(float); float max=a00; for (i=0;i3;i+) for (j=0;jmax) max=aij;例12.153)for (i=0;i3;i+) for (j=0;j3;j+) couttaij; co
26、utendl; coutmax=maxendl; infile.close(); 返回返回例12.161)# include # include # include # include void main (void)/以只寫方式打開二進(jìn)制文件SIN.BIN fstream outfile(SIN.BIN,ios:out | ios:binary); int i; if (!outfile) cout不能打開輸出文件SIN.BIN n; exit(1); 例12.162) double s91; for (i=0;i=90;i+) si=sin(i*3.1415926/180); outfil
27、e.write(char * )s,sizeof(double) * 91); /一次寫入91個(gè)實(shí)數(shù) /以只讀方式打開二進(jìn)制文件SIN.BIN fstream infile(SIN.BIN,ios:in | ios:binary); if (!infile) cout不能打開輸入文件SIN.BIN n; exit(1); 例12.163)infile.read(char* )s,sizeof(double)*91); /一次讀出91個(gè)實(shí)數(shù) for (i=0;i=90;i+) coutsetw(10)sit; if (i+1)%5=0) coutendl; infile.close(); out
28、file.close();返回返回例12.171)# include # include void main(void) char fname1256,fname2256; char buff4096; /建立4K緩沖區(qū) coutfname1; coutfname2;例12.172) fstream infile,outfile; infile.open(fname1,ios:in | ios:binary); outfile.open(fname2,ios:out| ios:binary); if (!infile) cout不能打開輸入文件:fname1endl; exit(1); if
29、(!outfile) cout不能打開目的文件:fname2endl; exit(2); 例12.173) int n; while (!infile.eof() /文件不結(jié)束就繼續(xù)循環(huán); infile.read(buff,4096); /一次讀4096個(gè)字節(jié) n=infile.gcount(); /取實(shí)際讀的字節(jié)數(shù) outfile.write(buff,n); /按實(shí)際讀的字節(jié)數(shù)寫入文件 infile.close(); /關(guān)閉源文件 outfile.close(); /關(guān)閉目的文件 返回返回例12.181)# include # include # include void main (vo
30、id) char c1,c2,c=ABCDEFGH; /用構(gòu)造函數(shù)打開二進(jìn)制文件letter.dat ofstream outfile(letter.dat,ios:out | ios:binary); if (!outfile) cout不能打開目的文件:; exit(1); 例12.182) outfile.write(c,sizeof(char)*(strlen(c)+1); /將字符串c寫入letter.dat文件緩沖區(qū) outfile.flush(); /將緩沖區(qū)中字符串寫入磁盤文件中。 /用構(gòu)造函數(shù)打開二進(jìn)制文件letter.dat ifstream infile(letter.d
31、at,ios:in | ios:binary); if (!infile) cout不能打開源文件; exit(1); infile.seekg(3); /將指針移到第3個(gè)字節(jié)處 infile.read(char*)&c1,sizeof(char); /將文件第3個(gè)字節(jié)處字母讀入c1 coutc1n; /顯示c1的內(nèi)容 例12.183) coutc1; outfile.seekp(5); /將輸出文件指針定位在第5個(gè)字節(jié)處 outfile.write(char *)&c1,sizeof(char); /將新字母寫入第5個(gè)字節(jié)單元 outfile.flush(); /刷新緩沖區(qū) infile.s
32、eekg(5); /將輸入文件指針定位在第5個(gè)字節(jié)處 infile.read(char * )&c2,sizeof (char); /將輸入文件第5個(gè)字節(jié)內(nèi)容讀入c2 coutc2n; /顯示c2中內(nèi)容 outfile.close; infile.close();返回返回例12.191)# include # include # include void main (void) char c1,c2,c=ABCDEFGHIJ; /用構(gòu)造函數(shù)打開二進(jìn)制文件letter.dat ofstream outfile(letter.dat,ios:out | ios:binary); if (!outfile) cout不能打開目的文件:; exit(1); 例12.192) coutoutfile.tellp()endl; /顯示輸出文件流的當(dāng)前文件指針值 /將字符串c寫入letter.dat文件緩沖區(qū) outfile.write(c,si
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 預(yù)防觸電大班安全教育
- 快速做課件教學(xué)課件
- 起重機(jī)械操作培訓(xùn)
- 頸椎病的運(yùn)動處方
- 3.3.2鹽類水解平衡常數(shù)與影響鹽類水解的因素 課件高二上學(xué)期化學(xué)人教版(2019)選擇性必修1
- 防意外安全演練
- 細(xì)菌性肝膿腫個(gè)案護(hù)理
- 濕疹性皮炎的護(hù)理查房
- 保育老師真辛苦教案反思
- 化簡比說課稿
- 心理健康專題課件25心理健康
- 【課件】跨學(xué)科實(shí)踐:制作隔音房間模型人教版物理八年級上冊
- 2024-2025學(xué)年高二英語選擇性必修第二冊(譯林版)UNIT 4 Grammar and usage教學(xué)課件
- 二十屆三中全會精神學(xué)習(xí)試題及答案(100題)
- 《網(wǎng)絡(luò)存儲技術(shù)及應(yīng)用(第2版)》高職全套教學(xué)課件
- 義務(wù)教育語文課程標(biāo)準(zhǔn)(2022年版)考試題庫及答案1
- 2024Growatt 2500-6000MTL-S古瑞瓦特光伏逆變器用戶手冊
- 2024-2030年中國四足機(jī)器人行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報(bào)告
- 消化系統(tǒng)常見疾病課件(完美版)
- 成人重癥患者人工氣道濕化護(hù)理專家共識 解讀
- 關(guān)于進(jìn)一步加強(qiáng)路基路面施工質(zhì)量的通知
評論
0/150
提交評論