c上課PPT課件_第1頁
c上課PPT課件_第2頁
c上課PPT課件_第3頁
c上課PPT課件_第4頁
c上課PPT課件_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1珍惜了,才成長了作文歲月不停流逝,需要珍惜的,又有些什么?題記雨雪紛飛,隱入眉間。我獨自佇立在河邊,望著已經(jīng)結(jié)冰的河面,卻看到了冰下的生機。你,是否也懂得珍惜?小時候,總聽大人們說,成長總要舍棄一些。那時候,我總在想,為什么不可以在珍惜中成長?后來,我長大了,小時候的話也隨風(fēng)飄散,我變了,再也不肯牽父母的手,總以為他們可有可無。直到那一天,父親要出遠門,我想,我該高興。淚,卻漸漸滑落。終于,在我父母詫異的目光下,說出了多年未說出口的那句話:“我愛你。”父親,哭了。我卻抹掉淚水,笑著抱住了他。成長,需要珍惜眼前人。我喜歡看日出。深處的早晨,我愛坐在山頭,看陽光灑滿大地。天,還有些暗,遙遠的天邊

2、,甚至還有幾顆星在閃爍。我靜靜的等著。秋風(fēng)有些蕭瑟。這是我來看日出的第幾日了?好像數(shù)不清了。自從回到故鄉(xiāng),這個習(xí)慣我一直堅持著。望著在風(fēng)中舞動的谷穗,突然有了些許感動,他們與風(fēng)雨拼搏了多少次,才贏得我們一口糧食?我們?yōu)楹芜€不好好珍惜?太陽出來了,谷穗又看到了生命的希望。陽光給經(jīng)受摧殘的林間送來了勃勃生氣。第1010章 輸入輸出流10.1 10.1 文件、流以及C+C+的流類庫* *10.2 10.2 插入與提取運算符的重載10.3 10.3 I/OI/O格式的控制10.4 10.4 磁盤文件的輸入輸出10.10.5 text5 text文件與binarybinary文件* *10.10.6 6

3、 字符串流10.7 10.7 其他輸入輸出控制函數(shù)第1頁/共66頁210.1 10.1 文件、流以及C+C+的流類庫- - 參看書參看書p325p3251 1 流類庫的優(yōu)點流類庫的優(yōu)點 用用C+C+語言自己的支持語言自己的支持I/O I/O 操作的流類庫代替操作的流類庫代替printf printf 函數(shù)族,是一個明顯的進步函數(shù)族,是一個明顯的進步 (1 1)簡明與可讀性)簡明與可讀性 I/O I/O 語句更為簡明,增加了可讀性語句更為簡明,增加了可讀性(2 2)類型安全()類型安全(type safetype safe)所謂類型安全,是指在進行所謂類型安全,是指在進行I/O I/O 操作時不

4、應(yīng)對于參加操作時不應(yīng)對于參加輸入輸出的數(shù)據(jù)在類型上發(fā)生不應(yīng)有的變化輸入輸出的數(shù)據(jù)在類型上發(fā)生不應(yīng)有的變化 (3 3)易于擴充)易于擴充第2頁/共66頁32 2 文件與流的概念 C+ C+語言中的輸入輸出操作語言中的輸入輸出操作( (功能功能) )是由它所預(yù)是由它所預(yù)定義的諸定義的諸I/OI/O流類的一個類庫所提供的。流類的一個類庫所提供的。 1. 1. 流流( (Stream)Stream) 流流( (stream)stream)是一個邏輯概念是一個邏輯概念,它是,它是C+C+語言對語言對所有外部設(shè)備的邏輯抽象,它所有外部設(shè)備的邏輯抽象,它代表的是某種流類類代表的是某種流類類型的一個對象型的一

5、個對象。C+C+的的IOIO系統(tǒng)將每個外部設(shè)備都轉(zhuǎn)系統(tǒng)將每個外部設(shè)備都轉(zhuǎn)換成一個稱為流的邏輯設(shè)備,由流來完成對不同換成一個稱為流的邏輯設(shè)備,由流來完成對不同設(shè)備的具體操作。設(shè)備的具體操作。第3頁/共66頁4 2. 2. 文件( (File)File) 文件文件( (File)File)是一個物理概念是一個物理概念,代表存儲著信息集合的,代表存儲著信息集合的某個某個外部介質(zhì)外部介質(zhì),它是,它是C+C+語言語言對具體設(shè)備的抽象對具體設(shè)備的抽象。如,磁盤。如,磁盤文件,顯示器,鍵盤(又可以分為文本和二進制文件)。文件,顯示器,鍵盤(又可以分為文本和二進制文件)。 所有流所有流( (類對象類對象) )

6、的行為都是相同的,而不同的文件則可的行為都是相同的,而不同的文件則可能具有不同的行為。如,磁盤文件可進行寫也可進行讀操作;能具有不同的行為。如,磁盤文件可進行寫也可進行讀操作;顯示器文件則只可進行寫操作;而鍵盤文件只可進行讀操作。顯示器文件則只可進行寫操作;而鍵盤文件只可進行讀操作。 當程序與一個文件交換信息時,必須通過當程序與一個文件交換信息時,必須通過“打開文件打開文件”的操作將一個文件與一個流的操作將一個文件與一個流( (類對象類對象) )聯(lián)系起來。一旦建立了聯(lián)系起來。一旦建立了這種聯(lián)系,以后對該流這種聯(lián)系,以后對該流( (類對象類對象) )的訪問就是對該文件的訪問,的訪問就是對該文件的

7、訪問,也就是對一個具體設(shè)備的訪問??赏ㄟ^也就是對一個具體設(shè)備的訪問。可通過“關(guān)閉文件關(guān)閉文件”的操作的操作將一個文件與流將一個文件與流( (類對象類對象) )的聯(lián)系斷開。的聯(lián)系斷開。第4頁/共66頁5 3. 3. C+C+的基本流類庫的基本流類庫 在頭文件在頭文件 “ “iostream.h” iostream.h” 中說明中說明( (預(yù)定義預(yù)定義) )了一批了一批基基本流類本流類: : iosios - - 基本流類的基類基本流類的基類; ; istreamistream - - 由由iosios派生,支持輸入派生,支持輸入( (提取提取“”)“”)操作;操作; ostreamostream

8、 - - 由由iosios派生,支持輸出派生,支持輸出( (插入插入“”)“”)操操作;作; iostreamiostream - - 由由istreamistream與與ostreamostream共同派生,支持輸共同派生,支持輸入和輸出雙向操作。入和輸出雙向操作。 第5頁/共66頁6 C+ C+預(yù)定義的流預(yù)定義的流有:有: extern istream extern istream cincin; - ; - 對象對象cincin對應(yīng)于對應(yīng)于鍵盤鍵盤文件文件 extern ostream extern ostream coutcout; - ; - 對象對象coutcout對應(yīng)于對應(yīng)于顯示

9、器顯示器文件文件 extern ostream extern ostream cerrcerr; - ; - 對象對象cerrcerr對應(yīng)于對應(yīng)于顯示器顯示器文件文件 extern ostream extern ostream clogclog; - ; - 對象對象clogclog對應(yīng)于對應(yīng)于顯示器顯示器文件文件 程序中可直接對上述程序中可直接對上述4 4個預(yù)定義流類對象進行讀寫,而個預(yù)定義流類對象進行讀寫,而不必先進行不必先進行“打開文件打開文件”的操作,使用完后也不需要進行的操作,使用完后也不需要進行“關(guān)閉文件關(guān)閉文件”的操作(因為這些流類對象與文件之間的聯(lián)系的操作(因為這些流類對象與文

10、件之間的聯(lián)系是預(yù)定義好的,可認為系統(tǒng)已為每一程序都隱含進行了對它是預(yù)定義好的,可認為系統(tǒng)已為每一程序都隱含進行了對它們的打開與關(guān)閉操作)。們的打開與關(guān)閉操作)。 第6頁/共66頁7 4. C+ 4. C+的文件流類庫的文件流類庫 在頭文件在頭文件“fstream.h”fstream.h”中說明中說明( (預(yù)定義預(yù)定義) )了一批了一批文件流文件流類類,專用于,專用于磁盤文件磁盤文件: : ifstreamifstream - - 由由istreamistream派生,支持從磁盤文件中輸派生,支持從磁盤文件中輸入入( (讀入讀入) )數(shù)據(jù);數(shù)據(jù); ofstreamofstream - - 由由o

11、streamostream派生,支持往磁盤文件中派生,支持往磁盤文件中輸出輸出( (寫出寫出) )數(shù)據(jù);數(shù)據(jù); fstreamfstream - - 由由iostreamiostream派生,支持對磁盤文件進行派生,支持對磁盤文件進行輸入和輸出數(shù)據(jù)的雙向操作。輸入和輸出數(shù)據(jù)的雙向操作。 C+C+中沒有預(yù)定義的文件流中沒有預(yù)定義的文件流( (類對象類對象) ),程序中用到,程序中用到的所有文件流類對象都要進行自定義。的所有文件流類對象都要進行自定義。第7頁/共66頁8* *10.2 10.2 插入與提取運算符的重載 - - 參看書參看書p329p329對自定義類對自定義類complexcompl

12、ex重載輸入輸出運算符重載輸入輸出運算符“”“”“”:#includeclass complex double r; double i;public:complex(double r0=0, double i0=0) r=r0; i=i0; complex operator +(complex c2); complex operator *(complex c2); friend istream& operator (istream& in, complex& com); friend ostream& operator ”operator”用于完成從用于完成從

13、istreamistream類的流類對象類的流類對象inin上上(如對應(yīng)實參可為(如對應(yīng)實參可為cincin,即 指 定 從 鍵 盤 上 ) 輸 入 一 個 復(fù) 數(shù) 的 有 關(guān) 數(shù) 據(jù) 放 入即 指 定 從 鍵 盤 上 ) 輸 入 一 個 復(fù) 數(shù) 的 有 關(guān) 數(shù) 據(jù) 放 入complexcomplex型引用對象型引用對象comcom中;而中;而“operator”operator”則用于實現(xiàn)往則用于實現(xiàn)往ostreamostream類類的流類對象的流類對象outout上(如對應(yīng)實參可為上(如對應(yīng)實參可為coutcout,即指定往屏幕上)輸出即指定往屏幕上)輸出complexcomplex類對象

14、類對象comcom的有關(guān)數(shù)據(jù)。的有關(guān)數(shù)據(jù)。 3.3. 本程序重載的輸入輸出運算符的返回類型均為引用,為的是可使用返回本程序重載的輸入輸出運算符的返回類型均為引用,為的是可使用返回結(jié)果繼續(xù)作左值,也即使返回結(jié)果能起到一個獨立對象(變量)的作用,從而可結(jié)果繼續(xù)作左值,也即使返回結(jié)果能起到一個獨立對象(變量)的作用,從而可使用像使用像“coutc1c2;”coutc1c1c2;”cinc1c2;”這樣的調(diào)用語句。另外,這樣的調(diào)用語句。另外,“operator ”operator ”的第二形參的第二形參comcom也必須被說明成引用也必須被說明成引用“complex& com”complex&

15、amp; com”,目的則是要將輸入數(shù)據(jù)直接賦值給對應(yīng)實參變量(所擁有的存儲空間中)。目的則是要將輸入數(shù)據(jù)直接賦值給對應(yīng)實參變量(所擁有的存儲空間中)。第9頁/共66頁10 complex complex:operator +(complex c2) complex c;c.r=r+c2.r;c.i=i+c2.i;return c; complex complex:operator * (complex c2) complex temp;temp.r=(r*c2.r)-(i*c2.i);temp.i=(r*c2.i)+(i*c2.r);return temp;第10頁/共66頁11istrea

16、m& operator (istream& in, complex& com) incom.rcom.i;return in; /不可缺少,因為函數(shù)返回類型為不可缺少,因為函數(shù)返回類型為“istream&” ostream& operator (ostream& out, complex com) out(com.r, com.i)endl;return out; /不可缺少,因為函數(shù)返回類型為不可缺少,因為函數(shù)返回類型為“ostream&”void main() complex c1(1,1), c2(2,3), c3, res;cou

17、tc1=c1c2=c2;res = c1+c2;coutc1+c2=res;coutc1*c2=c1*c2;第11頁/共66頁12 coutc3; coutc3+c3=c3+c3; /* 注意輸入輸出語句中出現(xiàn)的注意輸入輸出語句中出現(xiàn)的類對象類對象cout以及以及cin正是正是輸入輸入輸出重載函數(shù)中輸出重載函數(shù)中引用型形參引用型形參out以及以及in的對應(yīng)實參的對應(yīng)實參。即是說,。即是說,若使用若使用“coutc1;”它將等同于它將等同于“operatorc3;”則等同于使用則等同于使用“operator(cin, c3);”。 */ 程序執(zhí)行后,屏幕顯示結(jié)果為:程序執(zhí)行后,屏幕顯示結(jié)果為:

18、c1=(1, 1)c2=(2, 3)c1+c2=(3, 4)c1*c2=(-1, 5)Input c3:3 -5c3+c3=(6, -10)第12頁/共66頁1310.3 10.3 I/OI/O的格式控制1 1 格式控制函數(shù)及格式控制符 2 2 I/OI/O格式控制示例 第13頁/共66頁141 1 格式控制函數(shù)及格式控制符 1. 1. iosios類中常用的公有格式控制成員函數(shù)類中常用的公有格式控制成員函數(shù) 在在iosios類中定義了一批公有的類中定義了一批公有的格式控制標志位格式控制標志位以及一些以及一些成員函數(shù),通常先用某些成員函數(shù)來設(shè)置標志位,然后再使用成員函數(shù),通常先用某些成員函數(shù)來

19、設(shè)置標志位,然后再使用另一些成員函數(shù)來進行格式輸出。另外,另一些成員函數(shù)來進行格式輸出。另外,iosios類中還設(shè)置了一個類中還設(shè)置了一個longlong型的數(shù)據(jù)成員用來記錄當前被設(shè)置的格式狀態(tài),該數(shù)據(jù)型的數(shù)據(jù)成員用來記錄當前被設(shè)置的格式狀態(tài),該數(shù)據(jù)成員被稱為成員被稱為格式控制標志字格式控制標志字( (或標志狀態(tài)字或標志狀態(tài)字) )。標志字是。標志字是由格式由格式控制標志位來控制標志位來“合成合成”的。的。 注意,注意,iosios類作為諸多類作為諸多I/OI/O流類的基類,其公有成員函數(shù)流類的基類,其公有成員函數(shù)當然可被各派生類的對象所直接調(diào)用。當然可被各派生類的對象所直接調(diào)用。第14頁/共

20、66頁15 (1) (1) ios:flagsios:flags a.a. 格式一格式一: : long flags( long lFlags ); long flags( long lFlags ); 通過參數(shù)通過參數(shù)lFlagslFlags來重新設(shè)置來重新設(shè)置標志字標志字。 表示各表示各標志位標志位的枚舉常量有的枚舉常量有( (參看參看p235)p235):ios:skipwsios:skipwsios:left ios:left ios:right ios:right .ios:stdioios:stdio 每一枚舉常量值都代表著格式控制標志字中的某一個二進制每一枚舉常量值都代表著格式控

21、制標志字中的某一個二進制位位( (bit)bit),當設(shè)置了某個標志位屬性時,該位將取值當設(shè)置了某個標志位屬性時,該位將取值“1”“1”,否,否則該位取值則該位取值“0”“0”。 第15頁/共66頁16 另外注意,通過另外注意,通過使用位運算符使用位運算符“|”“|”可將多個格式控可將多個格式控制標志位屬性進行制標志位屬性進行“合成合成”。但從使用角度看,。但從使用角度看,所設(shè)置所設(shè)置的標志位屬性不能產(chǎn)生互斥的標志位屬性不能產(chǎn)生互斥。例如,格式控制標志字中設(shè)。例如,格式控制標志字中設(shè)立了三個平行的標志位立了三個平行的標志位( (ios:decios:dec、ios:octios:oct和和io

22、s:hex)ios:hex)用于表示數(shù)制,程序員應(yīng)保障任何時刻只設(shè)置其中的某一用于表示數(shù)制,程序員應(yīng)保障任何時刻只設(shè)置其中的某一個標志位。還有表示對齊標志位的個標志位。還有表示對齊標志位的ios:leftios:left、ios:rightios:right和和i o s : : i n t e r n a li o s : : i n t e r n a l , 以 及 表 示 實 數(shù) 格 式 標 志 位 的以 及 表 示 實 數(shù) 格 式 標 志 位 的ios:scientificios:scientific和和ios:fixedios:fixed,這些互斥屬性也不能同時這些互斥屬性也不能同

23、時設(shè)置。設(shè)置。 b.b. 格式二格式二: : long flags(); long flags(); 返回當前的標志字。返回當前的標志字。 第16頁/共66頁17 (2) ios:setf(2) ios:setf a.a. 格式一格式一: : long setf( long lFlags ); long setf( long lFlags ); 通過參數(shù)通過參數(shù)lFlagslFlags來設(shè)置指定的格式控制標志位。來設(shè)置指定的格式控制標志位。 注意,與注意,與flagsflags函數(shù)的函數(shù)的“替換替換”方式不同,此處為方式不同,此處為“添添加加”方式,即是說,它并不更改其它方式,即是說,它并不更

24、改其它lFlagslFlags不涉及到的那些不涉及到的那些標志位的當前值。標志位的當前值。 b.b. 格式二格式二: : long setf( long lFlags, long lMask );long setf( long lFlags, long lMask ); 設(shè)置指定的格式控制標志位的值(首先將第二參數(shù)設(shè)置指定的格式控制標志位的值(首先將第二參數(shù)lMasklMask所指定的那些位清零,而后用第一參數(shù)所指定的那些位清零,而后用第一參數(shù)lFlagslFlags所給定的值所給定的值來重置這些標志位)。來重置這些標志位)。 第17頁/共66頁18 例如,為保障所設(shè)置的數(shù)制標志位不產(chǎn)生互斥,

25、當要設(shè)例如,為保障所設(shè)置的數(shù)制標志位不產(chǎn)生互斥,當要設(shè)置置16進制時使用:進制時使用: setf(ios:hex, ios:basefield); 其中的其中的ios:basefield為一個在為一個在ios類中定義的公有靜態(tài)類中定義的公有靜態(tài)常量,它的取值為常量,它的取值為ios:dec|ios:oct|ios:hex。 同理,當要設(shè)置對齊標志位為同理,當要設(shè)置對齊標志位為ios:right以及實數(shù)格式以及實數(shù)格式標志位為標志位為ios:fixed,要使用:要使用: setf(ios:right, ios:adjustfield); setf(ios:fixed, ios:floatfiel

26、d); 其 中 用 到 了 公 有 靜 態(tài) 常 量其 中 用 到 了 公 有 靜 態(tài) 常 量i o s : : a d j u s t f i e l d 和和ios:floatfield。 i o s : : a d j u s t f i e l d的取值為的取值為ios:left|ios:right|ios:internal,而而ios:floatfield的取值為的取值為ios:scientific|ios:fixed。 第18頁/共66頁19 (3) ios:unsetf(3) ios:unsetf long unsetf( long lFlags );long unsetf( lo

27、ng lFlags ); 通過參數(shù)通過參數(shù)lFlagslFlags來清除指定的格式控制標志位。來清除指定的格式控制標志位。 (4) (4) ios:fillios:fill char fill( char cFill ); char fill( char cFill ); 將將“填充字符填充字符”設(shè)置為設(shè)置為cFill, cFill, 并返回原并返回原“填充填充字符字符”。 第19頁/共66頁20(5) ios:precision(5) ios:precision int precision( int np );int precision( int np ); 設(shè)置浮點數(shù)精度為設(shè)置浮點數(shù)精度為

28、npnp并返回原精度。當格式為并返回原精度。當格式為ios:scientificios:scientific或或ios:fixedios:fixed時,精度時,精度npnp指小數(shù)點后的指小數(shù)點后的位數(shù),否則指有效數(shù)字。位數(shù),否則指有效數(shù)字。 (6) (6) ios:widthios:width int width( int nw );int width( int nw ); 設(shè)置當前被顯示數(shù)據(jù)的域?qū)捲O(shè)置當前被顯示數(shù)據(jù)的域?qū)抧wnw并返回原域?qū)?。默認并返回原域?qū)?。默認值為值為0 0,將按實際需要的域?qū)掃M行輸出。此設(shè)置只對隨后的,將按實際需要的域?qū)掃M行輸出。此設(shè)置只對隨后的一個數(shù)據(jù)有效,而后系統(tǒng)立

29、刻恢復(fù)域?qū)挒橄到y(tǒng)默認值一個數(shù)據(jù)有效,而后系統(tǒng)立刻恢復(fù)域?qū)挒橄到y(tǒng)默認值0 0。第20頁/共66頁21 2. 2. 常用的輸入輸出格式控制符常用的輸入輸出格式控制符 可直接用于提取和插入算符可直接用于提取和插入算符(“”(“”和和“”)“”)之后,之后,而不像格式控制成員函數(shù)那樣必須被單獨調(diào)用。而不像格式控制成員函數(shù)那樣必須被單獨調(diào)用。 (1) (1) 中含有的無參格式控制符中含有的無參格式控制符( (參看參看p337)p337): . endl. endl. ends. ends. flush. flush. ws. ws. dec. dec. hex. hex. oct. oct第21頁/共6

30、6頁22 中含有的有參格式控制符中含有的有參格式控制符 . setbase( int base ) . setbase( int base ). resetiosflags( long lFlags ). resetiosflags( long lFlags ). setiosflags( long lFlags ). setiosflags( long lFlags ). setfill( char cFill ). setfill( char cFill ). setprecision( int np ). setprecision( int np ). setw( int nw ). s

31、etw( int nw )第22頁/共66頁232 2 I/OI/O格式控制示例 1. 格式控制示例一格式控制示例一 ( flags和和setf等函數(shù)的功能等函數(shù)的功能) #include void main() coutios basefield; /輸出:輸出:112 cout (ios:dec|ios:oct|ios:hex)endl; /輸出:輸出:112 coutios:adjustfield; /輸出:輸出:14 cout (ios:left|ios:right|ios:internal)endl; /輸出:輸出:14 coutios:floatfield; /輸出:輸出:6144

32、 cout (ios:scientific|ios:fixed)endl; /輸出:輸出:6144第23頁/共66頁24/flags將重新設(shè)置標志字,將重新設(shè)置標志字,“替換替換”方式方式 cout.flags(ios:showbase); coutcout.flags()endl; /輸出:輸出:128 cout.flags(ios:showpoint); coutcout.flags()endl; /輸出:輸出:256 cout.unsetf(ios:showpoint); coutcout.flags()endl; /輸出:輸出:0 /setf為為“添加添加”方式方式 cout.setf

33、(ios:showbase); coutcout.flags()endl; /輸出:輸出:128 cout.setf(ios:showpoint); coutcout.flags()endl; /輸出:輸出:384 cout.unsetf(ios:showpoint); coutcout.flags()endl; /輸出:輸出:128 第24頁/共66頁252. 格式控制示例二格式控制示例二 對輸出數(shù)據(jù)的寬度、精度等方面進行設(shè)置與使用。對輸出數(shù)據(jù)的寬度、精度等方面進行設(shè)置與使用。#include void main() cout.width(6); /只管隨后一個數(shù)的域?qū)捴还茈S后一個數(shù)的域?qū)?

34、coutsetw(6)4785setw(8)27.4272endlendl; cout.width(6);cout.precision(3); /當格式為當格式為ios:scientific或或ios:fixed時,浮點數(shù)精度時,浮點數(shù)精度 /np指小數(shù)點后的位數(shù),否則指有效數(shù)字指小數(shù)點后的位數(shù),否則指有效數(shù)字 /此時設(shè)置浮點數(shù)的有效數(shù)字為此時設(shè)置浮點數(shù)的有效數(shù)字為3cout4785setw(8)27.4272endl; 第25頁/共66頁26coutsetw(6)4785setw(8)setprecision(2)27.4272endlendl; / 4785 27 /“setprecisi

35、on(2)”設(shè)置浮點數(shù)的有效數(shù)字設(shè)置浮點數(shù)的有效數(shù)字cout.setf(ios:fixed, ios:floatfield); /今后以定點格式顯示浮點數(shù)今后以定點格式顯示浮點數(shù)(無指數(shù)部分無指數(shù)部分)cout.width(6); cout.precision(3); /當格式為當格式為ios:fixed時,設(shè)置小數(shù)點后的位數(shù)時,設(shè)置小數(shù)點后的位數(shù)cout4785setw(8)27.4272 = 讀寫操作讀寫操作 = = 關(guān)閉文件關(guān)閉文件。 第27頁/共66頁28 “打開文件打開文件”通常通過構(gòu)造函數(shù)自動完成(也可顯式調(diào)通常通過構(gòu)造函數(shù)自動完成(也可顯式調(diào)用成員函數(shù)用成員函數(shù)openopen完

36、成)。完成)?!瓣P(guān)閉文件關(guān)閉文件”通常通過使用通常通過使用“.close();”close();”來顯式完成。來顯式完成。 例例1: 1: ofstream outfile1(myfile1.txt);ofstream outfile1(myfile1.txt); 創(chuàng)建創(chuàng)建ofstreamofstream類的對象類的對象outfile1outfile1;使流類對象使流類對象outfile1outfile1與磁盤文件與磁盤文件 myfile1.txtmyfile1.txt相聯(lián)系;并打開用于相聯(lián)系;并打開用于“寫寫”的磁盤的磁盤文件文件 myfile1.txtmyfile1.txt。 例例2: 2

37、: ofstream outfile1;ofstream outfile1; / /創(chuàng)建創(chuàng)建ofstreamofstream類的對象類的對象outfile1outfile1 outfile1.open(myfile1.txt); outfile1.open(myfile1.txt); / /顯式調(diào)用成員函數(shù)顯式調(diào)用成員函數(shù)openopen來打開文件來打開文件第28頁/共66頁29 二二. 與創(chuàng)建流類對象相關(guān)的三個構(gòu)造函數(shù)與創(chuàng)建流類對象相關(guān)的三個構(gòu)造函數(shù) 1. ifstream:ifstream ifstream( const char* szName, int nMode = ios:in,

38、int nProt = filebuf:openprot ); 參數(shù)參數(shù): (1) szName - 文件名;文件名; (2) nMode - 打開文件的方式。打開文件的方式。 ios:in - 以讀以讀(輸入輸入)為目的打開。為目的打開。 ios:nocreate - 僅打開一個已存在文件。僅打開一個已存在文件。 ios:binary - 打開二進制文件。打開二進制文件。 (3) nProt - 指定所打開文件的保護方式。指定所打開文件的保護方式。第29頁/共66頁30 2. ofstream:ofstream ofstream( const char* szName, int nMode

39、= ios:out, int nProt = filebuf:openprot ); 參數(shù)參數(shù): (1) szName - 文件名;文件名; (2) nMode - 打開文件的方式。打開文件的方式。 ios:out - 以寫以寫(輸出輸出)為目的打開文件。為目的打開文件。 ios:trunc - 若文件存在,則將文件長度截為若文件存在,則將文件長度截為0。 ios:binary - 打開二進制文件。打開二進制文件。 ios:app - 以追加方式打開。以追加方式打開。 . (3) nProt - 指定所打開文件的保護方式。指定所打開文件的保護方式。 第30頁/共66頁31 3. fstream

40、:fstream fstream( const char* szName, int nMode, int nProt = filebuf:openprot ); 參數(shù)含義和用法與參數(shù)含義和用法與ofstream構(gòu)造函數(shù)處相同。構(gòu)造函數(shù)處相同。 三三. 與創(chuàng)建流類對象相關(guān)的三個與創(chuàng)建流類對象相關(guān)的三個open函數(shù)函數(shù) 1. ofstream:open void open( const char* szName, int nMode = ios:out, int nProt = filebuf:openprot ); 2. ifstream:open void open( const char*

41、szName, int nMode = ios:in, int nProt = filebuf:openprot ); 3. fstream:open void open( const char* szName, int nMode, int nProt = filebuf:openprot ); 第31頁/共66頁3210.4.2 使用插入與提取與算符進行I/O操作 - - 參看書參看書p343p343 對文件的對文件的“讀寫操作讀寫操作”通常使用預(yù)定義的通常使用預(yù)定義的類成員函數(shù)類成員函數(shù)來來實現(xiàn)(課本節(jié)介紹),但也可使用繼承而來的實現(xiàn)(課本節(jié)介紹),但也可使用繼承而來的插入和提取運插入和

42、提取運算符算符“”“”和和“”“”operator ”,所以,所以,ifstreamifstream流(類對象)可以使用預(yù)定義的算符流(類對象)可以使用預(yù)定義的算符“”“”來對來對自定義磁盤文件進行自定義磁盤文件進行“讀讀”操作(允許通過派生類對象直操作(允許通過派生類對象直接調(diào)用其基類的公有成員函數(shù));接調(diào)用其基類的公有成員函數(shù)); ofstreamofstream類由類由ostreamostream類所派生類所派生,而,而ostreamostream類中預(yù)定類中預(yù)定義了公有的運算符義了公有的運算符重載函數(shù)重載函數(shù)“operator ”operator ”,所以,所以,ofstreamofs

43、tream流(類對象)可以使用預(yù)定義的算符流(類對象)可以使用預(yù)定義的算符“”“”“”和和“”“”來對自定義磁盤文件來對自定義磁盤文件進行進行“讀讀” ” 與與“寫寫”操作。操作。 還有一點需要注意:使用預(yù)定義的算符還有一點需要注意:使用預(yù)定義的算符“”“”“”來進行來進行“讀讀”操操作時遇空格或換行均結(jié)束一個數(shù)據(jù)相呼應(yīng)。作時遇空格或換行均結(jié)束一個數(shù)據(jù)相呼應(yīng)。 下述下述示例程序示例程序做了如下的做了如下的3 3件事:件事:1)1) 往文件寫數(shù)據(jù);往文件寫數(shù)據(jù);2)2) 往文件尾部追加數(shù)據(jù);往文件尾部追加數(shù)據(jù); 3)3) 從文件讀出數(shù)據(jù)并顯示在從文件讀出數(shù)據(jù)并顯示在屏幕上。屏幕上。 第33頁/共

44、66頁34#include void main() /1) 往文件寫數(shù)據(jù)往文件寫數(shù)據(jù)ofstream outfile1(myfile1.txt); /以以“寫寫”方式打開方式打開outfile1Hello!.CHINA! Nankai_Universityendl; outfile1.close(); /2) 往文件尾部追加數(shù)據(jù)往文件尾部追加數(shù)據(jù) outfile1.open(myfile1.txt, ios:app); /以以“追加追加”方式打開方式打開int x=1212, y=6868;outfile1x ystr1str2; /使用使用“”讀讀(遇空格、換行均結(jié)束遇空格、換行均結(jié)束)in

45、file1x2y2;infile1.close(); 第34頁/共66頁35coutstr1=str1endl;coutstr2=str2endl;coutx2=x2endl;couty2=y2endl; 程序執(zhí)行后的顯示結(jié)果如下:程序執(zhí)行后的顯示結(jié)果如下:str1=Hello!.CHINA!str2=Nankai_Universityx2=1212y2=6868第35頁/共66頁36 4.3 使用類成員函數(shù)對文件流進行操作1 1 類成員函數(shù)getget與putput2 2 類成員函數(shù)readread與writewrite3 3 類成員函數(shù)getlinegetline 第36

46、頁/共66頁371 1 類成員函數(shù)getget與putput- - 參看書參看書p345p345 ostream& put( char ch );ostream& put( char ch );功能:將字符功能:將字符chch寫到自定義文件中。寫到自定義文件中。 istream& get( char& rch );istream& get( char& rch );功能:從自定義文件中讀出功能:從自定義文件中讀出1 1個字符放入引用個字符放入引用rchrch中。中。 注意,注意,putput實際上只是實際上只是ostreamostream類中定義

47、的公有成員類中定義的公有成員函數(shù),當然通過其派生類函數(shù),當然通過其派生類ofstreamofstream的類對象也可以直接的類對象也可以直接對它進行調(diào)用。同理,通過對它進行調(diào)用。同理,通過ifstreamifstream的類對象可以直的類對象可以直接調(diào)用接調(diào)用getget。第37頁/共66頁38 1. 程序示例一程序示例一 從鍵盤輸入任一個字符串,通過從鍵盤輸入任一個字符串,通過put將其寫到自定義磁盤文件將其寫到自定義磁盤文件“putgetfile.txt”中,而后再使用中,而后再使用get從該文件中讀出所寫串并顯示在屏幕從該文件中讀出所寫串并顯示在屏幕上。上。 #include #incl

48、ude void main() /鍵盤輸入字符串,通過鍵盤輸入字符串,通過put將其寫到自定義磁盤文件中將其寫到自定義磁盤文件中char str80;coutInput string:endl;gets(str);ofstream fout(putgetfile.txt); int i=0;while ( stri ) fout.put(stri+); fout.close();cout-endl;第38頁/共66頁39 /而后使用而后使用get從文件中讀出該串顯示在屏幕上從文件中讀出該串顯示在屏幕上char ch;ifstream fin(putgetfile.txt); fin.get(c

49、h);while(!fin.eof() /從頭讀到文件結(jié)束從頭讀到文件結(jié)束(當前符號非文件結(jié)束符時繼續(xù)當前符號非文件結(jié)束符時繼續(xù)) /注注: 成員函數(shù)成員函數(shù)eof()在讀到文件結(jié)束時方返回在讀到文件結(jié)束時方返回true coutch; fin.get(ch);coutendl;fin.close(); 程序執(zhí)行后的顯示結(jié)果如下:程序執(zhí)行后的顯示結(jié)果如下:Input string:File operating - using put and get, OK! 12345-File operating - using put and get, OK! 12345第39頁/共66頁40 2. 程序

50、示例二程序示例二 - 對指定文件進行拷貝對指定文件進行拷貝 使用類成員函數(shù)使用類成員函數(shù)get與與put對指定文件進行拷貝。被拷對指定文件進行拷貝。被拷貝的貝的“源文件源文件”以及拷貝到的以及拷貝到的“目的文件目的文件”的名字與路徑的名字與路徑均由命令行參數(shù)來提供。均由命令行參數(shù)來提供。 程序執(zhí)行結(jié)果程序執(zhí)行結(jié)果(若提供的命令行參數(shù)為若提供的命令行參數(shù)為:mycopy.cpp res_1.cpp): Copy file from mycopy.cpp to res_1.cpp 程序執(zhí)行結(jié)果程序執(zhí)行結(jié)果(若提供的命令行參數(shù)個數(shù)不對時若提供的命令行參數(shù)個數(shù)不對時):ERROR ! - supply

51、ing 2 command-line argements ?!第40頁/共66頁41 #include #include void main(int argc, char* argv) if(argc!=3) /命令行參數(shù)個數(shù)不對時命令行參數(shù)個數(shù)不對時 coutERROR ! - supplying 2 command-line argements ?!endl; exit (1); coutCopy file from argv1 to argv2endl; ifstream fin(argv1); /命令行參數(shù)命令行參數(shù)1作為文件名作為文件名 ofstream fout(argv2); /

52、命令行參數(shù)命令行參數(shù)2作為文件名作為文件名 char ch; fin.get(ch); while(!fin.eof() /從頭讀到文件結(jié)束從頭讀到文件結(jié)束 fout.put(ch); fin.get(ch); fin.close(); fout.close(); 第41頁/共66頁42 2 2 類成員函數(shù)readread與write write - - 參看書參看書p347p347 通常使用通常使用read與與write對二進制文件對二進制文件(binary file)進行讀進行讀寫。寫。 ostream& write( const char* pch, int nCount );

53、功能:將功能:將pch緩沖區(qū)中的前緩沖區(qū)中的前nCount個字符寫出到某個文件個字符寫出到某個文件中。中。istream& read( char* pch, int nCount ); 功能:從某個文件中讀入功能:從某個文件中讀入nCount個字符放入個字符放入pch緩沖緩沖區(qū)中(若讀至文件結(jié)束尚不足區(qū)中(若讀至文件結(jié)束尚不足nCount個字符時,也將立即個字符時,也將立即結(jié)束本次讀取過程)。結(jié)束本次讀取過程)。 注意:使用注意:使用write與與read進行數(shù)據(jù)讀寫時,不必要在數(shù)據(jù)進行數(shù)據(jù)讀寫時,不必要在數(shù)據(jù)間再額外間再額外“插入插入”分割符,這是因為它們都要求提供第二實分割符,這是

54、因為它們都要求提供第二實參來指定讀寫長度。參來指定讀寫長度。第42頁/共66頁43 以下的示例程序先使用以下的示例程序先使用write往自定義二進制磁盤文往自定義二進制磁盤文件中寫出如下件中寫出如下3個個“值值”:字符串:字符串str的長度值的長度值Len(一個正整一個正整數(shù)數(shù))、字符串、字符串str本身、以及一個結(jié)構(gòu)體的數(shù)據(jù),而后再使用本身、以及一個結(jié)構(gòu)體的數(shù)據(jù),而后再使用read讀出這些讀出這些“值值”并將它們顯示在屏幕上并將它們顯示在屏幕上。 #include #include void main() char str20=Hello world!;struct stuchar name

55、20;int age;double score; ss=wu jun, 22, 91.5; 第43頁/共66頁44 coutWRITE to wrt_read_file.binendl;ofstream fout(wrt_read_file.bin, ios:binary); /打開用于打開用于“寫寫”的二進制磁盤文件的二進制磁盤文件int Len=strlen(str);fout.write( (char*)(&Len), sizeof(int) ); fout.write(str, Len); /數(shù)據(jù)間無需分割符數(shù)據(jù)間無需分割符fout.write(char*)(&ss),

56、 sizeof(ss); fout.close();cout-endl;cout- READ it from wrt_read_file.bin -endl;char str280;ifstream fin(wrt_read_file.bin, ios:binary); fin.read( (char*)(&Len), sizeof(int) );fin.read(str2, Len);str2Len=0; 第44頁/共66頁45 fin.read( (char*)(&ss), sizeof(ss) ); coutLen=Lenendl; coutstr2=str2endl;

57、,ss.age,ss.scoreendl; fin.close(); cout-endl; 程序執(zhí)行后的顯示結(jié)果如下:程序執(zhí)行后的顯示結(jié)果如下:WRITE to wrt_read_file.bin- READ it from wrt_read_file.bin -Len=12str2=Hello world!-第45頁/共66頁46 最常用格式為:最常用格式為:istream& getline( char* pch, int nCount, char delim = n ); 功能:從某個文件中讀出一行功能:從某個文件中讀出一行(至多至多nCount個字符個字符)

58、放入放入pch緩沖區(qū)中,缺省行結(jié)束符為緩沖區(qū)中,缺省行結(jié)束符為n。 程序?qū)嵗绦驅(qū)嵗? 讀出讀出“getline_1.cpp”的各行并顯示在屏幕上(如,可的各行并顯示在屏幕上(如,可將本源程序存放在將本源程序存放在“getline_1.cpp“文件中)。文件中)。 3 3 類成員函數(shù)getline getline -參看課本參看課本p349 p349 第46頁/共66頁47 #include void main() char line81; ifstream infile(“getline_1.cpp”); /打開文件用于讀打開文件用于讀 infile.getline(line, 80); /

59、讀出一行讀出一行(至多至多80個字符個字符)放入放入line中中 while(!infile.eof() /尚未讀到文件結(jié)束則繼續(xù)循環(huán)尚未讀到文件結(jié)束則繼續(xù)循環(huán)(處理處理) coutlineendl; /顯示在屏幕上顯示在屏幕上 infile.getline(line,80); /再讀一行再讀一行 infile.close();第47頁/共66頁48 10.5 text文件與文件與binary文件文件- 10.6.1 按用戶設(shè)置的文件形式進行讀寫按用戶設(shè)置的文件形式進行讀寫 * 以以text形式存儲形式存儲,優(yōu)點優(yōu)點是具有較高的兼容性。是具有較高的兼容性。缺點缺點是存儲一批純數(shù)值信息時,要在數(shù)

60、據(jù)之間人為地添加分是存儲一批純數(shù)值信息時,要在數(shù)據(jù)之間人為地添加分割符;輸入輸出過程中,系統(tǒng)要對內(nèi)外存的數(shù)據(jù)格式進割符;輸入輸出過程中,系統(tǒng)要對內(nèi)外存的數(shù)據(jù)格式進行相應(yīng)轉(zhuǎn)換;另外行相應(yīng)轉(zhuǎn)換;另外text文件不便于對數(shù)據(jù)實行隨機訪問。文件不便于對數(shù)據(jù)實行隨機訪問。第48頁/共66頁49 * * 以以binarybinary形式存儲形式存儲,優(yōu)點優(yōu)點是便于對數(shù)據(jù)實行隨機是便于對數(shù)據(jù)實行隨機訪問(每一同類型數(shù)據(jù)所占磁盤空間的大小均相同,不必訪問(每一同類型數(shù)據(jù)所占磁盤空間的大小均相同,不必在數(shù)據(jù)之間人為地添加分割符);輸入輸出過程中,系統(tǒng)在數(shù)據(jù)之間人為地添加分割符);輸入輸出過程中,系統(tǒng)不對數(shù)據(jù)進行任何轉(zhuǎn)換。不對數(shù)據(jù)進行任何轉(zhuǎn)換。缺點缺點是兼容性低。是兼容性低。 注:由程序員決定將數(shù)據(jù)存儲為注:由程序員決定將數(shù)據(jù)存儲為texttext文件或者文件或者binarybinary文文件兩種形式之一

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論