版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第10章 輸入輸出流 課程要求1深入理解c+的輸入輸出流的含義與其實(shí)現(xiàn)方法。2掌握標(biāo)準(zhǔn)輸入輸出流的應(yīng)用,包括格式輸入輸出。3掌握文本文件和二進(jìn)制文件的讀寫方法。4掌握文件的隨機(jī)存取方法。5掌握字符串流的應(yīng)用。主要內(nèi)容10.1 c+的輸入輸出10.2 標(biāo)準(zhǔn)輸入輸出流10.3 文件操作與文件流10.4 字符串流10.1 c+的輸入輸出 c+的輸入輸出是以流(字節(jié)序列)的形式進(jìn)行的 。c+的輸入輸出主要有以下三種:(1)對(duì)系統(tǒng)指定的標(biāo)準(zhǔn)設(shè)備的輸入輸出,即標(biāo)準(zhǔn)i/o。(2)以外存磁盤文件為對(duì)象進(jìn)行的輸入輸出,稱為文件的輸入輸出。(3)對(duì)內(nèi)存指定的空間進(jìn)行輸入輸出。 10.1.1 c+流的概念 1流與流
2、類c+的輸入輸出流是由若干字節(jié)組成的字節(jié)序列,這些字節(jié)中的數(shù)據(jù)按一定的順序從一個(gè)對(duì)象傳送到另一個(gè)對(duì)象。 c+提供了一些供程序設(shè)計(jì)者使用的類,在這些類中封裝了可以實(shí)現(xiàn)輸入輸出操作的函數(shù),這些類統(tǒng)稱為i/o流類。流是用流類定義的對(duì)象,如cin、cout 2流的分類 (1)文本流和二進(jìn)制流 :按照數(shù)據(jù)的格式 (2)緩沖流與非緩沖流:按是否使用緩沖區(qū)10.1.2 c+流類庫(kù) c+的流類庫(kù)是用繼承方法建立起來(lái)的輸入輸出類庫(kù),由支持標(biāo)準(zhǔn)輸入輸出操作的基類和支持特定種類的源和目標(biāo)的輸入輸出操作的類組成。它具有兩個(gè)平行的基類,所有其它的流類都是從它們直接或間接地派生出來(lái)的。 streambuf類:提供對(duì)流緩沖
3、區(qū)的低級(jí)操作 ios類:提供對(duì)設(shè)備、文件的讀寫操作 c+流類體系 1通用i/o流類庫(kù)(1)基類ios(2)輸入類istream(3)輸出類ostream(4)輸入輸出類iostream2文件i/o流類庫(kù)(1)ofstream類(2)ifstream類(3)fstream 類3字符串i/o流類庫(kù)(1)ostrstream 類(2)istrstream 類(3)strstream類10.1.3 與iostream類庫(kù)有關(guān)的頭文件(1) iostream.h:包含對(duì)輸入輸出流進(jìn)行操作的基本信息,提供無(wú)格式支持的低級(jí)輸入輸出和有格式支持的高級(jí)輸入輸出操作功能。(2) fstream.h:包含管理文件輸
4、入輸出操作的有關(guān)信息。(3) strstrea.h:包含對(duì)內(nèi)存中數(shù)據(jù)進(jìn)行輸入輸出操作的有關(guān)信息。 (4) stdiostream.h:包含進(jìn)行c風(fēng)格的輸入輸出操作的有關(guān)信息。(5) iomanip.h:包含輸入輸出流的格式控制符(manipulator)的有關(guān)信息。當(dāng)一個(gè)程序中需要進(jìn)行標(biāo)準(zhǔn)流輸入輸出操作時(shí),則必須包含頭文件iostream.h;當(dāng)需要進(jìn)行文件流輸入輸出操作時(shí),則必須包含頭文件fstream.h;當(dāng)需要進(jìn)行字符串流讀/寫操作時(shí),則必須包含頭文件strstream.h。 10.1.4 插入與提取運(yùn)算符的重載 “”本來(lái)在c+中被定義為左位移運(yùn)算符和右位移運(yùn)算符,由于在文件iostre
5、am.h中對(duì)它們進(jìn)行了重載,使得它們能用作標(biāo)準(zhǔn)類型數(shù)據(jù)的輸入輸出運(yùn)算符。從流中獲取數(shù)據(jù)的操作稱為提取操作,使用提取運(yùn)算符“”;向流中添加數(shù)據(jù)的操作稱為插入操作,使用插入運(yùn)算符“”。 10.2 標(biāo)準(zhǔn)輸入輸出流 10.2.1 標(biāo)準(zhǔn)流類 標(biāo)準(zhǔn)流是不需要打開和關(guān)閉文件即可直接操作的流式文件。 cin:類istream的對(duì)象,用來(lái)處理標(biāo)準(zhǔn)輸入,即鍵盤輸入。 cout:類ostream的對(duì)象,用來(lái)處理標(biāo)準(zhǔn)輸出,即屏幕輸出。 cerr和clog:類ostream的對(duì)象,與錯(cuò)誤信息的標(biāo)準(zhǔn)輸出設(shè)備(屏幕)相關(guān)聯(lián),前者為非緩沖方式,后者為緩沖方式。1標(biāo)準(zhǔn)輸入流 cin是由輸入類istream的派生類istream
6、_withassign定義的對(duì)象,在缺省的情況下,cin所關(guān)聯(lián)的外部設(shè)備為鍵盤,實(shí)現(xiàn)從鍵盤上輸入數(shù)據(jù)。 cin為緩沖流。 2標(biāo)準(zhǔn)輸出流在c+流類體系中定義的標(biāo)準(zhǔn)輸出流是cout、cerr、clog,是由輸出類ostream的派生類ostream_withassign定義的對(duì)象,在缺省的情況下,cout、cerr、clog 所關(guān)聯(lián)的外部設(shè)備為屏幕,實(shí)現(xiàn)數(shù)據(jù)流輸出到屏幕。 cout、clog為緩沖流,而cerr為非緩沖流。 10.2.2 格式控制成員函數(shù)數(shù)據(jù)輸出的格式控制可通過(guò)兩種途徑實(shí)現(xiàn):使用預(yù)定義格式控制符帶參數(shù)(如setw(n))的:在頭文件iomanip.h中定義不帶參數(shù)(如dec)的:在
7、頭文件iostream.h中定義使用由ios類定義的格式控制成員函數(shù):在頭文件iostream.h中說(shuō)明1輸出寬度和填充字符輸出寬度和填充字符可通過(guò)由ios類中定義的輸出域?qū)捒刂瞥蓡T函數(shù)width(n)和填充成員函數(shù)fill(c)實(shí)現(xiàn)。其中n為輸出數(shù)據(jù)的寬度,c為填充字符。【例10.2】 使用成員函數(shù)控制輸出寬度及填充方式/*ex10_2.cpp*#include void main() float a=2345.679; cout.fill(*); for (int i=0;i5;i+) cout.width(i+6); coutaendl; 程序運(yùn)行后輸出:2345.682345.68*2
8、345.68*2345.68*2345.68 2其它格式控制若要改變流的其它輸出格式(如對(duì)齊方式),可使用ios類中定義的成員函數(shù)setf來(lái)實(shí)現(xiàn),函數(shù)格式如下:cout.setf(格式標(biāo)志)格式標(biāo)志在類ios中被定義為枚舉值,在引用這些格式標(biāo)志時(shí)要在前面加上類名ios和域運(yùn)算符“:”。 【例10.3】 將學(xué)生姓名與比賽得分通過(guò)初始化賦給數(shù)組name5、score5,指定姓名域?qū)挒?0個(gè)字符、左對(duì)齊,比賽得分為右對(duì)齊、用定點(diǎn)方式、小數(shù)點(diǎn)后有2位有效數(shù)字。分析:浮點(diǎn)數(shù)默認(rèn)的輸出精度為6(即輸出6位有效數(shù)字),例如浮點(diǎn)數(shù)3456.7891 顯示為3456.79。若要實(shí)現(xiàn)指定小數(shù)點(diǎn)后顯示幾位有效數(shù)字,
9、應(yīng)先用setf設(shè)置定點(diǎn)方式,再用成員函數(shù)precision(n)設(shè)置小數(shù)點(diǎn)后n位有效數(shù)字。 # include # include void main(void) char *name=zhou,zhao,liu,chen,li; double score=89,87.2,78.33,91.444,85.5555; for (int i=0;i5;i+) cout.setf(ios:left); /設(shè)置左對(duì)齊 cout.width(10);/設(shè)置域?qū)挒?0 coutnamei; cout.unsetf(ios:left); cout.setf(ios:fixed); /設(shè)置定點(diǎn)方式 cout.
10、precision(2); /設(shè)置小數(shù)點(diǎn)后2位有效數(shù)字 coutscorein; 程序運(yùn)行后,輸出如下:zhou 89.00zhao 87.20liu 78.33chen 91.44li 85.5610.2.3 數(shù)據(jù)輸入輸出成員函數(shù) 1數(shù)據(jù)輸入成員函數(shù) (1)字符輸入成員函數(shù)成員函數(shù)get()可以從輸入流中獲取字符,并將它存放在指定的變量中。該函數(shù)有以下兩種格式:vch=cin.get() vcin.get(ch) 函數(shù)實(shí)現(xiàn)從輸入流中讀取一個(gè)字符,賦給字符變量ch。采用第2種格式時(shí),如果讀取數(shù)據(jù)成功則函數(shù)返回非0值(真),否則(遇結(jié)束標(biāo)志符)返回0值(假)。 【例10.4】 讀取字符/*ex1
11、0_4.cpp*#include void main(void) char c1,c2,c3; cout輸入字符:; c1=cin.get(); cin.get(c2); cin.get();/讀入空白字符 cin.get(c3); coutc1=c1endl; coutc2=c2endl; coutc3=c3endl;輸入字符:abcc1=ac2=bc3=c(2)字符串輸入成員函數(shù)從輸入流中一次讀取一串字符,有以下2種方式:vcin.get(字符數(shù)組或字符指針,字符個(gè)數(shù)n,終止字符)vcin.getline(字符數(shù)組或字符指針,字符個(gè)數(shù)n,終止字符)從輸入流中讀取n1個(gè)字符,賦給指定的字符數(shù)
12、組(或字符指針指向的數(shù)組)。如果在讀取n1個(gè)字符之前遇到指定的終止字符,則提前結(jié)束讀取。如果讀取成功則函數(shù)返回非0值(真),否則(遇文件結(jié)束符)返回0值(假)。第三個(gè)參數(shù)缺省為換行符。 【例10.5】 讀取字符串/*ex10_5.cpp*#include void main(void) char str120,str220; cout輸入一行字符串:; cin.getline(str1,20); cin.get(str2,20); coutstr1=str1endl; coutstr2=str2endl;程序運(yùn)行結(jié)果如下:輸入2行字符串:this is a book. this is a bo
13、ok. str1=this is a book.str2=this is a book.2數(shù)據(jù)輸出成員函數(shù) (1)字符輸出成員函數(shù)函數(shù)put()用于輸出單個(gè)字符,格式如下:cout.put(char c);put函數(shù)的參數(shù)c可以是字符或字符的ascii碼,例如:cout.put(a); /在屏幕上顯示字符a (2)字符串輸出成員函數(shù)函數(shù)write()用于輸出一個(gè)指定長(zhǎng)度的字符串,格式如下:cout.write(字符串,字符個(gè)數(shù)n) ;例如:cout.write(this is a book. n,20);10.3 文件操作與文件流 10.3.1 文件的概念 1文件文件(file)指存儲(chǔ)于外部介
14、質(zhì)上的信息集合,分為文本文件和二進(jìn)制文件。 文本文件以字節(jié)(byte)為單位,每字節(jié)為一ascii 碼,代表一個(gè)字符,故又稱字符文件;二進(jìn)制文件又稱為內(nèi)部文件或字節(jié)文件,是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣輸出到磁盤上存放。例如整數(shù)1025,以文本形式(31003236h)存儲(chǔ)占用四個(gè)字節(jié),以二進(jìn)制形式(0401h)存儲(chǔ)則只占用兩個(gè)字節(jié)。2文件的操作文件操作分成4步:(1)定義文件流對(duì)象ifstream 文件輸入流對(duì)象;ofstream 文件輸出流對(duì)象;fstream 文件輸入/出流對(duì)象;(2)打開文件文件流對(duì)象.open(磁盤文件名,輸入輸出模式)也可以在定義文件流對(duì)象時(shí)指定文件打開模
15、式,在構(gòu)造過(guò)程中打開該文件。定義方式如下:ifstream 文件流對(duì)象(磁盤文件名,輸入輸出模式); ofstream 文件流對(duì)象(磁盤文件名,輸入輸出模式); fstream 文件流對(duì)象(磁盤文件名,輸入輸出模式);(3)讀/寫文件(4)關(guān)閉文件文件流對(duì)象.close( );10.3.2 文本文件的讀寫1使用提取運(yùn)算符或插入運(yùn)算符對(duì)文件進(jìn)行讀寫操作。【例10.6】 使用提取運(yùn)算符和插入運(yùn)算符將源文件中的前100個(gè)字符復(fù)制到目標(biāo)文件中。# include void main(void) char fname120,fname220; coutfname1; coutfname2; ifstre
16、am infile(fname1); /定義文件輸入流對(duì)象,打開源文件 if (!infile) cout不能打開輸入文件:fname1endl; return; ofstream outfile(fname2); /定義文件輸出流對(duì)象,打開目標(biāo)文件if (!outfile) cout不能打開目標(biāo)文件:fname2endl; return; char ch; int i; i=0; while(ich; /從源文件中提取一個(gè)字符到變量ch中; outfilech; /將ch中的字符寫入目標(biāo)文件中。 i=i+1; infile.close(); /關(guān)閉源文件 outfile.close(); /
17、關(guān)閉目標(biāo)文件2使用成員函數(shù)進(jìn)行文件的讀寫操作【例10.7】 使用成員函數(shù)get與put將源文件的內(nèi)容復(fù)制到目標(biāo)文件中分析:先打開源文件和目標(biāo)文件,依次從源文件中讀取一個(gè)字符,并將所讀字符寫入目標(biāo)文件中,直到源文件中所有字符讀完為止。# include void main(void) char fname120,fname220; coutfname1; coutfname2; ifstream infile; / 定義文件輸入流對(duì)象 infile.open(fname1, ios:in | ios:nocreate);/打開源文件 if (!infile) cout源文件不存在!fname1e
18、ndl; return; ofstream outfile; / 定義文件輸出流對(duì)象 outfile.open(fname2,ios:out | ios:noreplace);/打開目標(biāo)文件 if (!outfile) cout目標(biāo)文件已存在,不能新建目標(biāo)文件!fname2endl; return; char ch; while (infile.get(ch) /從源文件中提取一個(gè)字符到變量ch中; outfile.put(ch); /將ch中的字符寫入目標(biāo)文件中。 infile.close(); outfile.close();10.3.3 二進(jìn)制文件的讀寫 1二進(jìn)制文件的寫操作二進(jìn)制文件的
19、寫操作是通過(guò)成員函數(shù)write()來(lái)實(shí)現(xiàn):write(字符數(shù)組或字符指針, 字節(jié)數(shù)); 2二進(jìn)制文件的讀操作二進(jìn)制文件的讀操作是通過(guò)成員函數(shù)read()來(lái)實(shí)現(xiàn):read(字符數(shù)組或字符指針, 字節(jié)數(shù) ); 3測(cè)試文件結(jié)束測(cè)試二進(jìn)制文件結(jié)束位置可用成員函數(shù)eof()實(shí)現(xiàn),當(dāng)?shù)竭_(dá)文件結(jié)束位置時(shí),該函數(shù)返回零值,否則返回非零值。4返回讀入數(shù)據(jù)的長(zhǎng)度返回最近一次輸入所讀入的字節(jié)數(shù)可用成員函數(shù)gcount()實(shí)現(xiàn)。10.3.4 文件的隨機(jī)讀寫 從文件中任何位置開始進(jìn)行讀或?qū)憯?shù)據(jù),這種讀寫方式稱為文件的隨機(jī)訪問(wèn)或直接存取。 1文件定位 c+ 的類庫(kù)fstream中定義了兩個(gè)與文件相聯(lián)系的指針v讀指針v寫指針 c+的文件定位分為讀位置和寫位置的定位,對(duì)應(yīng)的成員函數(shù) vseekg():設(shè)置讀位置vseekp:設(shè)置寫位置 (1)讀操作定位v相對(duì)文件頭指針移動(dòng)n個(gè)字節(jié) seekg(位移量n); v相對(duì)參照位置指針移動(dòng)n個(gè)字節(jié) seekg(位移量n, 參照位置 );參照位置可取三個(gè)值: io3:beg或0:文件頭。 io3:cur或1:文件指針當(dāng)前的位置。 io3:end或2:文件尾。(2)寫操作定位文件寫操作的定位是通過(guò)成員函數(shù)seekp實(shí)現(xiàn)的。v seekp(位移量n); v seekp(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)業(yè)水利改造升級(jí)技術(shù)應(yīng)用合同
- 旅游地產(chǎn)投資合同審查策略
- 建筑供滑雪場(chǎng)人工費(fèi)施工合同
- 會(huì)計(jì)服務(wù)外包服務(wù)合同范本
- 城市機(jī)場(chǎng)廣告牌施工合同
- 工業(yè)廠房屋面瓦安裝協(xié)議
- 動(dòng)漫產(chǎn)業(yè)質(zhì)檢崗位聘用合同模板
- 造紙工程私人施工合同樣式
- 消防工程勞務(wù)合同模板
- 建筑工程防雷施工合同范本
- 2023-2024學(xué)年廣東省深圳市南山區(qū)八年級(jí)(上)期末英語(yǔ)試卷
- 期末 (試題) -2024-2025學(xué)年人教PEP版(2024)英語(yǔ)三年級(jí)上冊(cè)
- 中醫(yī)跨文化傳播智慧樹知到期末考試答案章節(jié)答案2024年浙江中醫(yī)藥大學(xué)
- 剪刀式升降車專項(xiàng)施工方案
- 風(fēng)電項(xiàng)目監(jiān)理大綱附錄風(fēng)電工程設(shè)備監(jiān)理項(xiàng)目表
- 《混凝土結(jié)構(gòu)》(樓蓋)課程設(shè)計(jì)任務(wù)書
- 邵雍河洛理數(shù)解卦
- 趙本山《賣拐》臺(tái)詞
- 上海建設(shè)工程通用硅酸鹽水泥質(zhì)量檢驗(yàn)報(bào)告 - 上海水泥行業(yè)協(xié)會(huì)
- 工程測(cè)量英語(yǔ)常用詞匯
- 國(guó)軍標(biāo)與國(guó)標(biāo)的區(qū)別
評(píng)論
0/150
提交評(píng)論