C程序設(shè)計(第二版)第九章流類庫與輸入輸出.ppt
《C程序設(shè)計(第二版)第九章流類庫與輸入輸出.ppt》由會員分享,可在線閱讀,更多相關(guān)《C程序設(shè)計(第二版)第九章流類庫與輸入輸出.ppt(79頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第九章流類庫和輸入/輸出,本章的最主要目的就是把對象保存到磁盤文件中并從磁盤文件重建對象。C++語言中并沒有輸入/輸出語句,而是在標準庫里包含了一個I/O流類庫,它與標準模板庫同為C++標準庫中最重要的組成部分。數(shù)據(jù)從一個對象到另一個對象的傳送被抽象為“流”。數(shù)據(jù)的輸入/輸出就是通過輸入/輸出流來實現(xiàn)的。流是一種抽象的概念,負責在數(shù)據(jù)的產(chǎn)生者和數(shù)據(jù)的使用者之間建立聯(lián)系,并管理數(shù)據(jù)的流動。,,,第九章流類庫和輸入/輸出,9.1C++的基本流類體系,9.3標準設(shè)備的輸入/輸出,9.2輸入輸出的格式控制(選讀),9.4文件的輸入與輸出,9.5字符串流(選讀),,,9.6文件與對象,9.1C++的基本流類體系,流類體系:以抽象類模板basic_ios為基類,流類模板派生體系見圖9.1。整個流類模板體系的標準I/O在頭文件中說明,它包含頭文件、、和。而輸入輸出文件流部分在頭文件中說明。,圖9.1主要輸入/輸出流模板層次,,,,9.1C++的基本流類體系,,,basic_ios類模板提供了對流進行格式化輸入輸出和錯誤處理的成員函數(shù)。所有派生都是公有派生。basic_istream類模板提供完成提?。ㄝ斎耄┎僮鞯某蓡T函數(shù),而basic_ostream類模板提供完成插入(輸出)操作的成員函數(shù)。basic_iostream類本質(zhì)上是前兩者的聚合,并沒有增加成員。派生全部為公有派生。有關(guān)模板派生請參見教學指導書第8章中“類模板的派生的討論”,basic_streambuf不是basic_ios的派生類,而是一個獨立的類,只是basic_ios有一個保護訪問限制的指針指向它。類basic_streambuf的作用是管理一個流的緩沖區(qū)。,流類體系說明:,9.1C++的基本流類體系,標準輸入/輸出流對象:在C++的流類庫中定義了四個全局流對象:cin,cout,cerr和clog??梢酝瓿扇藱C交互的功能。cin標準輸入流對象,鍵盤為其對應的標準設(shè)備。cout標準輸出流對象,顯示器為標準設(shè)備。cerr和clog標準錯誤輸出流,輸出設(shè)備是顯示器。其中cin、cout和clog是帶緩沖區(qū)的,緩沖區(qū)由streambuf類對象來管理。而cerr為非緩沖區(qū)流,一旦錯誤發(fā)生立即顯示。要使用這四個功能,必須包含文件。,,,9.1C++的基本流類體系,重載的提取運算符“>>”(stream_extractionoperator)和插入運算符“<>和<>”或“>”和“>”或“<<”的左操作數(shù);第二個參數(shù)為用戶定義類的引用,作為右操作數(shù)。流用作函數(shù)參數(shù),必須是引用調(diào)用,不能是傳值調(diào)用。因為這里要求處理流本身,而不是副本。,【例9.5】改進自定義字符串類,重載插入運算符“<<”?!纠?.6】用戶定義的復數(shù)類Complex的輸入與輸出。,,9.4文件的輸入與輸出,本節(jié)中文件指的是磁盤文件。C++根據(jù)文件(file)內(nèi)容的數(shù)據(jù)格式,可分為兩類:二進制文件和文本文件。文本文件由字符序列組成,也稱ASCII碼文件,在文本文件中存取的最小信息單位為字符(character),而二進制文件中存取的最小信息單位為字節(jié)(Byte)。,,,,C++把每一個文件都看成一個有序的字節(jié)流,見圖9.2,每一個文件或者以文件結(jié)束符(endoffilemarker)結(jié)束,或者在特定的字節(jié)號處結(jié)束。,文件的基本概念:,9.4文件的輸入與輸出,當打開一個文件時,該文件就和某個流關(guān)聯(lián)起來了。對文件進行讀寫實際上受到一個文件定位指針(filepositionpointer)的控制。輸入流的指針也稱為讀指針,每一次提取操作將從讀指針當前所指位置開始,每次提取操作自動將讀指針向文件尾移動。輸出流指針也稱寫指針,每一次插入操作將從寫指針當前位置開始,每次插入操作自動將寫指針向文件尾移動。,,,,9.4.1文件的打開與關(guān)閉,9.4.2文本文件的讀寫,9.4.3二進制文件的讀寫,9.4.4文件的隨機訪問(選讀),9.4.1文件的打開與關(guān)閉,文件使用步驟:1.說明一個文件流對象,這又被稱為內(nèi)部文件:ifstreamifile;//只輸入用ofstreamofile;//只輸出用fstreamiofile;//既輸入又輸出用,,,,9.4.1文件的打開與關(guān)閉,2.使用文件流對象的成員函數(shù)打開一個磁盤文件。這樣在文件流對象和磁盤文件名之間建立聯(lián)系。文件流中說明了三個打開文件的成員函數(shù)。voidifstream::open(constchar*,int=ios::in,int=filebuf::openprot);voidofstream::open(constchar*,int=ios::out,int=filebuf::opernprot);voidfstream::open(constchar*,int,int=filebuf::openprot);第一個參數(shù)為要打開的磁盤文件名。第二個參數(shù)為打開方式,有輸入(in),輸出(out)等,打開方式在ios基類中定義為枚舉類型。第三個參數(shù)為指定打開文件的保護方式,一般取默認。所以第二步可如下進行:iofile.open(“myfile.txt”,ios::in|ios::out);,,,文件打開方式:是由在ios類中定義的公有枚舉成員決定:enumopen_mode{in=0 x01,out=0 x02,ate=0 x04,app=0 x08,trunc=0 x10,binary=0 x80};,,,9.4.1文件的打開與關(guān)閉,in標識打開文件用于輸入操作(從文件讀取)。打開方式只要含in,如文件不存在則返回失敗。在打開為輸入輸出方式時(同時用out),編程應注意判斷是否失敗,失敗時千萬不可再寫入文件。out標識打開文件用于輸出操作(寫入文件)。如文件不存在,則建立新文件,如文件存在,未同時設(shè)app,in則文件清空。trunc標識打開文件,并清空它(文件長度截為0)。文件不存在則建立新文件,與out默認操作相同。但與in配合,文件不存在則返回失敗。app標識打開文件用于輸出,原文件內(nèi)容保留,新數(shù)據(jù)接在尾部ate意思是atend,標識打開文件,文件指針在文件尾,但文件指針可以移動,即新數(shù)據(jù)可寫到任何位置。文件是否清空由其它標識決定。后三個標識最好配合out、in等一起用,因為不同的C++平臺,要求不同,一起用不會出錯。如不一起用,至少VC++不認這種格式。binary標識以二進制方式打開文件。同時用out時,如文件不存在,則建立新文件,并且新文件能用,不必清狀態(tài)字。,,,打開方式解釋:,9.4.1文件的打開與關(guān)閉,三個文件流類都重載了一個帶默認參數(shù)的構(gòu)造函數(shù),功能與open函數(shù)一樣:ifstream::ifstream(constchar*,int=ios::in,int=filebuf::openprot);ofstream::ofstream(constchar*,int=ios::out,int=filebuf::openprot);fstream::fstream(constchar*,int,int=filebuf::operprot);所以1,2兩步可合成:fstreamiofile(”myfile.txt”,ios::in|ios::out);,,,9.4.1文件的打開與關(guān)閉,打開文件也應該判斷是否成功,若成功,文件流對象值為非零值,不成功為0(NULL),文件流對象值物理上就是指它的地址。因此打開一個文件完整的程序為:fstreamiofile(”myfile.txt”,ios::in|ios::out);if(!iofile){//“!”為重載的運算符,見9.3.1節(jié)cout<<”不能打開文件:”<<”myfile.txt”<>)和插入運算符(>”完成重構(gòu)對象,而只用一個“<<”完成對象存入文件。,,,,9.4.2文本文件的讀寫,文本數(shù)據(jù)文件的讀寫:按C++的常規(guī),資源獲取是由構(gòu)造函數(shù)實現(xiàn),而資源釋放是由析構(gòu)函數(shù)完成。所以與內(nèi)存動態(tài)分配一樣,由文件重構(gòu)對象放在構(gòu)造函數(shù)中,把對象存入文件則放在析構(gòu)函數(shù)中。詳細內(nèi)容見9.6節(jié),更深層次的理由見下一章異常處理?!纠?.9】只是為了更清楚地顯示文件的操作,常規(guī)做法請讀者參見【例9.13】。,,,,9.4.3二進制文件的讀寫,對二進制文件進行讀寫的成員函數(shù):istream//第一個參數(shù)指定輸出對象的內(nèi)存地址,必須強制轉(zhuǎn)換為char*類型//第二個參數(shù)指定插入的字節(jié)數(shù),//函數(shù)從該地址開始將指定數(shù)量的字節(jié)插入輸入輸出流,,,,9.4.3二進制文件的讀寫,文件結(jié)束判斷:讀函數(shù)并不能知道文件是否結(jié)束,可用狀態(tài)函數(shù)intios::eof()來判斷文件是否結(jié)束。必須指出系統(tǒng)是根據(jù)當前操作的實際情況設(shè)置狀態(tài)位,如需根據(jù)狀態(tài)位來判斷下一步的操作,必須在一次操作后立即去調(diào)取狀態(tài)位,以判斷本次操作是否有效。,,,【例9.10】創(chuàng)建二進制數(shù)據(jù)文件,以及數(shù)據(jù)文件的讀取。這兩項操作設(shè)計為成員函數(shù)。給出與【例9.9】不同的讀寫方式:,9.4.3二進制文件的讀寫,,,,二進制文件優(yōu)點:可以控制字節(jié)長度,讀寫數(shù)據(jù)時不會出現(xiàn)二義性,可靠性高。同時不知格式是無法讀取的,保密性好。文件結(jié)束后,系統(tǒng)不會再讀(見eofbit的說明),但程序不會自動停下來,所以要判斷文件中是否已沒有數(shù)據(jù)。如寫完數(shù)據(jù)后沒有關(guān)閉文件,直接開始讀,則必須把文件定位指針移到文件頭。如關(guān)閉文件后重新打開,文件定位指針就在文件頭。,9.4.4文件的隨機訪問(選讀),文件的隨機訪問:在C++中可以由程序控制文件指針的移動,從而實現(xiàn)文件的隨機訪問,即可讀寫流中任意一段內(nèi)容。一般文本文件很難準確定位,所以隨機訪問多用于二進制文件。如【例9.9】中對象中兩個字符串是按實際串長存放的,不是按數(shù)組元素來存放的,而【例9.10】中是按數(shù)組長度來存放的,每個對象數(shù)據(jù)長度固定,所以便于隨機訪問。,,,,在ios類中說明了一個公有枚舉類型:enumseek_dir{beg=0,//文件開頭cur=1,//文件指針的當前位置end=2//文件結(jié)尾};,隨機訪問指針控制字:,9.4.4文件的隨機訪問(選讀),輸入流指針控制字設(shè)置成員函數(shù):istream//表示將文件定位指針從文件尾向文件頭方向移20個字節(jié)。tellg()和seekg()往往配合使用。//指針不可移到文件頭之前或文件尾之后。,,,9.4.4文件的隨機訪問(選讀),輸入流指針控制字設(shè)置成員函數(shù):ostream為了便于記憶,函數(shù)名中g(shù)是get的縮寫,而p是put的縮寫。對輸入輸出文件定位指針只有一個但函數(shù)有兩組,這兩組函數(shù)功能完全一樣。,,,【例9.11】使用隨機訪問對【例9.10】進行改造。,,9.5字符串流(選讀),,,,字符流概念:字符串(string)也可以看作字符流??梢杂幂斎胼敵霾僮鱽硗瓿纱鞯牟僮?。串流與內(nèi)存相關(guān),所以也稱內(nèi)存流。串流類包括ostrstream、istrstream、strstream,它們在中說明。串流類對象可以保存字符,也可以保存整數(shù)、浮點數(shù)。串流類對象采用文本方式。其構(gòu)造函數(shù)常用下面幾個:istrstream::istrstream(constchar*str);istrstream::istrstream(constchar*str,int);ostrstream::ostrstream(char*,int,int=ios::out);strstream::strstream(char*,int,int);其中第二個參數(shù)說明數(shù)組大小,第三參數(shù)為文件打開方式。,【例9.12】,9.6文件與對象,,,,在面向?qū)ο蟮腃++程序設(shè)計中,文件應該在構(gòu)造函數(shù)中打開,并創(chuàng)建對象;而在析構(gòu)函數(shù)中保存和關(guān)閉文件,并撤銷對象。當撤銷對象時,能自動釋放資源。釋放資源包括將對象中的信息再次存入磁盤文件。程序運行中,總要對保存在對象的數(shù)據(jù)成員里的信息進行操作,這時應該將信息適時保存到相應的磁盤文件中,以免數(shù)據(jù)意外丟失。這些都是常規(guī)操作,是面向?qū)ο蟮腃++程序設(shè)計的固定框架。,規(guī)范化操作:在面向?qū)ο蟮某绦蛟O(shè)計中,信息總是放在對象的數(shù)據(jù)成員里。這些信息最終應該保存到文件中。當程序開始運行時要由打開的文件重新創(chuàng)建對象。在運行過程中,放在對象的數(shù)據(jù)成員里的信息得到利用和修改。運行結(jié)束時必須把這些信息重新保存到文件中,然后關(guān)閉文件。,9.6文件與對象,,,,【例9.13】將商店的貨物,定義為一個貨物數(shù)組類。數(shù)組對象動態(tài)建立,初始為2個元素,不夠用時擴充一倍。用文本數(shù)據(jù)文件建立數(shù)組元素對象,要求放在構(gòu)造函數(shù)中,而數(shù)據(jù)的保存和文件的關(guān)閉放在析構(gòu)函數(shù)中。第一次運行時,建立空的數(shù)據(jù)文件,由鍵盤輸入建立數(shù)組元素對象,并寫入文件,程序退出時,關(guān)閉文件;下一次運行由該文件構(gòu)造對象,恢復前一次做過的工作。,這是一個標準的面向?qū)ο蟮某绦蛟O(shè)計,也是對前面各章內(nèi)容的小結(jié)。注意,本例使用了多重的插入運算符重載。,第九章流類庫和輸入/輸出,結(jié)束,謝謝!,9.2輸入輸出的格式控制(選讀),訪問x_flags的重載函數(shù)聲明如下:inlinelongios::flags()const;//返回當前標志字inlinelongios::flags(long);//把參數(shù)作為新的標志字,并返回原標志字(下同)inlinelongios::setf(long,long);//在原標志字上增加控制,//第一個參數(shù)為增加的控制,第二個參數(shù)表示取代原來哪幾位inlinelongios::setf(long);//增加控制(多項)inlinelongios::unsetf(long);//清除指定位上的控制,,9.2輸入輸出的格式控制(選讀),相關(guān)接口函數(shù)為:inlineintios::width()const;//返回當前域?qū)抜nlineintios::width(int);//把參數(shù)作為新的域?qū)?返回原域?qū)抜nlinecharios::fill()const;//返回當前填充字符inlinecharios::fill(char);//參數(shù)為新填充字符,返回原填充字符inlineintios::precision(int);//參數(shù)作為新精度,返回原精度inlineintios::precision()const;//返回當前精度,,9.2輸入輸出的格式控制(選讀),【例9.1】整型數(shù)輸出。#includeusingnamespacestd;intmain(void){intinum=255;cout<<"十進制方式"<- 1.請仔細閱讀文檔,確保文檔完整性,對于不預覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 程序設(shè)計 第二 第九 章流類庫 輸入輸出
鏈接地址:http://m.appdesigncorp.com/p-11544758.html