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