




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Company nameC+培培訓(xùn)訓(xùn)文件流處理File handlerC+ 培培訓(xùn)訓(xùn)2課程內(nèi)容lC+的文件流l文件流處理l文件流的錯(cuò)誤處理l字節(jié)流處理Company nameC+培培訓(xùn)訓(xùn)C+ 培培訓(xùn)訓(xùn)4C+的文件處理機(jī)制lC標(biāo)準(zhǔn)庫(kù)提供了一套基于緩沖的文件打開(kāi)關(guān)閉系統(tǒng)的函數(shù)fopen/fread/fwrite/fgets/fputslC+標(biāo)準(zhǔn)庫(kù)提供一個(gè)基于流的文件輸入輸出機(jī)制提供兩個(gè)基本類(lèi)lifstream 讀取文件lofstream 寫(xiě)入文件需要加入頭文件其操作極其類(lèi)似標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出流C+ 培培訓(xùn)訓(xùn)5文件分類(lèi)文件分類(lèi)l按文件的邏輯結(jié)構(gòu):記錄文件:由具有一定結(jié)構(gòu)的記錄組成(定長(zhǎng)和不定長(zhǎng))流式
2、文件:由一個(gè)個(gè)字符(字節(jié))數(shù)據(jù)順序組成l按數(shù)據(jù)的組織形式:文本文件: ASCII文件,每個(gè)字節(jié)存放一個(gè)字符的ASCII碼lWindows文本文件lUnix文本文件二進(jìn)制文件:數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣存放C+ 培培訓(xùn)訓(xùn)6文本文件的幾種類(lèi)型lUnix文本文件:換行符為n,最后一行只有一個(gè)回車(chē)符的空行l(wèi)Windows文本文件:換行符為”rn”,即有兩個(gè)字符一起作為換行符.用工具可以互相轉(zhuǎn)換lLinux 上的工具創(chuàng)建文本文件都是Unix文本文件.在Windows下直接用寫(xiě)字板打開(kāi),回車(chē)沒(méi)有生效lUltraEdit 可以?xún)煞N格式文本文件都能創(chuàng)建.并能作互相轉(zhuǎn)換C+ 培培訓(xùn)訓(xùn)7文件流的概念l流是一組
3、字符或數(shù)據(jù)流的源或目的l兩種流輸出流(允許寫(xiě)入或存儲(chǔ)字符)輸入流(允許讀取或提取字符)l輸出流與 ostream 類(lèi)相關(guān)聯(lián)l輸入流與istream類(lèi)相關(guān)聯(lián)lios類(lèi)是流類(lèi)層次結(jié)構(gòu)的虛擬基類(lèi)listream和ostream類(lèi)從類(lèi)ios派生而來(lái)l文件輸出流是以文件為形式并鏈接到一個(gè)流C+ 培培訓(xùn)訓(xùn)8文件流對(duì)象文件流對(duì)象要用#include命令。三個(gè)提供文件輸入/輸出能力的流ifstream類(lèi)l從istream類(lèi)派生,用于文件輸入(讀取)ofstream類(lèi)l從ostream類(lèi)派生,用于文件輸出(寫(xiě)入)fstream類(lèi)l從iostream類(lèi)派生,用于輸入和輸出定義用戶所需要的文件流對(duì)象,然后利用ope
4、n成員函數(shù),按照一定的方式打開(kāi)一個(gè)文件。文件被打通過(guò)流對(duì)象訪問(wèn)其中內(nèi)容,結(jié)束后用close關(guān)閉。C+ 培培訓(xùn)訓(xùn)9文件輸出樣例#include void main()char *name = QWERTY POIUYT;int age = 49;float salary = 600.123f;ofstream fout (TEST.TXT);fout 此行寫(xiě)入了此行寫(xiě)入了 TEST.TXT 中中n; fout name age salary; fout.close(); Company nameC+培培訓(xùn)訓(xùn)C+ 培培訓(xùn)訓(xùn)11流文件處理流程l0.首先根據(jù)需求選擇創(chuàng)建一個(gè)流對(duì)象l1.首先用open(
5、)方法打開(kāi)一個(gè)流對(duì)象,或用相應(yīng)的構(gòu)造函數(shù)打開(kāi)l2.在打開(kāi)的流對(duì)象,對(duì)文件內(nèi)容進(jìn)行讀寫(xiě)使用流運(yùn)算符 直接讀寫(xiě)使用流成員函數(shù)l輸出流成員函數(shù)為:put函數(shù)、write函數(shù)l輸入流成員函數(shù)有:get函數(shù)、getline函數(shù)、read函數(shù)l3.調(diào)用close()方法關(guān)閉一個(gè)流l4.銷(xiāo)毀流對(duì)象,如果銷(xiāo)毀未做第3步,則自動(dòng)執(zhí)行一次C+ 培培訓(xùn)訓(xùn)12文件流的打開(kāi)l調(diào)用流方法open打開(kāi)一個(gè)流void open(const char * filename,int mode,int prot=filebuf:openprot); filename:文件名,它可包含路徑說(shuō)明。mode:文件打開(kāi)的模式,下表是mod
6、e的取值C+ 培培訓(xùn)訓(xùn)13文件流的打開(kāi)(續(xù)1)l對(duì)于ifstream流,mode的默認(rèn)值為ios:in;l對(duì)于ofstream流,mode的默認(rèn)值為ios:outlmode的符號(hào)常量可以“|”組合在一起,如ios:in|ios:binary表示以只讀方式打開(kāi)二進(jìn)制文件。 prot:文件的訪問(wèn)方式,取值為:l0 普通文件l1 只讀文件l2 隱含文件 l4 系統(tǒng)文件C+ 培培訓(xùn)訓(xùn)14文件流的打開(kāi)(續(xù)2)l打開(kāi)一個(gè)輸出文件ofstream fout(TEST.TXT);ofstream fout(“TEST.TXT”,ios:out);l打開(kāi)一個(gè)文件并刪除所有內(nèi)容ofstream fout(TEST
7、.TXT,ios:out|ios:trunc);l打開(kāi)一個(gè)文件并追加內(nèi)容ofstream fout(TEST.TXT,ios:app);l打開(kāi)一個(gè)文件進(jìn)行二進(jìn)制輸出ofstream fout(TEST.TXT,ios:binary);C+ 培培訓(xùn)訓(xùn)15文件流的關(guān)閉l在文件操作結(jié)束時(shí),可以用close()成員函數(shù)關(guān)閉該文件。 Outfile.close(); l在該文件流對(duì)象生存期結(jié)束時(shí),對(duì)象也會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)來(lái)關(guān)閉文件。最好在文件操作結(jié)束時(shí),關(guān)閉文件,這樣會(huì)使程序的可讀性更好 C+ 培培訓(xùn)訓(xùn)16用流操作符讀寫(xiě)文件l可以直接對(duì)基本數(shù)據(jù)類(lèi)型進(jìn)行文件讀寫(xiě)l如果對(duì)象重載了操作符,則對(duì)象也可以直接從流
8、中讀取數(shù)據(jù)#include #include void main()ofstream ostrm; ostrm.open(C:f1.dat); /打開(kāi)一個(gè)輸出流 ostrmMendl; /向文件輸入一個(gè)字符 ostrm310.85nd; /輸出一個(gè)字符和double coutn, dendl; istrm.close(); /關(guān)閉輸出流C+ 培培訓(xùn)訓(xùn)17用get ()/put ()來(lái)讀寫(xiě)文件l向一個(gè)輸出流輸入一個(gè)字符 ofstream & put(char c)l從一個(gè)輸入流取出一個(gè)字符 ifstream &get(char &c)C+ 培培訓(xùn)訓(xùn)18一個(gè)簡(jiǎn)單文件拷貝實(shí)例l用get和put實(shí)現(xiàn)文
9、件拷貝#include #include #include void main(int argc,char *argv) fstream outfile,infile;infile.open(argv1,ios:in);if(!infile) coutOpen file error!n; abort(); outfile.open(argv2,ios:out);if(!outfile) coutOpen file error!n; abort();char ch;while(infile.get(ch)outfile.put(ch);cout1 file copied.n; outfile.c
10、lose();infile.close();C+ 培培訓(xùn)訓(xùn)19二進(jìn)制文件的讀寫(xiě)操作l用write()往文件寫(xiě)入n個(gè)字節(jié)l用read()從文件讀取n個(gè)字節(jié)k原型:ostream& ostream:write(char *buf ,int n);k原型: istream& istream:read(char *buf, int n);C+ 培培訓(xùn)訓(xùn)20用read/write讀寫(xiě)的實(shí)例struct person char name20; double height; int age;void main()person people2=“hxy”,10.1,10,“hxb”,10.2,20;ofstr
11、eam outfile;outfile.open(“pp.dat”);for(int i=0 ; i sizeof(people);i+) outfile.write(char *)&peoplei,sizeof(peoplei);outfile.close();C+ 培培訓(xùn)訓(xùn)21文件隨機(jī)訪問(wèn)l文件順序訪問(wèn)get和put指針?lè)謩e指定讀和寫(xiě)操作的當(dāng)前位置每次執(zhí)行輸入或輸出操作時(shí),這兩個(gè)指針都按一定順序自動(dòng)移動(dòng)l文件隨機(jī)訪問(wèn)seekg( )和tellg( )函數(shù)可用來(lái)控制get指針,可以在文件中任意移動(dòng)讀指針,與get相對(duì),所以有g(shù)作后綴seekp( )和tellp( )函數(shù)對(duì)put指針進(jìn)行類(lèi)似的
12、操作,可以在文件中任意移動(dòng)寫(xiě)指針,與put相對(duì),所以有p作后綴C+ 培培訓(xùn)訓(xùn)22讀讀文件指針l函數(shù)原型kistream& istream:seekg(streampos);kistream& istream:seekg(streamoff,ios:seek_dir);kstreampos istream:tellg();/獲取當(dāng)前指針位置l其中streampos為long型;表示移動(dòng)的位移lseek_dir的值表示移動(dòng)的方向cur=1,相對(duì)于當(dāng)前讀指針指定的位置;beg=0,相對(duì)于流的開(kāi)始位置;end=2,相對(duì)于流的結(jié)尾位置;C+ 培培訓(xùn)訓(xùn)23寫(xiě)寫(xiě)文件指針l函數(shù)原型kostream& ostr
13、eam:seekp(streampos);kostream& ostream:seekp(streamoff,ios:seek_dir);kstreampos ostream:tellp();l其中streampos為long型;表示移動(dòng)的位移lseek_dir的值表示移動(dòng)的方向cur=1,相對(duì)于當(dāng)前讀指針指定的位置;beg=0,相對(duì)于流的開(kāi)始位置;end=2,相對(duì)于流的結(jié)尾位置;C+ 培培訓(xùn)訓(xùn)24隨機(jī)讀寫(xiě)實(shí)例#include #include struct student char name20;long number;double totalscore;student stu5=Ma,97
14、001,85.72, Li,97002,92.62,Hu,97003,89.25, Yan,97004,90.84,Lu,97005,80.92;void main()fstream file1;file1.open(student.dat,ios:in|ios:out);student one;for(int i=0;i5;i+) /注意:最前面的記錄是第注意:最前面的記錄是第0條!條! file1.write(char *)&stui,sizeof(student);/寫(xiě)入到文件寫(xiě)入到文件file1.seekg(sizeof(student)*4); /定位到第定位到第5條記錄條記錄fil
15、e1.read(char *)&one,sizeof(student); /把該記錄讀到把該記錄讀到one變量中變量中tone.numbert /顯示該記錄內(nèi)容顯示該記錄內(nèi)容one.totalscoreendl;Company nameC+培培訓(xùn)訓(xùn)C+ 培培訓(xùn)訓(xùn)26流的錯(cuò)誤處理l包括兩大類(lèi)問(wèn)題流狀態(tài)測(cè)試流狀態(tài)測(cè)試 l在iostream中,每一個(gè)流對(duì)象都有一個(gè)表示操作是否成功的狀態(tài)位 l通過(guò)對(duì)狀態(tài)位的判斷可以了解文件處理發(fā)生什么事用用C+標(biāo)準(zhǔn)異常處理流錯(cuò)誤標(biāo)準(zhǔn)異常處理流錯(cuò)誤 lI/O流庫(kù)中允許使用C+的Exception類(lèi)對(duì)流錯(cuò)誤進(jìn)行處理 l當(dāng)設(shè)置后,文件發(fā)生錯(cuò)誤時(shí),會(huì)t
16、hrow一個(gè)文件異常給外層調(diào)用程序C+ 培培訓(xùn)訓(xùn)27流狀態(tài)測(cè)試流狀態(tài)測(cè)試(2)l在iostream中,每一個(gè)流對(duì)象都有一個(gè)表示操作是否成功的狀態(tài)位 l每一步操作后流的狀態(tài)有下面五種 C+ 培培訓(xùn)訓(xùn)28流狀態(tài)測(cè)試流狀態(tài)測(cè)試(3)liostream提供了一些成員函數(shù),如提供了一些成員函數(shù),如good()、fail()等來(lái)查詢(xún)當(dāng)前流的狀態(tài),下表列出了所有用等來(lái)查詢(xún)當(dāng)前流的狀態(tài),下表列出了所有用于狀態(tài)查詢(xún)的成員函數(shù)。于狀態(tài)查詢(xún)的成員函數(shù)。 C+ 培培訓(xùn)訓(xùn)29流狀態(tài)測(cè)試流狀態(tài)測(cè)試(4)l在對(duì)流進(jìn)行操作時(shí),我們應(yīng)該先對(duì)流的狀態(tài)進(jìn)行檢測(cè),以確保流的狀態(tài)正常,通常的做法是:if (!(cout Hello W
17、orld !) handle_error(); l使用插入或者抽取運(yùn)算符的優(yōu)點(diǎn)就是用戶可以把插入或者抽取操作成組進(jìn)行。例如,int n=5;coutn=n;if (!cout) handle_error();l使用流狀態(tài)可以使程序簡(jiǎn)潔明了,但是隨之會(huì)產(chǎn)生一個(gè)問(wèn)題:用戶不可能在每次流操作結(jié)束后檢測(cè)流的狀態(tài)。C+的例外可以解決這個(gè)問(wèn)題,因此標(biāo)準(zhǔn)iostream允許使用例外處理流錯(cuò)誤。C+ 培培訓(xùn)訓(xùn)30流檢測(cè)實(shí)例/如果輸入的是整數(shù),那么將輸出:如果輸入的是整數(shù),那么將輸出:correct。 /否則將輸出錯(cuò)誤狀態(tài)否則將輸出錯(cuò)誤狀態(tài)#include void main() int i; cout輸入整數(shù)
18、:輸入整數(shù):i; if (!cin) couteof:cin.eof()endl; coutfail:cin.fail()endl; coutbad:cin.bad()endl; else coutcorrect.endl; C+ 培培訓(xùn)訓(xùn)31流檢測(cè)實(shí)例(2)/如果打開(kāi)文件出錯(cuò)如果打開(kāi)文件出錯(cuò),則顯示錯(cuò)誤狀態(tài)則顯示錯(cuò)誤狀態(tài)#include void main() ofstream out(out.txt,ios:nocreate); if (!out) couteof:out.eof()endl; coutfail:out.fail()endl; coutbad:out.bad()endl;
19、else coutcorrect.endl; out.clear(); /清除錯(cuò)誤狀態(tài)清除錯(cuò)誤狀態(tài)C+ 培培訓(xùn)訓(xùn)32用C+標(biāo)準(zhǔn)異常處理文件流錯(cuò)誤lI/O流庫(kù)中允許使用例外對(duì)流錯(cuò)誤進(jìn)行處理。在ios類(lèi)中添加了兩個(gè)成員函數(shù): void exceptions(iostate except_mask); liostate來(lái)設(shè)置標(biāo)志位,指示流可以拋出哪些的異常給調(diào)用者 l這些標(biāo)志位可以是eof、bad、fail或者它們的組合 iostate exceptions(); l用來(lái)返回當(dāng)前的標(biāo)志 l這樣使用文件流的開(kāi)發(fā)者無(wú)需每次對(duì)流對(duì)象進(jìn)行檢測(cè),只需在處理代碼塊外加上try .catch結(jié)構(gòu)即可進(jìn)行錯(cuò)誤捕獲.
20、C+ 培培訓(xùn)訓(xùn)33用異常來(lái)處理實(shí)例/如果打開(kāi)文件出錯(cuò)如果打開(kāi)文件出錯(cuò),則顯示錯(cuò)誤狀態(tài)則顯示錯(cuò)誤狀態(tài)#include #include #include using namespace std;void main() cin.exceptions(ios:failbit); try int i; cin i; /輸入一個(gè)非整數(shù)將觸發(fā)異常輸入一個(gè)非整數(shù)將觸發(fā)異常cin.clear(); catch(ios_base:failure& excep) /ios_base:failure 是是exception的派生類(lèi)的派生類(lèi),/專(zhuān)用處理文件錯(cuò)誤專(zhuān)用處理文件錯(cuò)誤cerrexcep.what()endl;
21、 Company nameC+培培訓(xùn)訓(xùn)C+ 培培訓(xùn)訓(xùn)35字節(jié)流概念l字節(jié)流可直接與內(nèi)存而不是與文件或標(biāo)準(zhǔn)輸出一起工作。我們可以用與標(biāo)準(zhǔn)輸出同樣的格式,操作內(nèi)存里的數(shù)據(jù)(字節(jié))。如果我們想把數(shù)據(jù)放入字節(jié)流,可以建立一個(gè)ostrstream對(duì)象;如果想從字節(jié)流中提取數(shù)據(jù),就建立一個(gè)istrstream對(duì)象。 lC+標(biāo)準(zhǔn)庫(kù)提供 ostrstream 類(lèi)用于內(nèi)存中字符串格式化處理其功能類(lèi)似于C標(biāo)準(zhǔn)庫(kù)的sprintflC+標(biāo)準(zhǔn)庫(kù)提供 istrstream 類(lèi)用于內(nèi)存中字符串解析成對(duì)應(yīng)變量其功能類(lèi)似于C標(biāo)準(zhǔn)庫(kù)的sscanfC+ 培培訓(xùn)訓(xùn)36輸入字節(jié)流istrstreamlistrstream類(lèi)支持一個(gè)字符
22、數(shù)組作為源的輸入流。類(lèi)支持一個(gè)字符數(shù)組作為源的輸入流。在構(gòu)造在構(gòu)造istrstream對(duì)象前,必須存在一個(gè)字符數(shù)對(duì)象前,必須存在一個(gè)字符數(shù)組,而且這個(gè)數(shù)組中已經(jīng)填充了我們想要提取的組,而且這個(gè)數(shù)組中已經(jīng)填充了我們想要提取的字符。下面是兩個(gè)構(gòu)造函數(shù)的原型:字符。下面是兩個(gè)構(gòu)造函數(shù)的原型: istrstream:istrstream(char* buf); istrstream:istrstream(char* buf, int size); 第一個(gè)構(gòu)造函數(shù)取一個(gè)指向以ends作為結(jié)尾符的字符數(shù)組的指針,我們可以提取字節(jié)直至遇到ends為止。第二個(gè)構(gòu)造函數(shù)還需要這個(gè)數(shù)組的大小,但不需要數(shù)組包含字符
23、串的結(jié)尾符ends ,我們可以一直提取字節(jié)到bufsize-1,而不管是否遇到ends 。 C+ 培培訓(xùn)訓(xùn)37Istrstream實(shí)例#include /使用使用strstream要包含頭文件要包含頭文件strstrea.h /這個(gè)文件名很奇怪,這是因?yàn)檫@個(gè)文件名很奇怪,這是因?yàn)镈OS文件命名規(guī)則的限制。文件命名規(guī)則的限制。void main() int n; float f; char buf80; istrstream arg(1 3.14159 hello); argnfbuf; coutn=nendl; coutf=fendl; coutbuf=bufendl; C+ 培培訓(xùn)訓(xùn)38輸出流輸出流 ostrstreamlostrstream類(lèi)支持一個(gè)字符數(shù)組作為數(shù)據(jù)傳輸目的地的輸出流,它可以使用我們?yōu)樗暾?qǐng)的存儲(chǔ)空間,這時(shí)字節(jié)在內(nèi)存中被格式化;也可以使用自動(dòng)分配的存儲(chǔ)空間。l我們?yōu)閛strstream申請(qǐng)存儲(chǔ)空間的方法是通過(guò)ostrstre
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 黑龍江省訥河市實(shí)驗(yàn)學(xué)校2025年八年級(jí)英語(yǔ)第二學(xué)期期中學(xué)業(yè)質(zhì)量監(jiān)測(cè)試題含答案
- 專(zhuān)用汽車(chē)培訓(xùn)
- 建筑工程技術(shù)規(guī)范知識(shí)題集
- 社區(qū)合作發(fā)展農(nóng)產(chǎn)品供應(yīng)協(xié)議
- 商業(yè)機(jī)密保護(hù)合同書(shū)
- 從課本中想到的議論文作文(14篇)
- 秋日的田野景色描寫(xiě)作文5篇
- 詳盡月收入及全年獎(jiǎng)金收入證明(6篇)
- 破碎機(jī)類(lèi)型及特點(diǎn)
- 難忘的師生情深寫(xiě)人作文14篇
- ???023綜合安防工程師認(rèn)證試題答案HCA
- 2023年公需課 大數(shù)據(jù)概述及基本概念考題
- 濁度儀使用說(shuō)明書(shū)
- GB/T 14404-2011剪板機(jī)精度
- GB/T 14294-1993組合式空調(diào)機(jī)組
- GA 1517-2018金銀珠寶營(yíng)業(yè)場(chǎng)所安全防范要求
- 提高痰留取成功率PDCA課件
- 組合導(dǎo)航與融合導(dǎo)航解析課件
- 伊金霍洛旗事業(yè)編招聘考試《行測(cè)》歷年真題匯總及答案解析精選V
- 深基坑支護(hù)工程驗(yàn)收表
- 顱腦CT影像課件
評(píng)論
0/150
提交評(píng)論