文件的基本概念模板課件_第1頁(yè)
文件的基本概念模板課件_第2頁(yè)
文件的基本概念模板課件_第3頁(yè)
文件的基本概念模板課件_第4頁(yè)
文件的基本概念模板課件_第5頁(yè)
已閱讀5頁(yè),還剩81頁(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)介

FileProcessing

Chapter17FileProcessingChapter17文件的基本概念模板課件Topics17.1Introduction17.2TheDataHierarchy17.3FilesandStreams17.4CreatingaSequentialFile17.5ReadingDatafromaSequentialFile17.6Input/OutputofObjectsTopics17.1Introduction17.1Introduction臨時(shí)存儲(chǔ):變量和數(shù)組永久存儲(chǔ):文件保存大量的數(shù)據(jù)存儲(chǔ)在二級(jí)存儲(chǔ)設(shè)備中MagneticdisksOpticaldisksTapes17.1Introduction臨時(shí)存儲(chǔ):變量和數(shù)組

本節(jié)中文件指的是磁盤文件。C++文件(file)分為兩類:二進(jìn)制文件和文本文件。文本文件由字符序列組成,也稱ASCII碼文件,在文本文件中存取的最小信息單位為字符(character)二進(jìn)制文件中存取的最小信息單位為字節(jié)(Byte),如.obj

C++把每一個(gè)文件都看成一個(gè)有序的字節(jié)流,每一個(gè)文件或者以文件結(jié)束符(EOF)結(jié)束,或者在特定的字節(jié)號(hào)處結(jié)束。012436578…n-1…文件結(jié)束符C++把文件看作有序的n個(gè)字節(jié)的流文件的基本概念:本節(jié)中文件指的是磁盤文件。C++文件(file)分Topics17.1Introduction17.2TheDataHierarchy17.3FilesandStreams17.4CreatingaSequentialFile17.5ReadingDatafromaSequentialFile17.6Input/OutputofObjectsTopics17.1Introduction17.2TheDataHierarchyBits(二進(jìn)制位)0or1計(jì)算機(jī)支持的最小數(shù)據(jù)項(xiàng)計(jì)算機(jī)電路執(zhí)行位處理所有數(shù)據(jù)項(xiàng)最終由位組成Characters(字符)數(shù)字、字母和專門的符號(hào)稱為“字符”能夠在特定計(jì)算機(jī)上用來(lái)編寫程序和代表數(shù)據(jù)項(xiàng)的所有字符的集合稱為“字符集”Char以字節(jié)形式存儲(chǔ)

(8bits)Wchar_t

占多個(gè)字節(jié)(用于非英文字符集的表示)17.2TheDataHierarchyBits(二17.2TheDataHierarchy(Cont.)Fields(字段或數(shù)據(jù)項(xiàng))由字符組成代表一定的含義Example姓名,顏色等等Records(記錄)由多個(gè)字段組成C++中表現(xiàn)為:類ExampleAnemployee’srecordmightincludeid#,name,address,etc.記錄的關(guān)鍵字:Arecordkeyisafielduniquetoeachrecord17.2TheDataHierarchy(Cont.Fig.17.1

|Datahierarchy.Fig.17.1|Datahierarchy.17.2TheDataHierarchy字段2字段3……記錄:………文件1文件3字段1(關(guān)鍵字)文件2數(shù)據(jù)庫(kù):一組相關(guān)的文件數(shù)據(jù)庫(kù)管理系統(tǒng):為建立和管理數(shù)據(jù)庫(kù)而設(shè)計(jì)的文件集合17.2TheDataHierarchy字段2字段3…Topics17.1Introduction17.2TheDataHierarchy17.3FilesandStreams17.4CreatingaSequentialFile17.5ReadingDatafromaSequentialFile17.6Input/OutputofObjectsTopics17.1Introduction17.3FilesandStreams當(dāng)打開(kāi)一個(gè)文件時(shí),該文件就和某個(gè)流關(guān)聯(lián)起來(lái)了。對(duì)文件進(jìn)行讀寫實(shí)際上受到一個(gè)文件定位指針(filepositionpointer)的控制。輸入流的指針也稱為讀指針,每一次提取操作將從讀指針當(dāng)前所指位置開(kāi)始,每次提取操作自動(dòng)將讀指針向文件尾移動(dòng)。輸出流指針也稱寫指針,每一次插入操作將從寫指針當(dāng)前位置開(kāi)始,每次插入操作自動(dòng)將寫指針向文件尾移動(dòng)。17.3FilesandStreams當(dāng)打開(kāi)一個(gè)文件時(shí)17.3FilesandStreams

--I/O流模板之間的繼承關(guān)系

為了在C++中執(zhí)行文件處理,必須包含頭文件<iostream>和<fstream>17.3FilesandStreams

-17.3FilesandStreams--文件處理必須包含頭文件:#include<fstream><fstream>包括三種類模板的定義basic_ifstream(forfileinput)basic_ofstream(forfileoutput)basic_fstream(forfileinputandoutput)提供了處理字符流的模板特化ifstream:從文件中讀入字符(讀文件)ofstream:向文件輸出字符(寫文件)fstream:支持文件中字符的輸入和輸出生成這些流類模板特化的對(duì)象,即可打開(kāi)文件程序和文件之間通過(guò)流對(duì)象交互17.3FilesandStreams--文Topics17.1Introduction17.2TheDataHierarchy17.3FilesandStreams17.4CreatingaSequentialFile17.5ReadingDatafromaSequentialFile17.6Input/OutputofObjectsTopics17.1Introduction17.4CreatingaSequentialFileFilestructure需要程序員對(duì)文件結(jié)構(gòu)化C++:對(duì)文件作字節(jié)流處理順序文件vs

隨機(jī)存取文件順序文件:記錄一般按照關(guān)鍵字順序存放隨機(jī)存取文件:不需查找,直接讀取17.4CreatingaSequentialFil17.4CreatingaSequentialFile寫數(shù)據(jù)到文件創(chuàng)建ofstream對(duì)象構(gòu)造函數(shù)ofstream(constchar*filename,intmode)

filename:文件名由文件的主名和擴(kuò)展名兩部分組成。mode:ios::out

:缺省模式,覆蓋文件中已有數(shù)據(jù)ios::app:向文件末尾添加數(shù)據(jù)例:ofstream

outClientFile("clients.dat",ios::out);建立了一個(gè)到文件的“通信通道”

如果該文件名不存在,則新建一個(gè)同名文件對(duì)于已創(chuàng)建的文件對(duì)象,使用成員函數(shù)打開(kāi)文件與構(gòu)造函數(shù)的參數(shù)相同,可以先創(chuàng)建再打開(kāi)例:ofstream

outClientFile;

outClientFile.open(“clients.dat”,ios::out);17.4CreatingaSequentialFilFig.17.5

|Fileopenmodes.Fig.17.5|Fileopenmodes.in

:(從文件讀取)打開(kāi)方式只要含in,如文件不存在則返回失敗。在打開(kāi)為輸入輸出方式時(shí)(同時(shí)用out),編程應(yīng)注意判斷是否失敗,失敗時(shí)千萬(wàn)不可再寫入文件。out:

(寫入文件)如文件不存在,則建立新文件,如文件存在,如果同時(shí)未設(shè)定app,in,則文件清空。trunc:(打開(kāi)文件,并清空它)文件不存在則建立新文件,與out默認(rèn)操作相同。但與in配合,文件不存在則返回失敗。app:(寫入文件,添加在末尾)原文件內(nèi)容保留,新數(shù)據(jù)接在尾部。ate:(atend,打開(kāi)文件,文件指針在文件尾)文件指針可以移動(dòng),即新數(shù)據(jù)可寫到任何位置。文件是否清空由其它標(biāo)識(shí)決定。

trunc/app/ate最好配合out、in等一起用,因?yàn)椴煌腃++平臺(tái),要求不同,一起用不會(huì)出錯(cuò)。如不一起用,至少VC++不認(rèn)這種格式。

binary標(biāo)識(shí)以二進(jìn)制方式打開(kāi)文件。同時(shí)用out時(shí),如文件不存在,則建立新文件,并且新文件能用,不必清狀態(tài)字。in:(從文件讀取)打開(kāi)方式只要含in,如文件不存在則返文件打開(kāi)方式:由在ios類中定義的公有枚舉成員決定:enumopen_mode{ in=0x01, out=0x02, ate=0x04, app=0x08, trunc=0x10, binary=0x80};fstreamiofile;//既輸入又輸出用iofile.open(“myfile.txt”,ios::in|ios::out);文件打開(kāi)方式:fstreamiofile;//既輸入又輸出打開(kāi)文件時(shí)應(yīng)該判斷是否成功,若成功,文件流對(duì)象值為非零值,不成功為0(NULL),文件流對(duì)象值就是指它的地址。17.4CreatingaSequentialFile

--流對(duì)象和磁盤文件關(guān)聯(lián)//打開(kāi)一個(gè)文件完整的程序intmain(){

fstreamiofile(”myfile.txt”,ios::in|ios::out);if(!iofile){//“!”為重載的運(yùn)算符cout<<”不能打開(kāi)文件:”<<”myfile,txt”<<endl;return-1;}//失敗退回操作系統(tǒng)} 打開(kāi)文件時(shí)應(yīng)該判斷是否成功,若成功,文件流對(duì)象值為非零值,不17.4CreatingaSequentialFile

--文件的打開(kāi)與關(guān)閉1.說(shuō)明一個(gè)文件流對(duì)象,這又被稱為內(nèi)部文件:ifstreamifile;//只輸入用ofstreamofile;//只輸出用fstreamiofile;//既輸入又輸出用2.使用文件流對(duì)象的成員函數(shù)打開(kāi)一個(gè)磁盤文件。iofile.open(“myfile.txt”,ios::in|ios::out);3.使用提取(>>)和插入(<<)運(yùn)算符對(duì)文件進(jìn)行讀寫操作,或使用成員函數(shù)(get\put)進(jìn)行讀寫。4.關(guān)閉文件。三個(gè)文件流類各有一個(gè)關(guān)閉文件的成員函數(shù)

:voidifstream::close();voidofstream::close();voidfstream::close();使用很方便,如:iofile.close();也可直接通過(guò)構(gòu)造函數(shù)打開(kāi)文件:fstreamiofile(”myfile.txt”,ios::in|ios::out);17.4CreatingaSequentialFil17.4CreatingaSequentialFile

--文件關(guān)閉關(guān)閉文件時(shí),系統(tǒng)把該文件相關(guān)聯(lián)的文件緩沖區(qū)中的數(shù)據(jù)寫到文件中,保證文件的完整,收回與該文件相關(guān)的內(nèi)存空間,把磁盤文件名與文件流對(duì)象之間的關(guān)聯(lián)斷開(kāi),可防止誤操作修改了磁盤文件。關(guān)閉文件并沒(méi)有取消文件流對(duì)象,該文件流對(duì)象又可與其他磁盤文件建立聯(lián)系。文件流對(duì)象在程序結(jié)束時(shí),或它的生命期結(jié)束時(shí),由析構(gòu)函數(shù)撤消。它同時(shí)釋放內(nèi)部分配的預(yù)留緩沖區(qū)。

調(diào)用析構(gòu)函數(shù)也會(huì)關(guān)閉相應(yīng)正在打開(kāi)的文件17.4CreatingaSequentialFilFig17_04.cpp

(1of2)創(chuàng)建ofstream對(duì)象,打開(kāi)文件Overloadedoperator!willreturntrueifthefiledidnotopensuccessfullyFig17_04.cpp創(chuàng)建ofstream對(duì)象,打開(kāi)文件重載operatorvoid*

,遇到文件結(jié)束符EOF時(shí)(Ctrl+Z),返回一個(gè)空指針。使用“<<”向文件中寫入數(shù)據(jù)ofstream

的析構(gòu)函數(shù)被自動(dòng)調(diào)用,隱式地關(guān)閉文件重載operatorvoid*,遇到文件結(jié)束符EOF時(shí)Topics17.1Introduction17.2TheDataHierarchy17.3FilesandStreams17.4CreatingaSequentialFile17.5ReadingDatafromaSequentialFile17.6Input/OutputofObjectsTopics17.1Introduction17.5ReadingDatafromaSequentialFile創(chuàng)建

ifstream

對(duì)象ifstream構(gòu)造函數(shù)AfilenameAfile-openmodeios::in

缺省模式,只能從文件讀取數(shù)據(jù),最小權(quán)限原則例:ifstream

inClientFile("clients.dat",ios::in);對(duì)于已經(jīng)存在的ifstream對(duì)象,使用成員函數(shù)打開(kāi)文件例:ifstream

inClientFile;

inClientFile.open("clients.dat",ios::in);17.5ReadingDatafromaSequeFig17_07.cpp

Fig17_07.cppOpenclients.datforinput重載operatorvoid*

,returns,遇到文件結(jié)束符,返回一個(gè)空指針。重載!:如果文件打開(kāi)不成功,返回falseifstream的析構(gòu)函數(shù)隱式調(diào)用,關(guān)閉文件Openclients.datforinput重載oOutlineFig17_07.cpp

(3of3)OutlineFig17_07.cpp17.5ReadingDatafromaSequentialFile--順序文件的讀取示例題目要求:簡(jiǎn)單文件的寫、讀、查找17.5ReadingDatafromaSeque讀寫文件#include<iostream>usingstd::cerr;usingstd::cout;usingstd::endl;usingstd::ios;#include<fstream>//filestreamusingstd::ofstream;//outputfilestreamusingstd::ifstream;#include<cstdlib>#include<cstring>intmain(){

ofstreamfout; fout.open("output.txt"); if(!fout) {cerr<<"Filecouldnotbeopened"<<endl; exit(1); } intnum=150; charname[]="JohnDoe"; fout<<num<<"\n"; fout<<name<<"\n";

fout.close();

ifstreamfin("output.txt");intnumber;charname2[20];fin>>number;fin.ignore();fin.getline(name2,'\n');//fin>>number>>name2;cout<<number<<""<<name2<<endl;strcpy(name2,"aaaabbb");cout<<"nowname2="<<name2<<endl;fin.seekg(5);fin.getline(name2,'\n');cout<<"newname2="<<name2<<endl;return0;}在Windows平臺(tái)下如果以“文本”方式打開(kāi)文件,當(dāng)讀取文件的時(shí)候,系統(tǒng)會(huì)將所有的"\r\n"轉(zhuǎn)換成"\n";當(dāng)寫入文件的時(shí)候,系統(tǒng)會(huì)將"\n"轉(zhuǎn)換成"\r\n"寫入。如果以"二進(jìn)制"方式打開(kāi)文件,則讀/寫都不會(huì)進(jìn)行這樣的轉(zhuǎn)換。讀寫文件#include<iostream>ifstrea17.5ReadingDatafromaSequentialFile--順序文件的讀取示例題目要求:實(shí)現(xiàn)文件的復(fù)制17.5ReadingDatafromaSequeintmain()//實(shí)現(xiàn)從源文件到目的文件的復(fù)制{charch;ifstreamsfile("d:\\Ex\\in.cpp");ofstreamdfile(“e:\\out.cpp");//只能創(chuàng)建文件,不能建立子目錄,如路徑不存在則失敗

if(!sfile){cout<<"不能打開(kāi)源文件:"<<"d:\\Ex\\in.cpp"<<endl;return-1;}if(!dfile){cout<<"不能打開(kāi)目標(biāo)文件:"<<"e:\\out.cpp"<<endl;return-1;}sfile.unsetf(ios::skipws);//把跳過(guò)空格控制位置0,即不跳過(guò)空格,否則空格全部未復(fù)制

while(sfile>>ch)dfile<<ch;sfile.close();//如沒(méi)有這兩個(gè)關(guān)閉函數(shù),析構(gòu)函數(shù)也可關(guān)閉

dfile.close();return0;}intmain()//實(shí)現(xiàn)從源文件到目的文件的復(fù)制#include<iostream.h>#include<fstream.h>intmain(){ ifstreamifile("abc.txt"); if(!ifile) { cout<<"abc.txt文件不能打開(kāi)"<<endl; return0; } ofstreamofile("xyz.txt"); if(!ofile) { cout<<"xyz.txt文件不能打開(kāi)"<<endl; return0; }

charch; while(ifile.get(ch)) ofile.put(ch);

ifile.close(); ofile.close(); return1;}將abc.txt復(fù)制到xyz.txt

使用輸入流成員函數(shù)get()從文本文件abc.txt中讀取一個(gè)字符ch,然后使用輸出流成員函數(shù)put()將字符ch寫入文本文件xyz.txt中,繼續(xù)這一過(guò)程直到get()讀完為止。#include<iostream.h>將abc.txt復(fù)制17.5ReadingDatafromaSequentialFile--順序文件的讀取示例程序解讀P61817.8題目要求:順序讀取文件內(nèi)容,按照要求顯示數(shù)據(jù)17.5ReadingDatafromaSequeTopics17.1Introduction17.2TheDataHierarchy17.3FilesandStreams17.4CreatingaSequentialFile17.5ReadingDatafromaSequentialFile17.6Input/OutputofObjectsTopics17.1Introduction17.6Input/OutputofObjects規(guī)范化操作:在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,信息總是放在對(duì)象的數(shù)據(jù)成員里。這些信息最終需要保存到文件中。讀取文件中對(duì)象的信息時(shí),必須重新創(chuàng)建對(duì)象,把數(shù)據(jù)讀入對(duì)象,在運(yùn)行過(guò)程中,對(duì)放在對(duì)象的數(shù)據(jù)成員里的信息利用和修改,運(yùn)行結(jié)束時(shí)必須把這些信息重新保存到文件中,然后關(guān)閉文件在面向?qū)ο蟮腃++程序設(shè)計(jì)中,文件應(yīng)該在構(gòu)造函數(shù)中打開(kāi),并創(chuàng)建對(duì)象;而在析構(gòu)函數(shù)中保存和關(guān)閉文件,并撤銷對(duì)象。17.6Input/OutputofObjects規(guī)范Summary文件流分為三種文件輸入流(ifstream),文件輸出流(ofstream),文件輸入/輸出流(fstream)文件處理步驟定義文件流對(duì)象打開(kāi)文件voidopen(constunsignedchar*filename,intmode,intaccess=filebuf::openprot);關(guān)閉文件調(diào)用成員函數(shù)close()Summary文件流分為三種Summary文件讀寫順序文件操作:這種操作方式只能從文件的開(kāi)始處依次順序讀寫文件內(nèi)容,而不能任意讀寫文件內(nèi)容。讀:文件流類的get、getline、read成員函數(shù)以及抽取符“>>”寫:put、write函數(shù)以及插入符“<<”

隨機(jī)文件操作讀,寫:read,writeSummary文件讀寫實(shí)驗(yàn)必選題目(交實(shí)驗(yàn)報(bào)告):實(shí)驗(yàn)任選題目(不交實(shí)驗(yàn)報(bào)告):見(jiàn)實(shí)驗(yàn)報(bào)告作業(yè)題目(Homework):

Homework!實(shí)驗(yàn)必選題目(交實(shí)驗(yàn)報(bào)告):Homework!文件定位指針:文件中下一個(gè)被讀取或?qū)懭氲淖止?jié)號(hào)istream、ostream都提供了修改文件定位指針的成員函數(shù)seekg(longpos,intmode)—istreamseekp(longpos,intmode)—ostream重定位文件定位定位指針Return文件定位指針:重定位文件定位定位指針Return文件的基本概念模板課件FileProcessing

Chapter17FileProcessingChapter17文件的基本概念模板課件Topics17.1Introduction17.2TheDataHierarchy17.3FilesandStreams17.4CreatingaSequentialFile17.5ReadingDatafromaSequentialFile17.6Input/OutputofObjectsTopics17.1Introduction17.1Introduction臨時(shí)存儲(chǔ):變量和數(shù)組永久存儲(chǔ):文件保存大量的數(shù)據(jù)存儲(chǔ)在二級(jí)存儲(chǔ)設(shè)備中MagneticdisksOpticaldisksTapes17.1Introduction臨時(shí)存儲(chǔ):變量和數(shù)組

本節(jié)中文件指的是磁盤文件。C++文件(file)分為兩類:二進(jìn)制文件和文本文件。文本文件由字符序列組成,也稱ASCII碼文件,在文本文件中存取的最小信息單位為字符(character)二進(jìn)制文件中存取的最小信息單位為字節(jié)(Byte),如.obj

C++把每一個(gè)文件都看成一個(gè)有序的字節(jié)流,每一個(gè)文件或者以文件結(jié)束符(EOF)結(jié)束,或者在特定的字節(jié)號(hào)處結(jié)束。012436578…n-1…文件結(jié)束符C++把文件看作有序的n個(gè)字節(jié)的流文件的基本概念:本節(jié)中文件指的是磁盤文件。C++文件(file)分Topics17.1Introduction17.2TheDataHierarchy17.3FilesandStreams17.4CreatingaSequentialFile17.5ReadingDatafromaSequentialFile17.6Input/OutputofObjectsTopics17.1Introduction17.2TheDataHierarchyBits(二進(jìn)制位)0or1計(jì)算機(jī)支持的最小數(shù)據(jù)項(xiàng)計(jì)算機(jī)電路執(zhí)行位處理所有數(shù)據(jù)項(xiàng)最終由位組成Characters(字符)數(shù)字、字母和專門的符號(hào)稱為“字符”能夠在特定計(jì)算機(jī)上用來(lái)編寫程序和代表數(shù)據(jù)項(xiàng)的所有字符的集合稱為“字符集”Char以字節(jié)形式存儲(chǔ)

(8bits)Wchar_t

占多個(gè)字節(jié)(用于非英文字符集的表示)17.2TheDataHierarchyBits(二17.2TheDataHierarchy(Cont.)Fields(字段或數(shù)據(jù)項(xiàng))由字符組成代表一定的含義Example姓名,顏色等等Records(記錄)由多個(gè)字段組成C++中表現(xiàn)為:類ExampleAnemployee’srecordmightincludeid#,name,address,etc.記錄的關(guān)鍵字:Arecordkeyisafielduniquetoeachrecord17.2TheDataHierarchy(Cont.Fig.17.1

|Datahierarchy.Fig.17.1|Datahierarchy.17.2TheDataHierarchy字段2字段3……記錄:………文件1文件3字段1(關(guān)鍵字)文件2數(shù)據(jù)庫(kù):一組相關(guān)的文件數(shù)據(jù)庫(kù)管理系統(tǒng):為建立和管理數(shù)據(jù)庫(kù)而設(shè)計(jì)的文件集合17.2TheDataHierarchy字段2字段3…Topics17.1Introduction17.2TheDataHierarchy17.3FilesandStreams17.4CreatingaSequentialFile17.5ReadingDatafromaSequentialFile17.6Input/OutputofObjectsTopics17.1Introduction17.3FilesandStreams當(dāng)打開(kāi)一個(gè)文件時(shí),該文件就和某個(gè)流關(guān)聯(lián)起來(lái)了。對(duì)文件進(jìn)行讀寫實(shí)際上受到一個(gè)文件定位指針(filepositionpointer)的控制。輸入流的指針也稱為讀指針,每一次提取操作將從讀指針當(dāng)前所指位置開(kāi)始,每次提取操作自動(dòng)將讀指針向文件尾移動(dòng)。輸出流指針也稱寫指針,每一次插入操作將從寫指針當(dāng)前位置開(kāi)始,每次插入操作自動(dòng)將寫指針向文件尾移動(dòng)。17.3FilesandStreams當(dāng)打開(kāi)一個(gè)文件時(shí)17.3FilesandStreams

--I/O流模板之間的繼承關(guān)系

為了在C++中執(zhí)行文件處理,必須包含頭文件<iostream>和<fstream>17.3FilesandStreams

-17.3FilesandStreams--文件處理必須包含頭文件:#include<fstream><fstream>包括三種類模板的定義basic_ifstream(forfileinput)basic_ofstream(forfileoutput)basic_fstream(forfileinputandoutput)提供了處理字符流的模板特化ifstream:從文件中讀入字符(讀文件)ofstream:向文件輸出字符(寫文件)fstream:支持文件中字符的輸入和輸出生成這些流類模板特化的對(duì)象,即可打開(kāi)文件程序和文件之間通過(guò)流對(duì)象交互17.3FilesandStreams--文Topics17.1Introduction17.2TheDataHierarchy17.3FilesandStreams17.4CreatingaSequentialFile17.5ReadingDatafromaSequentialFile17.6Input/OutputofObjectsTopics17.1Introduction17.4CreatingaSequentialFileFilestructure需要程序員對(duì)文件結(jié)構(gòu)化C++:對(duì)文件作字節(jié)流處理順序文件vs

隨機(jī)存取文件順序文件:記錄一般按照關(guān)鍵字順序存放隨機(jī)存取文件:不需查找,直接讀取17.4CreatingaSequentialFil17.4CreatingaSequentialFile寫數(shù)據(jù)到文件創(chuàng)建ofstream對(duì)象構(gòu)造函數(shù)ofstream(constchar*filename,intmode)

filename:文件名由文件的主名和擴(kuò)展名兩部分組成。mode:ios::out

:缺省模式,覆蓋文件中已有數(shù)據(jù)ios::app:向文件末尾添加數(shù)據(jù)例:ofstream

outClientFile("clients.dat",ios::out);建立了一個(gè)到文件的“通信通道”

如果該文件名不存在,則新建一個(gè)同名文件對(duì)于已創(chuàng)建的文件對(duì)象,使用成員函數(shù)打開(kāi)文件與構(gòu)造函數(shù)的參數(shù)相同,可以先創(chuàng)建再打開(kāi)例:ofstream

outClientFile;

outClientFile.open(“clients.dat”,ios::out);17.4CreatingaSequentialFilFig.17.5

|Fileopenmodes.Fig.17.5|Fileopenmodes.in

:(從文件讀取)打開(kāi)方式只要含in,如文件不存在則返回失敗。在打開(kāi)為輸入輸出方式時(shí)(同時(shí)用out),編程應(yīng)注意判斷是否失敗,失敗時(shí)千萬(wàn)不可再寫入文件。out:

(寫入文件)如文件不存在,則建立新文件,如文件存在,如果同時(shí)未設(shè)定app,in,則文件清空。trunc:(打開(kāi)文件,并清空它)文件不存在則建立新文件,與out默認(rèn)操作相同。但與in配合,文件不存在則返回失敗。app:(寫入文件,添加在末尾)原文件內(nèi)容保留,新數(shù)據(jù)接在尾部。ate:(atend,打開(kāi)文件,文件指針在文件尾)文件指針可以移動(dòng),即新數(shù)據(jù)可寫到任何位置。文件是否清空由其它標(biāo)識(shí)決定。

trunc/app/ate最好配合out、in等一起用,因?yàn)椴煌腃++平臺(tái),要求不同,一起用不會(huì)出錯(cuò)。如不一起用,至少VC++不認(rèn)這種格式。

binary標(biāo)識(shí)以二進(jìn)制方式打開(kāi)文件。同時(shí)用out時(shí),如文件不存在,則建立新文件,并且新文件能用,不必清狀態(tài)字。in:(從文件讀取)打開(kāi)方式只要含in,如文件不存在則返文件打開(kāi)方式:由在ios類中定義的公有枚舉成員決定:enumopen_mode{ in=0x01, out=0x02, ate=0x04, app=0x08, trunc=0x10, binary=0x80};fstreamiofile;//既輸入又輸出用iofile.open(“myfile.txt”,ios::in|ios::out);文件打開(kāi)方式:fstreamiofile;//既輸入又輸出打開(kāi)文件時(shí)應(yīng)該判斷是否成功,若成功,文件流對(duì)象值為非零值,不成功為0(NULL),文件流對(duì)象值就是指它的地址。17.4CreatingaSequentialFile

--流對(duì)象和磁盤文件關(guān)聯(lián)//打開(kāi)一個(gè)文件完整的程序intmain(){

fstreamiofile(”myfile.txt”,ios::in|ios::out);if(!iofile){//“!”為重載的運(yùn)算符cout<<”不能打開(kāi)文件:”<<”myfile,txt”<<endl;return-1;}//失敗退回操作系統(tǒng)} 打開(kāi)文件時(shí)應(yīng)該判斷是否成功,若成功,文件流對(duì)象值為非零值,不17.4CreatingaSequentialFile

--文件的打開(kāi)與關(guān)閉1.說(shuō)明一個(gè)文件流對(duì)象,這又被稱為內(nèi)部文件:ifstreamifile;//只輸入用ofstreamofile;//只輸出用fstreamiofile;//既輸入又輸出用2.使用文件流對(duì)象的成員函數(shù)打開(kāi)一個(gè)磁盤文件。iofile.open(“myfile.txt”,ios::in|ios::out);3.使用提取(>>)和插入(<<)運(yùn)算符對(duì)文件進(jìn)行讀寫操作,或使用成員函數(shù)(get\put)進(jìn)行讀寫。4.關(guān)閉文件。三個(gè)文件流類各有一個(gè)關(guān)閉文件的成員函數(shù)

:voidifstream::close();voidofstream::close();voidfstream::close();使用很方便,如:iofile.close();也可直接通過(guò)構(gòu)造函數(shù)打開(kāi)文件:fstreamiofile(”myfile.txt”,ios::in|ios::out);17.4CreatingaSequentialFil17.4CreatingaSequentialFile

--文件關(guān)閉關(guān)閉文件時(shí),系統(tǒng)把該文件相關(guān)聯(lián)的文件緩沖區(qū)中的數(shù)據(jù)寫到文件中,保證文件的完整,收回與該文件相關(guān)的內(nèi)存空間,把磁盤文件名與文件流對(duì)象之間的關(guān)聯(lián)斷開(kāi),可防止誤操作修改了磁盤文件。關(guān)閉文件并沒(méi)有取消文件流對(duì)象,該文件流對(duì)象又可與其他磁盤文件建立聯(lián)系。文件流對(duì)象在程序結(jié)束時(shí),或它的生命期結(jié)束時(shí),由析構(gòu)函數(shù)撤消。它同時(shí)釋放內(nèi)部分配的預(yù)留緩沖區(qū)。

調(diào)用析構(gòu)函數(shù)也會(huì)關(guān)閉相應(yīng)正在打開(kāi)的文件17.4CreatingaSequentialFilFig17_04.cpp

(1of2)創(chuàng)建ofstream對(duì)象,打開(kāi)文件Overloadedoperator!willreturntrueifthefiledidnotopensuccessfullyFig17_04.cpp創(chuàng)建ofstream對(duì)象,打開(kāi)文件重載operatorvoid*

,遇到文件結(jié)束符EOF時(shí)(Ctrl+Z),返回一個(gè)空指針。使用“<<”向文件中寫入數(shù)據(jù)ofstream

的析構(gòu)函數(shù)被自動(dòng)調(diào)用,隱式地關(guān)閉文件重載operatorvoid*,遇到文件結(jié)束符EOF時(shí)Topics17.1Introduction17.2TheDataHierarchy17.3FilesandStreams17.4CreatingaSequentialFile17.5ReadingDatafromaSequentialFile17.6Input/OutputofObjectsTopics17.1Introduction17.5ReadingDatafromaSequentialFile創(chuàng)建

ifstream

對(duì)象ifstream構(gòu)造函數(shù)AfilenameAfile-openmodeios::in

缺省模式,只能從文件讀取數(shù)據(jù),最小權(quán)限原則例:ifstream

inClientFile("clients.dat",ios::in);對(duì)于已經(jīng)存在的ifstream對(duì)象,使用成員函數(shù)打開(kāi)文件例:ifstream

inClientFile;

inClientFile.open("clients.dat",ios::in);17.5ReadingDatafromaSequeFig17_07.cpp

Fig17_07.cppOpenclients.datforinput重載operatorvoid*

,returns,遇到文件結(jié)束符,返回一個(gè)空指針。重載!:如果文件打開(kāi)不成功,返回falseifstream的析構(gòu)函數(shù)隱式調(diào)用,關(guān)閉文件Openclients.datforinput重載oOutlineFig17_07.cpp

(3of3)OutlineFig17_07.cpp17.5ReadingDatafromaSequentialFile--順序文件的讀取示例題目要求:簡(jiǎn)單文件的寫、讀、查找17.5ReadingDatafromaSeque讀寫文件#include<iostream>usingstd::cerr;usingstd::cout;usingstd::endl;usingstd::ios;#include<fstream>//filestreamusingstd::ofstream;//outputfilestreamusingstd::ifstream;#include<cstdlib>#include<cstring>intmain(){

ofstreamfout; fout.open("output.txt"); if(!fout) {cerr<<"Filecouldnotbeopened"<<endl; exit(1); } intnum=150; charname[]="JohnDoe"; fout<<num<<"\n"; fout<<name<<"\n";

fout.close();

ifstreamfin("output.txt");intnumber;charname2[20];fin>>number;fin.ignore();fin.getline(name2,'\n');//fin>>number>>name2;cout<<number<<""<<name2<<endl;strcpy(name2,"aaaabbb");cout<<"nowname2="<<name2<<endl;fin.seekg(5);fin.getline(name2,'\n');cout<<"newname2="<<name2<<endl;return0;}在Windows平臺(tái)下如果以“文本”方式打開(kāi)文件,當(dāng)讀取文件的時(shí)候,系統(tǒng)會(huì)將所有的"\r\n"轉(zhuǎn)換成"\n";當(dāng)寫入文件的時(shí)候,系統(tǒng)會(huì)將"\n"轉(zhuǎn)換成"\r\n"寫入。如果以"二進(jìn)制"方式打開(kāi)文件,則讀/寫都不會(huì)進(jìn)行這樣的轉(zhuǎn)換。讀寫文件#include<iostream>ifstrea17.5ReadingDatafromaSequentialFile--順序文件的讀取示例題目要求:實(shí)現(xiàn)文件的復(fù)制17.5ReadingDatafromaSequeintmain()//實(shí)現(xiàn)從源文件到目的文件的復(fù)制{charch;ifstreamsfile("d:\\Ex\\in.cpp");ofstreamdfile(“e:\\out.cpp");//只能創(chuàng)建文件,不能建立子目錄,如路徑不存在則失敗

if(!sfile){cout<<"不能打開(kāi)源文件:"<<"d:\\Ex\\in.cpp"<<endl;return-1;}if(!dfile){cout<<"不能打開(kāi)目標(biāo)文件:"<<"e:\\out.cpp"<<endl;return-1;}sfil

溫馨提示

  • 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)論