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