C程序設(shè)計(jì)文件流_第1頁(yè)
C程序設(shè)計(jì)文件流_第2頁(yè)
C程序設(shè)計(jì)文件流_第3頁(yè)
C程序設(shè)計(jì)文件流_第4頁(yè)
C程序設(shè)計(jì)文件流_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

會(huì)計(jì)學(xué)1C程序設(shè)計(jì)文件流2四.教學(xué)過(guò)程提要文件和文件流的概念文件的打開(kāi)、關(guān)閉和讀寫(xiě)順序文件隨機(jī)文件布置作業(yè)題目和實(shí)驗(yàn)第1頁(yè)/共45頁(yè)3內(nèi)容提要3.11文件流操作第2頁(yè)/共45頁(yè)4先看一個(gè)例子:#include<fstream.h>voidmain()//程序從這里開(kāi)始運(yùn)行{ ofstreamSaveFile("e:\\f1.txt"); SaveFile<<"HelloWorld!"; SaveFile.close();}第3頁(yè)/共45頁(yè)53.11文件流3.11.1

文件的概念和分類(lèi)

文件是指存儲(chǔ)在存儲(chǔ)介質(zhì)上的數(shù)據(jù)的集合。C++將文件看作是由一個(gè)一個(gè)字符(字節(jié))的數(shù)據(jù)順序組成的。按照文件中數(shù)據(jù)的存放形式可以將文件分為:ASCII文件和二進(jìn)制文件。第4頁(yè)/共45頁(yè)6文本文件和二進(jìn)制文件從文件編碼的方式來(lái)看,文件可分為ASCII碼文件和二進(jìn)制碼文件兩種。

ASCII文件也稱(chēng)為文本文件,這種文件在磁盤(pán)中存放時(shí)每個(gè)字符對(duì)應(yīng)一個(gè)字節(jié),用于存放對(duì)應(yīng)的ASCII碼。例如,數(shù)5678的存儲(chǔ)形式為:

ASC碼:00110101001101100011011100111000

↓↓↓↓

十進(jìn)制碼:5

6

7

8共占用4個(gè)字節(jié)。ASCII碼文件可在屏幕上按字符顯示。由于是按字符顯示,因此能讀懂文件內(nèi)容。第5頁(yè)/共45頁(yè)7二進(jìn)制文件是按二進(jìn)制的編碼方式來(lái)存放文件的。例如,數(shù)5678的存儲(chǔ)形式為:0001011000101110只占二個(gè)字節(jié)。二進(jìn)制文件雖然也可在屏幕上顯示,但其內(nèi)容無(wú)法讀懂。C++系統(tǒng)在處理這些文件時(shí),并不區(qū)分類(lèi)型,都看成是字符流,按字節(jié)進(jìn)行處理。輸入輸出字符流的開(kāi)始和結(jié)束只由程序控制而不受物理符號(hào)(如回車(chē)符)的控制。因此也把這種文件稱(chēng)作“流式文件”。第6頁(yè)/共45頁(yè)83.11.2文件的讀寫(xiě)與文件指針

“文件指針”是指表示讀寫(xiě)文件的文件位置指示器。一個(gè)文件指針總是和一個(gè)文件相關(guān)聯(lián),當(dāng)文件每一次打開(kāi)時(shí),文件指針都指向文件的開(kāi)始,隨著對(duì)文件進(jìn)行操作,文件指針不斷地在文件中移動(dòng),并一直指向最新處理的字符(字節(jié))位置。對(duì)文件的讀寫(xiě)操作方式有兩種方式:順序文件操作和隨機(jī)文件操作。第7頁(yè)/共45頁(yè)9C++中與文件處理相關(guān)的類(lèi)及其繼承關(guān)系結(jié)構(gòu)圖iosistreamostreamifstreamiostreamofstreamfstream第8頁(yè)/共45頁(yè)10

文件操作包括打開(kāi)文件、讀寫(xiě)文件和關(guān)閉文件3個(gè)步驟。文件的打開(kāi)和關(guān)閉是通過(guò)使用fstream類(lèi)的成員函數(shù)open和close來(lái)實(shí)現(xiàn)的。fstream類(lèi)的頭文件是fstream.h1.打開(kāi)文件打開(kāi)文件應(yīng)使用成員函數(shù)open(),該成員函數(shù)的函數(shù)原型為:voidopen(constunsignedchar*szName,intnMode,intnProt=filebuf::openprot);第9頁(yè)/共45頁(yè)11其中:szName是一個(gè)字符型指針,指定了要打開(kāi)的文件名;nMode指定文件的打開(kāi)方式,見(jiàn)表3.11-1。nProt指定了文件的保護(hù)屬性,其取值為:0

Compatibilitysharemode

1

Exclusivemode—nosharing

2

Readsharingallowed

3

Writesharingallowed.第10頁(yè)/共45頁(yè)12表3.11-1在ios類(lèi)中定義的文件打開(kāi)方式文件打開(kāi)方式含義ios::in以輸入(讀)方式打開(kāi)文件ios::out以輸出(寫(xiě))方式打開(kāi)文件ios::app打開(kāi)一個(gè)文件使新的內(nèi)容始終添加在文件的末尾ios::ate打開(kāi)一個(gè)文件使新的內(nèi)容添加在文件尾,但下一次添加時(shí),寫(xiě)在當(dāng)前位置處ios::trunc若文件存在,則清除文件所有內(nèi)容;若文件不存在,則創(chuàng)建新文件ios::binary以二進(jìn)制方式打開(kāi)文件,缺省時(shí)以文本方式打開(kāi)文件ios::nocreat打開(kāi)一個(gè)已有文件,若該文件不存在,則打開(kāi)失敗ios::noreplace若打開(kāi)的文件已經(jīng)存在,則打開(kāi)失敗第11頁(yè)/共45頁(yè)13打開(kāi)文件例子:fstreamf1;f1.open("d:\\vc\\test1.txt",ios::in);fstreamf2;f2.open("d:\\vc\\test2.txt",ios::out|ios::trunc);第12頁(yè)/共45頁(yè)14幾點(diǎn)說(shuō)明:(1)在實(shí)際使用過(guò)程中,可根據(jù)需要將以上打開(kāi)文件的方式用“|”組合起來(lái)。如:

ios::in|ios::out表示以讀/寫(xiě)方式打開(kāi)文件

ios::in|ios::binary表示以二進(jìn)制讀方式打開(kāi)文件

ios::out|ios::binary表示以二進(jìn)制寫(xiě)方式打開(kāi)文件

ios::in|ios::out|ios::binary表示以二進(jìn)制讀/寫(xiě)方式打開(kāi)文件(2)如果未指明以二進(jìn)制方式打開(kāi)文件,則默認(rèn)是以文本方式打開(kāi)文件。第13頁(yè)/共45頁(yè)152.關(guān)閉文件

在文件操作結(jié)束時(shí)應(yīng)及時(shí)調(diào)用成員函數(shù)close()來(lái)關(guān)閉文件。如:要關(guān)閉的文件對(duì)象名為myfile,則可使用如下語(yǔ)句關(guān)閉文件:

myfile.close();第14頁(yè)/共45頁(yè)163.文件的讀寫(xiě)

在打開(kāi)文件后就可以對(duì)文件進(jìn)行讀寫(xiě)操作了。從一個(gè)文件中讀出數(shù)據(jù),可以使用iostream類(lèi)的get、getline、read成員函數(shù)以及運(yùn)算符“>>”;而向一個(gè)文件寫(xiě)入數(shù)據(jù),可以使用其put、write函數(shù)以及插入符“<<”。第15頁(yè)/共45頁(yè)17iostream的文件操作常用的函數(shù)函數(shù)原型說(shuō)明get(char&ch)從文件中讀取一個(gè)字符getline(char*pch,intcount,chardelim=’\n’)從文件中讀取多個(gè)字符,讀取個(gè)數(shù)由參數(shù)count決定,參數(shù)delim是讀取字符時(shí)指定的結(jié)束符read(char*pch,intcount)從文件中讀取多個(gè)字符,讀取個(gè)數(shù)由參數(shù)count決定put(charch)向文件寫(xiě)入一個(gè)字符write(constchar*pch,intcount)向文件寫(xiě)入多個(gè)字符,字符個(gè)數(shù)由count決定第16頁(yè)/共45頁(yè)183.11.3順序文件的操作

從文件的第一個(gè)字符(字節(jié))開(kāi)始順序地處理到文件的最后一個(gè)字符(字節(jié))。從一個(gè)文件中讀出數(shù)據(jù),可以使用get、getline、read函數(shù)以及提取符“>>”;而向一個(gè)文件寫(xiě)入數(shù)據(jù),可以使用put、write函數(shù)以及插入符“<<”。第17頁(yè)/共45頁(yè)19【例3.11-1】向順序文件的讀寫(xiě)操作#include<iostream.h>#include<fstream.h> //文件操作必須的頭文件voidmain(){ fstreamfile1; //定義一個(gè)fstream類(lèi)的對(duì)象用于讀

file1.open("Ex_DataFile.txt",ios::in); if(!file1) { cout<<"Ex_DataFile.txt不能打開(kāi)!\n"; return; } fstreamfile2; //定義一個(gè)fstream類(lèi)的對(duì)象用于寫(xiě)

file2.open("Ex_DataFileBak.txt",ios::out|ios::trunc);第18頁(yè)/共45頁(yè)20 if(!file2) { cout<<"Ex_DataFileBak.txt不能創(chuàng)建!\n"; file1.close(); return; }charch;while(file1.get(ch)) //或:file1.read(&ch,1){ cout<<ch; file2.write(&ch,1);//或:file2<<ch} file2.close();//不要忘記文件使用結(jié)束后要及時(shí)關(guān)閉

file1.close();}第19頁(yè)/共45頁(yè)21【例3.11-2

】有一個(gè)整型數(shù)組,含10個(gè)元素,從鍵盤(pán)輸入10個(gè)整數(shù)給數(shù)組,將此數(shù)組存到磁盤(pán)文件中.#include“fstream.h”intmain(){inta[10];ofstreamoutfile("f1.dat",ios::out); //定義文件流對(duì)象,打開(kāi)磁盤(pán)文件″f1.dat″if(!outfile)//如果打開(kāi)失敗,outfile返回0值

{cout<<"openerror!"<<endl;return(1);}第20頁(yè)/共45頁(yè)22

cout<<"enter10integernumbers:"<<endl;for(inti=0;i<10;i++){cin>>a[i];outfile<<a[i]<<"

";//向磁盤(pán)文件輸出數(shù)據(jù)

}outfile.close();//關(guān)閉磁盤(pán)文件″f1.dat″return0;}第21頁(yè)/共45頁(yè)23運(yùn)行情況如下:enter10integernumbers請(qǐng)注意:在向磁盤(pán)文件輸出一個(gè)數(shù)據(jù)后,要輸出一個(gè)(或幾個(gè))空格或換行符,以作為數(shù)據(jù)間的分隔,否則以后從磁盤(pán)文件讀數(shù)據(jù)時(shí),10個(gè)整數(shù)的數(shù)字連成一片無(wú)法區(qū)分。第22頁(yè)/共45頁(yè)24【例3.11_3】從例3.11_2建立的數(shù)據(jù)文件f1.dat中讀入10個(gè)整數(shù)放在數(shù)組中,找出并輸出10個(gè)數(shù)中的最大者和它在數(shù)組中的序號(hào)。#include“fstream.h”intmain(){inta[10],max,i,order;ifstreaminfile(“f1.dat”,ios::in|ios::nocreate);//定義輸入文件流對(duì)象,以輸入方式打開(kāi)磁盤(pán)文件f1.datif(!infile){cout<<“openerror!”<<endl;return(1);}

第23頁(yè)/共45頁(yè)25for(i=0;i<10;i++){infile>>a[i]; //從磁盤(pán)文件讀入10個(gè)整數(shù),順序存放在a數(shù)組中

cout<<a[i]<<"″; }//在顯示器上順序顯示10個(gè)數(shù)

cout<<endl;max=a[0];order=0;第24頁(yè)/共45頁(yè)26for(i=1;i<10;i++)if(a[i]>max){max=a[i];//將當(dāng)前最大值放在max中

order=i;//將當(dāng)前最大值的元素序號(hào)放在order中

}cout<<″max=″<<max<<endl<<″order=″<<order<<endl;infile.close();return0;}第25頁(yè)/共45頁(yè)273.11.4隨機(jī)文件操作

隨機(jī)文件操作,即在文件中通過(guò)C++相關(guān)的函數(shù)移動(dòng)文件指針,并指向所要處理的字符(字節(jié))。(1)在istream類(lèi)中提供了3個(gè)操作讀指針的成員函數(shù):istream&istream::seekg(longpos);istream&istream::seekg(longoff,ios::seek_dirdir);streamposistream::tellg();第26頁(yè)/共45頁(yè)28

其中,pos為文件指針的絕對(duì)位置;off為文件指針的相對(duì)偏移量;dir為文件指針的參照位置,其值可能為:ios::cur 文件指針的當(dāng)前位置ios::beg 文件開(kāi)頭ios::end 文件尾

tellg()函數(shù)沒(méi)有參數(shù),它返回一個(gè)long型值,用來(lái)表示從文件開(kāi)始處到當(dāng)前指針位置之間的字節(jié)數(shù)。第27頁(yè)/共45頁(yè)29(2)在ostream類(lèi)中同樣提供了3個(gè)操作寫(xiě)指針的成員函數(shù):ostream&istream::seekp(longpos);ostream&istream::seekp(longoff,dir);streamposistream::tellp();

這3個(gè)成員函數(shù)的含義與前面3個(gè)操作讀指針成員函數(shù)的含義相同,只不過(guò)它們是用來(lái)操作寫(xiě)指針的。第28頁(yè)/共45頁(yè)30【例3.11_4】將一批數(shù)據(jù)以二進(jìn)制形式存放在磁盤(pán)文件中。#include"fstream.h"structstudent{charname[20];intnum;intage;charsex;};intmain(){studentstud[3]={"Li",1001,18,'f',"Fun",1002,19,'m',"Wang",1004,17,'f'};第29頁(yè)/共45頁(yè)31ofstreamoutfile("e:\\stud.dat",ios::binary);if(!outfile){cout<<"openerror!"<<endl;return1;//退出程序

}for(inti=0;i<3;i++)outfile.write((char*)&stud[i],sizeof(stud[i]));outfile.close();return0;}第30頁(yè)/共45頁(yè)32【例3.11_5】將3.11_4以二進(jìn)制形式存放在磁盤(pán)文件中的數(shù)據(jù)讀入內(nèi)存并在顯示器上顯示。#include"fstream.h"structstudent{ charname[20]; intnum; intage; charsex;};intmain(){ studentstud[3]; inti; ifstreaminfile("stud.dat",ios::binary);第31頁(yè)/共45頁(yè)33 if(!infile) { cout<<"openerror!"<<endl; return(0); } for(i=0;i<3;i++) infile.read((char*)&stud[i],sizeof(stud[i])); infile.close(); for(i=0;i<3;i++) { cout<<"NO."<<i+1<<endl; cout<<"name:"<<stud[i].name<<endl; cout<<"num:"<<stud[i].num<<endl;; cout<<"age:"<<stud[i].age<<endl; cout<<"sex:"<<stud[i].sex<<endl<<endl; } return0;}第32頁(yè)/共45頁(yè)34問(wèn)題:如果只想讀出第2個(gè)學(xué)生的信息,如何修改程序?第33頁(yè)/共45頁(yè)35【例3.11_6】重載流輸出輸入運(yùn)算符讀寫(xiě)隨機(jī)文件的#include<iostream.h>#include<iomanip.h>#include<fstream.h>#include<string.h>classCStudent{public: CStudent(char*name,char*id,floatscore=0); voidprint(); friendostream&operator<<(ostream&os,CStudent&stu); friendistream&operator>>(istream&is,CStudent&stu);private: charstrName[10]; //姓名

charstrID[10]; //學(xué)號(hào)

floatfScore; //成績(jī)};第34頁(yè)/共45頁(yè)36續(xù)例3.11_6CStudent::CStudent(char*name,char*id,floatscore){ strncpy(strName,name,10); strncpy(strID,id,10); fScore=score;}voidCStudent::print(){ cout<<endl<<"學(xué)生信息如下:"<<endl; cout<<"姓名:"<<strName<<endl; cout<<"學(xué)號(hào):"<<strID<<endl; cout<<"成績(jī):"<<fScore<<endl;}第35頁(yè)/共45頁(yè)37ostream&operator<<(ostream&os,CStudent&stu){ os.write(stu.strName,10); os.write(stu.strID,10); os.write((char*)&stu.fScore,4); returnos;}istream&operator>>(istream&is,CStudent&stu){ charname[10]; charid[10]; is.read(name,10); is.read(id,10); is.read((char*)&stu.fScore,4); strncpy(stu.strName,name,10); strncpy(stu.strID,id,10); returnis;}續(xù)例3.11_6第36頁(yè)/共45頁(yè)38voidmain(){ CStudentstu1("MaWenTao","99001",88); CStudentstu2("LiMing","99002",92); CStudentstu3("WangFang","99003",89); CStudentstu4("YangYang","99004",90); CStudentstu5("DingNing","99005",80); fstreamfile1; file1.open("student.dat",ios::out|ios::in|ios::binary); file1<<stu1<<stu2<<stu3<<stu4<<stu5; CStudent*one=newCStudent("",""); constintsize=sizeof(CStudent); file1.seekp(size*4); file1>>*one; one->print();續(xù)例3.11_6第37頁(yè)/共45頁(yè)39續(xù)例3.11_6 file1.seekp(size*1); file1>>*one; one->print(); file1.seekp(size*2,ios::cur); file1>>*one; one->print(); file1.close(); deleteone;}第38頁(yè)/共45頁(yè)40續(xù)例3.11_6運(yùn)行結(jié)果如下:程序中,先將五個(gè)學(xué)生記錄保存到文件中,然后移動(dòng)文件指針,讀取相應(yīng)的記錄,最后將數(shù)據(jù)輸出到屏幕上。需要說(shuō)明的是,由于文件流file1既可以讀(ios::in)也可以寫(xiě)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論