




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、習題:習題: 見計算機中心見計算機中心實驗:實驗: 1. 習題調試并上傳習題調試并上傳 2. 繼續(xù)繼續(xù)MFC作業(yè),注意作業(yè),注意15周要驗收周要驗收預習:預習: 9.4、9.6節(jié)節(jié)第第9章輸入章輸入/輸出流類庫(要求)輸出流類庫(要求)(1)理解)理解C+的基本流類體系;的基本流類體系;(2)提高標準輸入)提高標準輸入/輸出的健壯性;輸出的健壯性;(3)掌握提取與插入運算符的重載)掌握提取與插入運算符的重載(4)掌握文件的輸入)掌握文件的輸入/輸出:輸出: 文件的打開與關閉,文本文件與二進制文件、文件的隨機訪問。文件的打開與關閉,文本文件與二進制文件、文件的隨機訪問。(5)掌握在構造函數中通過
2、文件建立對象,在析構函數中由文件保)掌握在構造函數中通過文件建立對象,在析構函數中由文件保存對象的技術。存對象的技術。 注:本章注:本章9.5節(jié)不要求節(jié)不要求幾何形體的派生關系如下:幾何形體的派生關系如下:對平面形體有長和面積,對立體有表面積和體積,對幾何圖形基類,對平面形體有長和面積,對立體有表面積和體積,對幾何圖形基類,周長、面積和體積應怎樣計算(用什么函數)周長、面積和體積應怎樣計算(用什么函數)? ?對平面圖形體積怎對平面圖形體積怎樣計算(用什么函數)?對立體圖形周長怎么計算(用什么函數)樣計算(用什么函數)?對立體圖形周長怎么計算(用什么函數)? ?要求實現運行時的多態(tài)性。要求實現運
3、行時的多態(tài)性。 class Geometric_shape / /幾何圖形幾何圖形public:virtual double perimeter()=0;/ /周長周長virtual double area()=0;/ /面積面積virtual double volume()=0;/ /體積體積virtual void Show();class Rectangle:public Geometric_shape / /矩形矩形double width,length;public:Rectangle()width=0; length=0; / /長寬長寬Rectangle(double wid,d
4、ouble len)width = wid;length= len;double perimeter()return 2.0*(width+length); / /周長周長double area()return width*length;/ /面積面積double volume()return 0;/ /體積體積void Show()coutwidth=widthtlength=“ lengthShow();cout矩形周長矩形周長:perimeter()t;cout矩形面積矩形面積:area()t;cout矩形體積矩形體積:volume()Show();cout長方體底周長長方體底周長:pe
5、rimeter()t;cout長方體底面積長方體底面積:area()t;cout長方體體積長方體體積:volume() ),向流中添,向流中添加數據的操作稱為插入操作加數據的操作稱為插入操作( )。 C+提供了兩種類型的流:提供了兩種類型的流:文本流和二進制流。文本流和二進制流。 文本流文本流是一串是一串ASCII字符。字符。 (如源程序文件和文本文(如源程序文件和文本文件件,文字處理軟件產生的數據文件),文本流可以直接輸文字處理軟件產生的數據文件),文本流可以直接輸出到顯示器或送到打印機上打印。出到顯示器或送到打印機上打印。 二進制流二進制流是將數據以二進制形式存放的,這種流在數是將數據以二
6、進制形式存放的,這種流在數據傳輸時不需作任何變換。據傳輸時不需作任何變換。C+的輸入與輸出包括以下的輸入與輸出包括以下3方面的內容方面的內容: : (1 1) 對系統指定的標準設備的輸入和輸出。(標準對系統指定的標準設備的輸入和輸出。(標準I/O)(2 2) 以外存磁盤文件為對象進行輸入和輸出。(文件以外存磁盤文件為對象進行輸入和輸出。(文件I/O)(3 3) 對內存中指定的空間進行輸入和輸出。(串對內存中指定的空間進行輸入和輸出。(串I/O)最重要的三個輸出流是最重要的三個輸出流是: : ostream /通用輸出流類通用輸出流類 ofstream /輸出文件流類輸出文件流類 ostrstr
7、eam /輸出字符串流類輸出字符串流類9.1 C+的基本流類體系的基本流類體系ios為抽象類,析構函為抽象類,析構函數是虛函數,標準數是虛函數,標準C中構中構造函數為保護的;而造函數為保護的;而VC+中有一個構造函數中有一個構造函數ios (streambuf*)為公有。為公有。圖圖9.1 輸入輸入/輸出流類派生體系輸出流類派生體系 ios streambuf istream ostreamistream_withassigniostreamostream_withassigniostream_withassign指針成員指針成員用來管理緩沖區(qū)用來管理緩沖區(qū) 在在C+中,輸入輸出流被定義為類。
8、中,輸入輸出流被定義為類。C+的的I/O庫中的庫中的類稱為流類類稱為流類(stream class)。用流類定義的對象稱為流對象。用流類定義的對象稱為流對象。 cout和和cin是是iostream類的對象,類的對象,1. iostream類庫中有關的類類庫中有關的類 C+編譯系統提供了用于輸入輸出的編譯系統提供了用于輸入輸出的iostream類庫。類庫。在在iostream類庫中包含許多用于輸入輸出的類。類庫中包含許多用于輸入輸出的類。2. 與與iostream類庫有關的頭文件類庫有關的頭文件 #include命令包含了有關的頭文件就相當于在本程序命令包含了有關的頭文件就相當于在本程序中聲明
9、了所需要用到的類,中聲明了所需要用到的類, 頭文件是程序與類庫的接口。頭文件是程序與類庫的接口。 iostream類庫的接口分別由不同的頭文件來實現。常類庫的接口分別由不同的頭文件來實現。常用的有:用的有:iostream包含了對輸入輸出流進行操作所需的基本信息。包含了對輸入輸出流進行操作所需的基本信息。fstream用于用戶管理的文件的用于用戶管理的文件的I/O操作。操作。strstream用于字符串流用于字符串流I/O。stdiostream用于混合使用用于混合使用C和和C+的的I/O機制時。機制時。iomanip在使用格式化在使用格式化I/O時應包含此頭文件。時應包含此頭文件。3. 在在
10、iostream頭文件中定義的流對象頭文件中定義的流對象C+流類庫中定義了四個全局流對象:流類庫中定義了四個全局流對象:cin、cout、cerr、clog注:注:使用這些對象時必須包含使用這些對象時必須包含iostream頭文件。頭文件。 cin是是istream的派生類的派生類istream_withassign的對象的對象, 稱稱cin流或標準輸入流。從標準輸入設備流或標準輸入流。從標準輸入設備(鍵盤鍵盤)輸入到內存輸入到內存的數據流。的數據流。 cout是是ostream的派生類的派生類ostream_withassign的對象,的對象,稱為稱為cout流或標準輸出流,從內存輸入到標準
11、輸出設備流或標準輸出流,從內存輸入到標準輸出設備(顯示器顯示器) 的數據流。的數據流。 cerr和和clog作用相似,是作用相似,是ostream的派生類的派生類ostream_withassign的對象的對象,稱其為標準錯誤輸出流。稱其為標準錯誤輸出流。 cin、cout、clog 帶緩沖區(qū),緩沖區(qū)由帶緩沖區(qū),緩沖區(qū)由streambuf類對象類對象來管理來管理; cerr不帶緩沖區(qū),一旦錯誤發(fā)生立即顯示。不帶緩沖區(qū),一旦錯誤發(fā)生立即顯示。4. 在在iostream頭文件中重載運算符頭文件中重載運算符 在在istream和和ostream類中分別有一組成員函數對位移類中分別有一組成員函數對位移
12、運算符運算符“”進行重載,以便能用它輸入或輸出各進行重載,以便能用它輸入或輸出各種標準數據類型的數據。種標準數據類型的數據。 對于不同的標準數據類型要分別進行重載。對于不同的標準數據類型要分別進行重載。如如:ostream operator (int ); / /用于向輸出流插入一個用于向輸出流插入一個int數據數據ostream operator (float ); / /用于向輸出流插入一個用于向輸出流插入一個float數據數據ostream operator (char ); / /用于向輸出流插入一個用于向輸出流插入一個char數據數據ostream operator (char *)
13、; / /用于向輸出流插入一個字符串數據用于向輸出流插入一個字符串數據。標準輸出流標準輸出流標準輸出流指:標準輸出流指:流向標準輸出設備流向標準輸出設備( (顯示器顯示器) )的數據。的數據。 cout,cerr和和clog流流1. cout流對象流對象(標準輸出流)標準輸出流)說明:說明:cout不是不是C+預定義的關鍵字,是預定義的關鍵字,是ostream流類的對象,流類的對象,在在iostream中定義。中定義。(2) 用用“cout”輸出基本類型的數據時,可不必考慮數據輸出基本類型的數據時,可不必考慮數據的類型,系統會判斷數據的類型,并根據其類型選擇調用的類型,系統會判斷數據的類型,并
14、根據其類型選擇調用與之匹配的運算符重載函數。與之匹配的運算符重載函數。(3) cout流在內存中對應開辟了一個緩沖區(qū),用來存放流流在內存中對應開辟了一個緩沖區(qū),用來存放流中的數據,當向中的數據,當向cout流插入一個流插入一個endl時,不論緩沖區(qū)是否時,不論緩沖區(qū)是否已滿,都立即輸出流中所有數據,然后插入一個換行符,已滿,都立即輸出流中所有數據,然后插入一個換行符,并刷新流并刷新流(清空緩沖區(qū)清空緩沖區(qū))。(4) (4) 在在iostream中只對中只對“”運算符用于標準類型運算符用于標準類型數據的輸入輸出進行了重載,未對用戶聲明的類型數據數據的輸入輸出進行了重載,未對用戶聲明的類型數據的輸
15、入輸出進行重載。的輸入輸出進行重載。2. cerr流對象(標準錯誤輸出流)流對象(標準錯誤輸出流)作用:作用: 向標準錯誤設備輸出有關出錯信息。向標準錯誤設備輸出有關出錯信息。與與cout流的區(qū)別:流的區(qū)別: cout流通常是傳送到顯示器輸出,也可以被重定向輸流通常是傳送到顯示器輸出,也可以被重定向輸出到磁盤文件,而出到磁盤文件,而cerr流中的信息只能在顯示器輸出。流中的信息只能在顯示器輸出。3. 3. clog流對象(標準錯誤流)流對象(標準錯誤流)作用:作用:和和cerr相同,都是在終端顯示器上顯示出錯信息。相同,都是在終端顯示器上顯示出錯信息。區(qū)別區(qū)別: cerr是不經過緩沖區(qū),直接向
16、顯示器上輸出有關信是不經過緩沖區(qū),直接向顯示器上輸出有關信 息,息,clog中的信息存放在緩沖區(qū)中,緩沖區(qū)滿后或中的信息存放在緩沖區(qū)中,緩沖區(qū)滿后或 遇遇endl時向顯示器輸出。時向顯示器輸出。9.3 標準設備的輸入標準設備的輸入/ /輸出輸出標準設備輸入需注意以下幾點,以避免錯誤:標準設備輸入需注意以下幾點,以避免錯誤:1. cin為緩沖流。鍵盤輸入的數據保存在緩沖區(qū)中,程序從緩為緩沖流。鍵盤輸入的數據保存在緩沖區(qū)中,程序從緩沖區(qū)中逐個提取數據。只有緩沖區(qū)中數據用完才會再次要求輸入數沖區(qū)中逐個提取數據。只有緩沖區(qū)中數據用完才會再次要求輸入數據,而不可能用刷新來清除緩沖區(qū)。據,而不可能用刷新來
17、清除緩沖區(qū)。3. 輸入的數據類型應當與要提取的數據類型一致或相容,否則輸入的數據類型應當與要提取的數據類型一致或相容,否則出錯。而出錯只是對流的狀態(tài)字出錯。而出錯只是對流的狀態(tài)字state的對應位置位(置的對應位置位(置1),程序),程序將繼續(xù)運行。所以要提高健壯性,就必須在編程中加入對狀態(tài)字將繼續(xù)運行。所以要提高健壯性,就必須在編程中加入對狀態(tài)字state的判斷。的判斷。2. 空格和回車都可以作為數據之間的分格符,所以多個數據可空格和回車都可以作為數據之間的分格符,所以多個數據可以在一行輸入,也可以分行輸入。但如果是以在一行輸入,也可以分行輸入。但如果是字符型和字符串字符型和字符串,則,則空
18、空格格(ASCII碼為碼為32)無法用無法用cin輸入輸入,字符串中也不能有空格。回車,字符串中也不能有空格?;剀嚪矡o法讀入。符也無法讀入。與格式控制類似,與格式控制類似, ios中說明了一個枚舉類型來描述輸入輸出中說明了一個枚舉類型來描述輸入輸出的狀態(tài)狀態(tài)字的狀態(tài)狀態(tài)字state為為整型,其它的各位在整型,其它的各位在ios中說明:中說明: enum ios_state goodbit=0 x00, /流正常流正常 eofbit=0 x01, /輸入流結束忽略后繼提取操作;或文件結束已無數據可取輸入流結束忽略后繼提取操作;或文件結束已無數據可取 failbit=0 x02,/最近的最近的I
19、/O操作失敗操作失敗,流可恢復流可恢復 badbit=0 x04,/最近的最近的I/O操作非法操作非法,流可恢復流可恢復 hardfail=0 x08 / I/O出現致命錯誤,流不可恢復,出現致命錯誤,流不可恢復,VC+不支持不支持 ;ios中定義一個整型數據成員中定義一個整型數據成員state來記錄狀態(tài),通過來記錄狀態(tài),通過一些接口函數來讀取和設置輸入輸出的狀態(tài)。一些接口函數來讀取和設置輸入輸出的狀態(tài)。讀取狀態(tài)的有關操作如下:讀取狀態(tài)的有關操作如下:inline int ios:rdstate() const return state; / /讀取狀態(tài)字讀取狀態(tài)字inline int ios
20、:operator!() constreturn state&(badbit|failbit); /可用操作符可用操作符!()代替代替fail()inline int ios:bad() return state & badbit; / /返回非法操作位返回非法操作位inline void ios:clear(int _i) lock();state=_i;unlock(); / /人工設置狀態(tài)人工設置狀態(tài), ,可用來清狀態(tài)可用來清狀態(tài)inline int ios:eof() const return state&eofbit; / /返回流返回流( (文件文件) )結束位結束位inline
21、int ios:fail() constreturn state&(badbit|failbit); / /返回操作非法和操作失敗這兩返回操作非法和操作失敗這兩位位inline int ios:good() constreturn state=0; / /正常返回正常返回1, 1,否則返回否則返回0 0【例【例9.3】提高輸入的健壯性?!刻岣咻斎氲慕研?。int main() char str256; int i; cout請輸入整數請輸入整數:i; ; / /可故意輸入一個非數字字符可故意輸入一個非數字字符, ,下次再輸入若干字符加數字串加若干非數字字符進行檢測下次再輸入若干字符加數字串加若
22、干非數字字符進行檢測 while(cin.fail() / /鍵盤操作非法和操作失敗鍵盤操作非法和操作失敗 cout狀態(tài)字為狀態(tài)字為:cin.rdstate()endl; / /讀取狀態(tài)字讀取狀態(tài)字 cin.clear(0); / /清理狀態(tài)清理狀態(tài) cin.getline(str,255); / /讀空緩沖區(qū)讀空緩沖區(qū) cout輸入錯誤輸入錯誤, ,請重新輸入整數請重新輸入整數i; cin.getline(str,256); / /讀空緩沖區(qū)讀空緩沖區(qū), ,吃掉回車符吃掉回車符 cout請輸入字符串請輸入字符串endl; cin.getline(str,255); cout輸入整數為輸入整數
23、為:iendl; cout輸入字符串為輸入字符串為:strendl; return 0;函數函數getline( )作用作用:從輸入流中讀取一行字符。從輸入流中讀取一行字符。 格式:格式: cin.getline(字符數組字符數組( (或字符指針或字符指針) ),字符個數,字符個數n n,終止標志字符,終止標志字符) 運算符重載函數作為類成員函數和友元函數運算符重載函數作為類成員函數和友元函數重載為類的成員函數的一般格式:重載為類的成員函數的一般格式: 函數類型函數類型 operator 運算符名稱運算符名稱 (形參表列形參表列) 函數體函數體 運算符重載形式有兩種:重載為類的成員函數,重載運
24、算符重載形式有兩種:重載為類的成員函數,重載為類的友元函數為類的友元函數 重載為類的友元函數的一般格式:重載為類的友元函數的一般格式: friend 函數類型函數類型 operator 運算符運算符(參數列表參數列表) 函數體函數體 l重載為類成員函數時重載為類成員函數時 參數個數參數個數 = = 原操作數個數原操作數個數-1 -1 (后置(后置+、- -除外)除外)l重載為友元函數時重載為友元函數時 參數個數參數個數=原操作數個數原操作數個數【例【例9.6】用戶定義的復數類型用戶定義的復數類型Complex的輸入與輸出。的輸入與輸出。#include/using namespace std;
25、 (vc6.0環(huán)境在重載環(huán)境在重載時時,不能使用命名空間不能使用命名空間)class Complex double Real,Image;public: Complex(double r=0.0, double i=0.0):Real(r),Image(i) friend ostream&operator(istream&s,Complex&a); / /流類作為形式參數必須是引用流類作為形式參數必須是引用;ostream&operator(ostream&s,const Complex &z) return s(z.Real,z.Image(istream&s,Complex &a) dou
26、ble re=0,im=0; char c=0; sc; if(c=() / /是否由括號開始是否由括號開始 srec; / /實部實部 if(c=,) simc; / /虛部虛部 if(c!=) s.clear(ios:failbit); / /漏了括號給一個操作失敗標志漏了括號給一個操作失敗標志 else / /無括號無括號 sre; / /實數實數 if(s) a=Complex(re,im); / /流流s s正常時,則復制正常時,則復制 return s;int main()Complex a,b,c;cout輸入一個實數輸入一個實數a;cout輸入一個用括號括起來的實數輸入一個用括
27、號括起來的實數b;cout“輸入一個用括號括起來的復數輸入一個用括號括起來的復數c;couta=atb=bt c=cn;return 0;(1)插入符和提取符應重載為類的友元。插入符和提取符應重載為類的友元。(2)插入符和提取符重載格式如下:插入符和提取符重載格式如下:ostream& operator( istream& s, type& p )/操作代碼操作代碼return s; 其中左操作數是對其中左操作數是對ostream或或istream對象的引用,對象的引用,右操作數接收將被輸出或輸入的對象。右操作數接收將被輸出或輸入的對象。(3)對重載的插入符或提取符的調用形式如下:對重載的插入
28、符或提取符的調用形式如下: ostreamobj;9.4 文件的輸入與輸文件的輸入與輸出出文件文件: : 指存儲在外部介質上數據的集合。一批數據是以文件指存儲在外部介質上數據的集合。一批數據是以文件的形式存放在外部介質上的。的形式存放在外部介質上的。本節(jié)中文件主要指的是磁本節(jié)中文件主要指的是磁盤文件。盤文件。文件中數據的組織形式文件中數據的組織形式: : 可分為可分為ASCII文件和二進制文件。文件和二進制文件。字符數據字符數據: 在內存中是以在內存中是以ASCII代碼形式存放的,因此,無論用代碼形式存放的,因此,無論用ASCII文件輸出還是用二進制文件輸出,其數據形式是一文件輸出還是用二進制
29、文件輸出,其數據形式是一樣的。樣的。數值數據數值數據: 在內存中存放是不同的(存放字節(jié)不同)。在內存中存放是不同的(存放字節(jié)不同)。例:例:有一個長整數有一個長整數100000,在內存中占,在內存中占4個字節(jié),如果按個字節(jié),如果按內部格式直接輸出,在磁盤文件中占內部格式直接輸出,在磁盤文件中占4個字節(jié),如果將它個字節(jié),如果將它轉換為轉換為ASCII碼形式輸出,則要占碼形式輸出,則要占6個字節(jié)。個字節(jié)。C+C+根據文件內容的數據格式,可分為兩類:根據文件內容的數據格式,可分為兩類: 文本文件、二進制文件。文本文件、二進制文件。1 0 0 0 0 0494848 48 48 4800000000
30、00000001 10000110 1010000000110001 00110000 00110000 00110000 00110000 0011000000000000 00000001 10000110 10100000內存中存儲形式內存中存儲形式轉換成轉換成ASCII形式形式二進制形式二進制形式494848484848100000=216+215+210+29+27+25文件使用的過程:文件使用的過程: 要使用一個文件流時,必須在程序中先打開一個文件,要使用一個文件流時,必須在程序中先打開一個文件,目的是將一個文件流類與某一個磁盤文件聯系起來;目的是將一個文件流類與某一個磁盤文件聯系
31、起來; 其后,使用文件流類提供的成員函數,將數據寫入到其后,使用文件流類提供的成員函數,將數據寫入到文件中或從文件中讀取數據;當不再使用該文件流時,關文件中或從文件中讀取數據;當不再使用該文件流時,關閉已打開的文件,將該磁盤文件與文件流類已建立的關系閉已打開的文件,將該磁盤文件與文件流類已建立的關系脫離。脫離。 使用文件的方法可概括為以下幾點:使用文件的方法可概括為以下幾點: (1)說明一個文件流對象。它只能是類)說明一個文件流對象。它只能是類ifstream、ofstream或或fstream的對象。的對象。 例:例: ifstream infile;/ /僅用于輸入僅用于輸入 ofstre
32、am outfile; / /僅用于輸出僅用于輸出 fstream iofile; / /即可輸入又可輸出即可輸入又可輸出(2 2)使用文件流類的成員函數或者構造函數,打開一個)使用文件流類的成員函數或者構造函數,打開一個文件。打開文件的作用是在文件流對象與要使用的文件名文件。打開文件的作用是在文件流對象與要使用的文件名之間建立聯系。之間建立聯系。 例:例: infile.open(“myfile1.txt”); / /文件不存在出錯文件不存在出錯 outfile .open(“myfile2.txt”); / /文件不存在創(chuàng)建一個空文件文件不存在創(chuàng)建一個空文件 iofile .open(“m
33、yfile2.txt”,ios:in); / /文件不存在返回失敗文件不存在返回失?。? 3)使用提取運算符、插入運算符或成員函數對文件進)使用提取運算符、插入運算符或成員函數對文件進行讀寫操作。行讀寫操作。 例:例: infilech; outfilech;(4 4)用完文件后,使用成員函數關閉文件。)用完文件后,使用成員函數關閉文件。 例:例: infile.close();9.4.1 9.4.1 文件的打開與關閉文件的打開與關閉1. 1. 打開磁盤文件打開磁盤文件 打開文件是指在文件讀寫之前做必要的準備工作:打開文件是指在文件讀寫之前做必要的準備工作:為文件流對象和指定的磁盤文件建立關聯
34、,以便使文件為文件流對象和指定的磁盤文件建立關聯,以便使文件 流流向指定的磁盤文件。流流向指定的磁盤文件。(2) 指定文件的工作方式。指定文件的工作方式。 input或或output、ASCII或二進制文件等?;蚨M制文件等??梢酝ㄟ^兩種不同的方法實現??梢酝ㄟ^兩種不同的方法實現。(1) (1) 調用文件流的成員函數調用文件流的成員函數open。如如ofstream outfile; / /定義定義ofstreamofstream類類( (輸出文件流類輸出文件流類) )對象對象outfileoutfileoutfile.open(f1.dat,ios:out); / /使文件流與使文件流與f1
35、.datf1.dat文件建立關聯文件建立關聯調用成員函數調用成員函數open的一般形式為:的一般形式為: 文件流對象文件流對象 . open(磁盤文件名磁盤文件名,輸入輸出方式輸入輸出方式);磁盤文件名可以包括路徑:磁盤文件名可以包括路徑: 如如 :c:newf1.dat 缺省路徑,默認為當前目錄下的文件。缺省路徑,默認為當前目錄下的文件。(2) (2) 在定義文件流對象時指定參數在定義文件流對象時指定參數 可以在定義文件流對象時指定參數,調用文件流類的可以在定義文件流對象時指定參數,調用文件流類的構造函數來實現打開文件的功能。構造函數來實現打開文件的功能。如:如: ostream outfi
36、le(f1.dat,ios:out); 作用與作用與open函數相同。輸入輸出方式是在函數相同。輸入輸出方式是在ios類中定義類中定義的,有多種選擇。的,有多種選擇。關于文件打開方式,關于文件打開方式,ios中定義了一個公有枚舉類型,中定義了一個公有枚舉類型,使用方法與輸入輸出格式控制類似:使用方法與輸入輸出格式控制類似:enum open_mode in=0 x01, /打開文件用于輸入操作打開文件用于輸入操作(從文件讀取從文件讀取),文件指針在文件頭,文件指針在文件頭 out=0 x02, /*打開文件用于寫入文件。如文件不存在,則建立,但指定目打開文件用于寫入文件。如文件不存在,則建立,
37、但指定目 錄必須存在,否則建立文件失敗。如文件存在,未同時設錄必須存在,否則建立文件失敗。如文件存在,未同時設 app,ate,in則文件清空則文件清空*/ ate=0 x04, / /打開文件用于輸入打開文件用于輸入/ /輸出輸出, ,文件指針在文件尾文件指針在文件尾, ,但新數據可寫到任何但新數據可寫到任何 位置位置 app=0 x08, / /打開文件用于輸出打開文件用于輸出, ,但從尾部添加但從尾部添加, ,新數據只能添加在尾部新數據只能添加在尾部 trunce=0 x10, / /打開文件打開文件, ,并清空它并清空它, ,以建立新文件以建立新文件 nocreate=0 x20, /
38、 /如文件存在則打開如文件存在則打開, ,不存在并不創(chuàng)建新文件不存在并不創(chuàng)建新文件 noreplace=0 x40, / /如文件不存在則創(chuàng)建如文件不存在則創(chuàng)建, ,如存在則只能設為如存在則只能設為ate及及app方式方式 binary=0 x80 / /以二進制方式打開文件以二進制方式打開文件; 1. 以以in方式打開的文件,只能從文件中讀取數據。方式打開的文件,只能從文件中讀取數據。 以以out方式打開的文件,只能將數據寫入文件中。單獨方式打開的文件,只能將數據寫入文件中。單獨用該方式打開文件時,若文件不存在,則產生一個空文件;用該方式打開文件時,若文件不存在,則產生一個空文件;若文件存在
39、,則先刪除文件的內容,使其成為一個空文件。若文件存在,則先刪除文件的內容,使其成為一個空文件。 4. ate方式不能單獨使用,要與方式不能單獨使用,要與in、out或或noreplace同時使同時使用,例如,用,例如,out | | ate,作用是在文件打開時,將文件指針,作用是在文件打開時,將文件指針移到文件的結尾處,文件中原來的內容不變,向文件中寫移到文件的結尾處,文件中原來的內容不變,向文件中寫入的數據增加到文件中。入的數據增加到文件中。 3. app是以寫方式打開文件,當文件存在時,它等同于是以寫方式打開文件,當文件存在時,它等同于out | | ate;而當文件不存在時,它等同于而當
40、文件不存在時,它等同于out。 以以trunc方式打開文件時,清空文件,若文件不存在,方式打開文件時,清空文件,若文件不存在,則建立文件,則建立文件,(若單獨使用,與若單獨使用,與out打開文件相同打開文件相同) 。以以nocreate方式打開文件時,若文件不存在時,打開文方式打開文件時,若文件不存在時,打開文件的操作失敗件的操作失敗(打開不成功打開不成功);該方式不單獨使用,總是與;該方式不單獨使用,總是與讀或寫方式同時使用,但它不能與讀或寫方式同時使用,但它不能與noreplace同時使用。同時使用。 noreplace通常用來創(chuàng)建一個新文件,這種方式也不單通常用來創(chuàng)建一個新文件,這種方式
41、也不單獨使用,總是與寫方式同時使用。若與獨使用,總是與寫方式同時使用。若與ate或或app同時使用同時使用時,也可以打開一個已存在的文件。時,也可以打開一個已存在的文件。 不以不以binary方式打開的文件,都是文本文件,只有明確方式打開的文件,都是文本文件,只有明確指定以指定以binary方式打開的文件,才是二進制文件,它總是方式打開的文件,才是二進制文件,它總是與讀或寫方式同時使用。與讀或寫方式同時使用。 說明說明: (1) 每一個打開的文件都有一個文件指針。每一個打開的文件都有一個文件指針。(2)可以用可以用“位或位或”運算符運算符“| |”對輸入輸出方式進行組合。對輸入輸出方式進行組合
42、。 ios:in | | ios:nocreate /打開一個輸入文件,若文件不存在返回打開失敗信息打開一個輸入文件,若文件不存在返回打開失敗信息 ios:in | ios:out | ios:binary /打開一個二進制文件,可讀可寫打開一個二進制文件,可讀可寫(3)如果打開操作失敗,如果打開操作失敗,open函數的返回值為函數的返回值為0(假假),如果,如果是用調用構造函數的方式打開文件的,則流對象的值為是用調用構造函數的方式打開文件的,則流對象的值為0。打開文件完整程序為:打開文件完整程序為: fstream iofile(“myfile.txt”,ios:in|ios:out); i
43、f(!iofile) cout“不能打開文件不能打開文件:myfile.txt”)和插入運算符和插入運算符()進行。進行。通過下面例子可以看出,文本文件讀寫與標準輸入輸通過下面例子可以看出,文本文件讀寫與標準輸入輸出十分相似,原因是出十分相似,原因是C+C+將標準輸入輸出設備就當作文本將標準輸入輸出設備就當作文本文件來處理。文件來處理。 void main() /例例9.7復制文件復制文件。 char ch; ifstream sfile(d:Ex9_6Ex9_6.cpp); ofstream dfile(e:Ex9_6.cpp); / /只能創(chuàng)建文件,不能建立子目錄,如路徑不存在則失敗只能創(chuàng)
44、建文件,不能建立子目錄,如路徑不存在則失敗 if(!sfile) cout不能打開源件不能打開源件:d:Ex9_6Ex9_6.cppendl; return -1; if(!dfile) cout不能打開目標件不能打開目標件:e:Ex9_6.cppch) dfile”)運算符在缺省情況下是跳過)運算符在缺省情況下是跳過空白空白(包括空格,(包括空格,制表,制表,backspace和回車等)的,必須設置關閉跳過空白(如不和回車等)的,必須設置關閉跳過空白(如不設置以這樣復制的文件會缺少一些字符)。設置以這樣復制的文件會缺少一些字符)。2,該程序能確定文件是否,該程序能確定文件是否復制結束復制結束
45、。流類成員函數和運算符全。流類成員函數和運算符全是返回本類型的引用,這里就是流文件對象自身,當文件結束時,是返回本類型的引用,這里就是流文件對象自身,當文件結束時,返回返回NULL,這時不再復制,退出循環(huán)。,這時不再復制,退出循環(huán)。3,復制是,復制是按字節(jié)進行按字節(jié)進行的,效率很低,按字節(jié)傳遞開銷極大,但的,效率很低,按字節(jié)傳遞開銷極大,但該程序能正確復制任意類型的文件,不僅是文本文件(看作按字該程序能正確復制任意類型的文件,不僅是文本文件(看作按字符),二進制文件(看作按字節(jié))也一樣可正確完成。如果是文符),二進制文件(看作按字節(jié))也一樣可正確完成。如果是文本文件,我們可以按行進行拷貝。本文
46、件,我們可以按行進行拷貝。4,!sfile中的中的“ !”是重載的運算符,在狀態(tài)函數中重載,當該操是重載的運算符,在狀態(tài)函數中重載,當該操作出現不正常狀態(tài),返回作出現不正常狀態(tài),返回true。(與狀態(tài)函數與狀態(tài)函數ios:fail()等效)等效)注意:注意:int main() /例輸入輸出文件名從鍵盤獲取例輸入輸出文件名從鍵盤獲取 char filename256,buf100; fstream sfile,dfile; cout輸入源文件路徑名輸入源文件路徑名:filename; sfile.open(filename ,ios:in); / /打開一個已存在的文件打開一個已存在的文件 w
47、hile(!sfile)cout源文件找不到源文件找不到, ,請重新輸入路徑名請重新輸入路徑名:filename;sfile.open( filename,ios:in ); cout輸入目標文件路徑名輸入目標文件路徑名:filename; 對于流,只要出錯,對應流的狀態(tài)標志就設對于流,只要出錯,對應流的狀態(tài)標志就設置為置為1,此后忽略所有對此流對象的操作,必須,此后忽略所有對此流對象的操作,必須用用clear()函數清函數清0,然后才能正常運行。,然后才能正常運行。 dfile.open( filename,ios:out); / /只能創(chuàng)建文件,不能建立子目錄,如路徑不存在則失敗只能創(chuàng)建文
48、件,不能建立子目錄,如路徑不存在則失敗 if(!dfile) cout目標文件創(chuàng)建失敗目標文件創(chuàng)建失敗endl; return -1; while(sfile.getline(buf,100) / /按行拷貝按行拷貝 if(sfile.gcount()100) dfilebufn; /gcount()/gcount()返回最后一次提取的字符數量,包括回車返回最后一次提取的字符數量,包括回車 else dfilebuf; / /本行大于本行大于9999個字符個字符, ,還未讀到回車符還未讀到回車符, ,所以不加所以不加nn sfile.close(); dfile.close(); return
49、 0;文件名作為參數:文件名作為參數:void save( char * file, char * buf)ofstream out;out.open (file);outbuf;outendl;out.close ();int main()char a =abcdefg;save ( .ex.txt, a);return 0;【例例9.9】文本式數據文件的創(chuàng)建與讀取數據。文本式數據文件的創(chuàng)建與讀取數據。class inventory string Description; /種類種類 string No; /型號型號 int Quantity; /數量數量 double Cost; /成本價
50、成本價 double Retail; /零售價零售價public: inventory(string=#,string=0,int=0,double=0,double=0); friend ostream&operator(istream&sour,inventory&iv); ; /流類作為形式參數必須是引用流類作為形式參數必須是引用ostream &operator(ostream&dist,inventory&iv) distlefttiv.Descriptiontiv.No; distrighttiv.Quantitytiv.Cost tiv.Retail(istream&sour,i
51、nventory&iv) souriv.Descriptioniv.Noiv.Quantity iv.Costiv.Retail; return sour;int main() inventory car1(夏利夏利2000,805637928,156,80000,105000),car2; inventory motor1(金城金城125,93612575,302,10000,13000),motor2; ofstream distfile(d:Ex9_9.data); distfilecar1motor1; distfile.close(); coutcar1; coutmotor1; c
52、outcar2; coutcar2motor2; sourfile.close(); coutcar2; coutmotor2; return 0; 文件中的信息不是字符數據,而是字節(jié)中的二進制形文件中的信息不是字符數據,而是字節(jié)中的二進制形式的信息,因此它又稱為字節(jié)文件。式的信息,因此它又稱為字節(jié)文件。用用ios:binary指定為以二進制形式傳送和存儲。指定為以二進制形式傳送和存儲。 二進制文件除了可以作為輸入文件或輸出文件外,還二進制文件除了可以作為輸入文件或輸出文件外,還可以是既能輸入又能輸出的文件。可以是既能輸入又能輸出的文件。1. 用成員函數用成員函數read和和write讀寫二進
53、制文件讀寫二進制文件 用用istream類的成員函數類的成員函數read和和write來實現對二進制文來實現對二進制文件的讀寫。件的讀寫。9.4.3 二進制文件的讀寫二進制文件的讀寫調用的方式:調用的方式: a. write(p1,50); / /將字符指針將字符指針p1p1所給出的地址開始的所給出的地址開始的5050個字節(jié)的內容不加轉換地寫到磁盤文件中個字節(jié)的內容不加轉換地寫到磁盤文件中 b. read(p2,30); / /從從b b所關聯的磁盤文件中讀入所關聯的磁盤文件中讀入3030個字節(jié)(或遇到個字節(jié)(或遇到EOFEOF結束),結束), / /存放在字符指針存放在字符指針p2p2所指的
54、一段空間內所指的一段空間內兩個成員函數的原型:兩個成員函數的原型: istream& read(char *buffer,int len); / /只能按規(guī)定讀取所指定的字符數只能按規(guī)定讀取所指定的字符數 ostream& write(const char * buffer,int len); const: 不允許通過指針改變其指向數據的值不允許通過指針改變其指向數據的值 字符指針字符指針buffer指向內存中一段存儲空間。指向內存中一段存儲空間。 len是讀寫的字節(jié)數。是讀寫的字節(jié)數。讀文件時通常并不知道文件中有多少數據,為便于程讀文件時通常并不知道文件中有多少數據,為便于程序判斷是否已讀到
55、文件尾,序判斷是否已讀到文件尾,ios類中定義了一個成員函數類中定義了一個成員函數ios:eof(),未到文件尾時返回,未到文件尾時返回0,到達文件尾則返回非,到達文件尾則返回非0值。值。例:例: 將一批數據以二進制形式存放在磁盤文件中將一批數據以二進制形式存放在磁盤文件中。#include using namespace std;struct student char name20; int num; int age; char sex;int main( ) student stud3=Li,1001,18,f,Fun, 1002,19,m,Wang,1004,17,f; ofstream
56、 outfile(stud.dat,ios:binary); if(!outfile) cerropen error!endl; abort( ); / /退出程序退出程序 for(int i=0;i3;i+) outfile.write(char*)&studi,sizeof(studi); outfile.close( ); return 0;outfile.write(char*)&stud0,sizeof(stud);該方法可以輸出一批數據該方法可以輸出一批數據強制轉換為強制轉換為字符指針字符指針例:將剛才以二進制形式存放在磁盤文件中的數據例:將剛才以二進制形式存放在磁盤文件中的數據讀
57、入內存并在顯示器上顯示。讀入內存并在顯示器上顯示。#include using namespace std;struct studentstring name; int num; int age; char sex;int main( ) student stud3; int i; ifstream infile(stud.dat,ios:binary); if(!infile) cerropen error!endl; abort( ); / /退出程序退出程序 for(i=0;i3;i+) infile.read(char*)&studi,sizeof(studi); infile.clo
58、se( ); 一次讀入文件中的全部數據:一次讀入文件中的全部數據:infile.read(char*)&stud0,sizeof(stud);for(i=0;i3;i+) coutNO.i+1endl; coutname:endl; coutnum:studi.numendl; coutage:studi.ageendl; coutsex:studi.sexendlendl; return 0; 運行時在顯示器上顯示運行時在顯示器上顯示: :NO.1 NO.2 NO.3name: Li name: Fun name: Wangnum: 1001 num: 1001 num:
59、 1004age: 18 age: 19 age: 17sex: f sex: m sex: f【例】將【例】將1500之間的偶數寫入文件之間的偶數寫入文件data.dat中,再將其顯示在中,再將其顯示在 屏幕上。屏幕上。 #include #includevoid main() ofstream outfile(“data.dat”,ios:binary); if(!outfile) cout“cant open file”endl; exit(1); int n; for(n=2;n=500;n+=2) outfile.write(char*)&n, sizeof(int); outfil
60、e.close(); ifstream infile(“data.dat”,ios:binary); if(!infile)cout“cant open file”endl; exit(1); int a250; infile.read(char*)a,sizeof(int)*250); /從從data.dat中一次讀取中一次讀取249個整數個整數 infile.close(); for(n=0;n249;n+)coutan ; class inventory /例例9.10 string Description; string No; int Quantity; double Cost; d
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45220-2025大規(guī)模定制多主體畫像系統參考架構
- 臨沭租房合同范本
- 2025年梧州貨運從業(yè)資格考題
- 2025年景德鎮(zhèn)貨運從業(yè)資格仿真考題
- 醫(yī)院食堂押金合同范本
- 個人和工廠合作合同范本
- 保健品定購合同范本
- 加工類工程合同范本
- 農業(yè)倉庫出租合同范本
- 債務繼承協議合同范例
- 初中物理競賽及自主招生講義:第7講 密度、壓強與浮力(共5節(jié))含解析
- 高中主題班會 梁文鋒和他的DeepSeek-由DeepSeek爆火開啟高中第一課-高中主題班會課件
- 污水處理設施運維服務投標方案(技術標)
- 一年級下冊書法教案 (一)
- 三年級體育下冊全冊教案
- 2024年八年級語文下冊《經典常談》第一章《說文解字》練習題卷附答案
- 人教版數學六年級下冊全冊核心素養(yǎng)目標教學設計
- 華為基建項目管理手冊
- (研究生)商業(yè)倫理與會計職業(yè)道德ppt教學課件(完整版)
- 論自然(美)愛默生
- (精選)供應室存在問題及整改措施
評論
0/150
提交評論