




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
內容提要文件的概念順序文件操作隨機文件操作
第8章
文件的簡單操作1文件的概念
文件是指存儲在存儲介質上的數(shù)據(jù)的集合。C++將文件看作是由一個一個字符(字節(jié))的數(shù)據(jù)順序組成的。它的組成形式可以分為:ASCII文件和二進制文件。
ASCII文件又稱文本文件,它的每一個字節(jié)存放一個ASCII代碼,代表一個字符;
二進制文件是將數(shù)據(jù)用二進制形式存放在文件中,它保持了數(shù)據(jù)在內存中存放的原有格式。
第8章
文件的簡單操作2無論是文本文件還是二進制文件,都需要用“文件指針”來操縱。
一個文件指針總是和一個文件相關聯(lián),當文件每一次打開時,文件指針指向文件的開始,隨著對文件的操作,文件指針不斷地在文件中移動,并一直指向最后處理的字符(字節(jié))位置。
對文件的操作有兩種方式:順序文件操作和隨機文件操作。
第8章
文件的簡單操作3內容提要文件的概念順序文件操作隨機文件操作
第8章
文件的簡單操作4順序文件操作順序文件操作,即從文件的第一個字符(字節(jié))開始,順序地處理到文件的最后一個字符(字節(jié)),文件指針相應地從文件的開始位置到文件的結尾。順序文件操作包括打開文件、讀寫文件和關閉文件三個步驟。
第8章
文件的簡單操作5順序文件操作文件的打開和關閉是通過使用fstream類的成員函數(shù)open和close來實現(xiàn)的。fstream類是用來對文件流進行操作,它和前面的標準輸出輸入流(cout/cin)一起,是C++實現(xiàn)流操作的最基本的類,而且它們有一個共同的基類ios。為了能使用這些類的相關函數(shù),還必須在程序中添上相關的包含文件,例如:cout和cin的頭文件是iostream.h,而fstream類的頭文件是fstream.h。
ifstreamin;//objectofinputstream
ofstreamin;//objectofoutputstream
fstreamin;//objectofinputandoutputstream
第8章
文件的簡單操作61.打開文件打開文件應使用成員函數(shù)open(),該成員函數(shù)的函數(shù)原型為:voidopen(constunsignedchar*filename,
int
nMode,
int
nPort=filebuf::openprot);
其中:filename是一個字符型指針,指定要打開的文件名,文件名中可以包含驅動器號及多層子目錄的完全路徑名,在路徑名中要用雙反斜杠(\\)將目錄隔開,通??梢杂靡粚﹄p引號包括的字符串常量作為實參,也可以用主函數(shù)main()的參數(shù)argv[]傳遞命令行。如:
第8章
文件的簡單操作7
ifstreamf1;f1.open(“e:\\user\\filename.cpp”);//缺省時把nMode設置為ios::in//輸入文件流f1與文件filename.cpp相關
//聯(lián),即打開一個文本文件進行讀操作
第8章
文件的簡單操作8
在使用f1之前,必須先建立一個文件緩沖器,并將這個流對象和文件緩沖器以及一個真實的物理文件連接起來。這兩項任務由ifstream中的成員函數(shù)open()完成。如果打開一個文件,一切正常,則為該磁盤文件建立了一個輸入緩沖器,且get指針指向緩沖器的起始位置。
第8章
文件的簡單操作9
mode指定文件的打開方式,其值如下表所示;
表
在ios類中定義的文件打開方式
第8章
文件的簡單操作文件打開方式含義ios::in以輸入(讀)方式打開文件ios::out以輸出(寫)方式打開文件ios::app打開一個文件使新的內容始終添加在文件的末尾ios::ate文件打開時,文件指針位于文件尾ios::trunc若文件存在,則清除文件所有內容;否則,創(chuàng)建新文件ios::binary以二進制方式打開文件,缺省時以文本方式打開文件ios::nocreat打開一個已有文件,若該文件不存在,則打開失敗ios::noreplace若打開的文件已經(jīng)存在,則打開失敗ios::in|ios::out以讀/寫方式打開文件ios::in|ios::binary以二進制讀方式打開文件ios::out|ios::binary以二進制寫方式打開文件10
nPort表示文件保護方式,與操作系統(tǒng)有關,用戶一般只使用缺省值,即不寫該參數(shù)。(指定了文件的系統(tǒng)屬性,其取值為:
0
一般文件
1
只讀文件
2隱藏文件3系統(tǒng)文件
第8章
文件的簡單操作11例:以提取文本數(shù)據(jù)的方式打開一個文件,其方法如下:
ifstreaminfile1(“file1.txt”,ios::in);//ios::in可缺省
ofstreamf2;f2.open(“file2.cpp”,ios::out);//ios::out可缺省
fstreamf;
f.open(“file.cpp”,ios::in|ios::out);//缺省打開方式時以文本方式打開。在這種情況下,輸入時回車/換行符要轉換為字符‘\n’,在輸出時,字符‘\n’轉換為回車/換行符,這些轉換在二進制方式下是沒有的。這是文本方式與二進制方式的主要區(qū)別。
第8章
文件的簡單操作12此句與下面兩句等價:
ifstreaminfile1;//創(chuàng)建infile1輸入流
infile1.open(“file1.txt”,ios::in);//將輸入流與文件“file1.txt”關聯(lián),即打開文件以提取二進制數(shù)據(jù)的方式打開一個文件的方法如下:ifstreaminfile2(“file2.txt”,ios::in|ios::binary);或寫成:
ifstreaminfile2;infile2.open(“file2.txt”,ios::in|ios::binary);
第8章
文件的簡單操作13流操作過程可能會出錯,例如打開一個不存在的文件進行操作,或讀一個不允許讀(或寫)的文件,或用不正確格式寫入數(shù)據(jù)等都將產(chǎn)生錯誤,必須進行檢測并加以處理,檢測流錯誤的辦法很多,通常采用:
if(!f1){<異常處理路徑>}if(f1){<正常處理路徑>}
第8章
文件的簡單操作142.關閉文件
在文件操作結束時,應及時調用成員函數(shù)close()來關閉文件。如要關閉的文件(指針)為myfile,則可使用如下語句關閉文件:
myfile.close();
第8章
文件的簡單操作153.文件的讀寫在打開文件后,就可以對文件進行讀寫操作了。
文本文件的讀寫可以直接使用插入符“<<”和提取符“>>”,也可以使用get()/put()函數(shù)或read()/write()函數(shù);二進制文件的讀寫則只能使用get()/put()函數(shù)或read()/write()函數(shù)。
第8章
文件的簡單操作16二進制文件的處理過程與文本文件的處理過程基本相同,但在判斷文件是否結束時有所區(qū)別。在文本文件中,遇到文件結束符時,get()函數(shù)返回一個文件結束標志EOF,該標志的值為-1。但在處理二進制文件時,讀入某一個字節(jié)中的二進制的值可能是-1,與EOF的值相同。為了避免將讀入的有用數(shù)據(jù)處理成“文件結束”,C++提供了一個成員函數(shù)eof()判斷文件是否結束。當達到文件尾時,它返回一個非零值,否則返回零。
第8章
文件的簡單操作17當文件不指明打開方式時,即缺省時,則以文本方式打開。在這種情況下,輸入時回車/換行符要轉換為字符“\n”,在輸出時,字符“\n”轉換為回車/換行符,這些轉換在二進制方式下是沒有的。這是文本文件和二進制文件的主要區(qū)別。
第8章
文件的簡單操作18(1)文本文件的讀/寫文本文件的讀操作通常采用istream類中的成員函數(shù)get(),寫成:ifstreamf1(“file1.cpp”);…while(f1){charc;f1.get(c);
cout<<c;}由于ifstream類由istream類派生而來,它會自動地調用成員函數(shù):istream&get(char&c);
第8章
文件的簡單操作19每次讀取f1中的單個字符傳給c,然后傳遞給CRT顯示器,文件在get指針的控制下按順序讀取,直到EOF,編程者可不必關心具體實現(xiàn)細節(jié)。如果不是寫到標準流對象cout,而是寫到另一個文件中,則在進行寫操作前,必須打開另一個文件,寫成:ofstreamf2(“file2.cpp”);if(!f2){
cerr<<“\aCan’topenfile2.cpp.\n”;exit(1);}charc;while(f2&&f1.get(c))f2.put(c);
第8章
文件的簡單操作20在while循環(huán)語句中,程序每次從f1中讀取一個字符,然后由put()寫到f2中,實際上是從與f1相關聯(lián)的輸入緩沖器中讀取一個字符,寫到與f2相關聯(lián)的輸出緩沖器中,由于get指針和put指針能自動增1,故確保了字符的讀寫順序。當get指針指到輸入緩沖器的終止位置時,說明整個文件已讀完,此時輸出緩沖器已復制了整個文件的內容,f1.get(c)讀到文件尾則測試得該表達式為假(false),則程序跳出循環(huán),執(zhí)行后續(xù)語句。順便指出,與文本文件相關聯(lián)的緩沖器以NULL結尾。如前所述,對于文本文件經(jīng)常采用讀取一行字符串的重要函數(shù)getline(),寫成:ifstreamf1(“file1.cpp”);if(!f1){cerr<<“\aCan’topenfile2.cpp.\n”;exit(1);}while(f1){charbuf[100];f1.getline(buf,sizeof(buf));cout<<buf;}
第8章
文件的簡單操作21(2)二進制文件的讀寫
二進制文件不含空白符,數(shù)據(jù)沒有通過換行符組織成一行行的形式,任何8位(bit)值都可能出現(xiàn)。因此,將二進制文件調到屏幕上顯示出的信息很難看懂。通常是利用ostream類的成員函數(shù)write()將數(shù)據(jù)寫到二進制文件。
寫二進制數(shù)據(jù)有兩種方法:一是一次寫入一個字符,使用成員函數(shù)put(charc);二是一次寫一組字符(但不是以終止符結束),則使用
ostream&write(constchar*pch,int
nCount);
第8章
文件的簡單操作22(2)二進制文件的讀寫
為了便于調試,一般采用按字符形式格式化的方法,通過強制類型轉換,將程序中要寫入文件的對象或對象數(shù)組轉換成字符串形式,寫入二進制文件,其調用語句的一般格式為:輸出文件流對象名.write((char*)&對象名或&對象數(shù)組名[下標],sizeof(<對象所屬類名>));
同樣讀二進制文件的方法通常是將文件按字符形式格式化的方法讀入到一個與寫入時同類的對象或對象數(shù)組中,其調用語句的一般格式為:
輸入文件流對象名.read((char*)&對象名或&對象數(shù)組名[下標],sizeof(<對象所屬類名>));
第8章
文件的簡單操作23這樣一來,可對二進制文件讀寫任何類型的數(shù)據(jù)。//Demo:
二進制文件的讀寫.cpp如前所述,read()與write()的原型為:istream&read(char*pch,int
nCount);ostream&write(constchar*pch,int
nCount);例中是讀寫結構體Person的結構數(shù)組people[]。read()成員函數(shù)從輸入流中讀取nCount個字節(jié),并把它們存放在pch所指的緩沖器中。write()成員函數(shù)是將nCount個字節(jié)從pch所指的緩沖器取出,寫到輸出流。本程序中write()是對結構數(shù)組people2[]進行操作,由于它不是字符型數(shù)組,故必須進行強制類型轉換。結構數(shù)組people1[]的數(shù)據(jù)結構如圖所示,結構數(shù)組people2[]的數(shù)據(jù)結構與peopl1[]一樣,因此寫到d:\\test\\Personal.dat文件中共有26個字節(jié)的二進制數(shù)據(jù)。
第8章
文件的簡單操作24
第8章
文件的簡單操作Wang\0…1.6525Zhang\0…1.7224Zhang\0…1.7224Zhang\0…1.7224people[0]people[1]people[2]people[3]25此例中寫數(shù)據(jù)是否結束由cnt變量控制,不能只靠f1表達式,它只能檢測寫操作是否出錯而不能判終,若取消cnt<4,表達式將變成無窮循環(huán)。如前所述,以二進制方式打開的文件,其關聯(lián)的緩沖器不是以NULL結尾。//Demo:帶命令行參數(shù)的文件.cpp
第8章
文件的簡單操作26【例】向文本文件中分別寫入一個整數(shù)、一個浮點數(shù)和一個字符串。#include<iostream>usingnamespacestd;#include<fstream.h>#include<stdlib.h>voidmain(void){fstream
myfile;myfile.open("f1.txt",ios::out);//以寫方式打開文件f1.txt
if(!myfile){
cout<<"Can'topenfile!!"<<endl;abort(); //退出程序,包含在stdlib.h中}
myfile<<20<<endl;myfile<<4.58<<endl;
myfile<<"HelloWorld!"<<endl;myfile.close();}
第8章
文件的簡單操作27【例】從文本文件中讀取數(shù)據(jù)例程#include<iostream.h>#include<fstream.h>//有關文件輸入、輸出的定義文件#include<stdlib.h>voidmain(void){chara[101];ifstreaminfile3;infile3.open(“filein3.txt”,ios::in);//讀取infile3輸入流的數(shù)據(jù)if(!infile3){cout<<“Itcannotopenthefile!”<<endl;abort();}while(!infile3.eof()){infile3.getline(a,sizeof(a));cout<<a<<endl;}infile3.close();}
第8章
文件的簡單操作28【例】文本文件復制例程//file文件復制操作.cpp#include<iostream.h>#include<fstream.h>//有關文件輸入、輸出的定義文件#include<stdlib.h>voidmain(void){charch;fstream
inf,outf;
inf.open("d:\\filein.txt",ios::in);
if(!inf){cout<<"Itcannotopenthefile!"<<endl;abort();}
outf.open("d:\\fileout.txt",ios::out);
if(!outf){cout<<"Itcannotopenthefile!"<<endl;abort();}
while(!inf.eof()&&inf.get(ch))//按字符讀取文件filein.dat的數(shù)據(jù)
outf.put(ch);//將數(shù)據(jù)按字符寫入文件fileout.dat中
inf.close();outf.close();}
第8章
文件的簡單操作29//Demo:文件操作例.cpp
第8章
文件的簡單操作30內容提要文件的概念順序文件操作隨機文件操作
第8章
文件的簡單操作31隨機文件操作隨機文件操作,即在文件中通過C++相關的函數(shù)移動文件指針,并指向所要處理的字符(字節(jié))。隨機文件提供在文件中來回移動文件指針和非順序地讀寫文件的能力,這樣在讀寫文件中的某一數(shù)據(jù)之前不需要再讀寫其前
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年信息技術應用能力考試卷及答案
- 烏蘭察布職業(yè)學院《工程預決算》2023-2024學年第二學期期末試卷
- 2025年中醫(yī)基礎理論考試題及答案
- 江蘇省南通市通州、海安2024-2025學年高三下學期第四次質量考評歷史試題含解析
- 2025年醫(yī)療影像技術專業(yè)考試試題及答案
- 山西省呂梁市2024-2025學年初三下學期第一次統(tǒng)一考試(5月)英語試題試卷含答案
- 四川警察學院《國際貿易金融家》2023-2024學年第二學期期末試卷
- 外貿知識大講堂相關課件
- 智能溫室有機農(nóng)場大棚租賃及農(nóng)業(yè)物聯(lián)網(wǎng)技術應用合同
- 創(chuàng)意園區(qū)共享空間租賃與知識產(chǎn)權保護協(xié)議
- 語文課程標準修訂要點分析
- 2025年中國煤氣發(fā)生爐行業(yè)專項深度調研及“2025”發(fā)展規(guī)劃指
- 【MOOC】《學術交流英語》(東南大學)章節(jié)中國大學慕課答案
- 《建筑基坑工程監(jiān)測技術標準》(50497-2019)
- 行車驗收表公司和安裝單位
- 防食物中毒和預防的主題班會
- 社區(qū)居民家庭教育指導需求調查問卷
- 防災減災知識問答試題
- 《發(fā)育生物學》課件第八章 胚軸的特化與體軸的建立
- 《中醫(yī)護理學》第三章課件
- 哈工大環(huán)境工程畢業(yè)設計
評論
0/150
提交評論