課件第8章的流類庫_第1頁
課件第8章的流類庫_第2頁
課件第8章的流類庫_第3頁
課件第8章的流類庫_第4頁
課件第8章的流類庫_第5頁
已閱讀5頁,還剩48頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第八章C++的I/O流類庫主要內(nèi)容C++的流及流類庫重載I/O運(yùn)算符8.1C++的流及流類庫1.C++的流 輸入和輸出是數(shù)據(jù)傳送的過程,數(shù)據(jù)如流水從一處流向另一處。C++形象地將此過程稱為流(stream)。

C++的輸入輸出流是指由若干字節(jié)組成的字節(jié)序列,這些字節(jié)中的數(shù)據(jù)按順序從一個(gè)對象傳送到另一個(gè)對象。流表示了信息從源到目的端的流動。1)輸入流 在輸入操作時(shí),字節(jié)流從輸入設(shè)備(如鍵盤、磁盤)流向內(nèi)存,稱為輸入流。2)輸出流

在輸出操作時(shí),字節(jié)流從內(nèi)存流向輸出設(shè)備(如顯示器、打印機(jī)、磁盤等),稱為輸出流。

流中的內(nèi)容可以是ASCII字符、二進(jìn)制形式的數(shù)據(jù)、圖形圖像、數(shù)字音頻視頻或其它形式的信息。

3)輸入輸出流的本質(zhì)

實(shí)際上,在內(nèi)存中為每一個(gè)數(shù)據(jù)流開辟一個(gè)內(nèi)存緩沖區(qū),用來存放流中的數(shù)據(jù)。當(dāng)用cout和插入運(yùn)算符“<<”向顯示器輸出數(shù)據(jù)時(shí),先將這些數(shù)據(jù)送到程序中的輸出緩沖區(qū)保存,直到緩沖區(qū)滿了或遇到endl,就將緩沖區(qū)中的全部數(shù)據(jù)送到顯示器顯示出來。在輸入時(shí),從鍵盤輸入的數(shù)據(jù)先放在鍵盤的緩沖區(qū)中,當(dāng)按回車鍵時(shí),鍵盤緩沖區(qū)中的數(shù)據(jù)輸入到程序中的輸入緩沖區(qū),形成cin流,然后用提取運(yùn)算符“>>”從輸入緩沖區(qū)中提取數(shù)據(jù)送給程序中的有關(guān)變量。4)流類

在C++中,輸入輸出流被定義為類。C++的I/O庫中的類稱為流類(streamclass)。用流類定義的對象稱為流對象。

[例如]:

cin和cout就是iostream_withassign類的對象。2.流類庫

C++流庫是C++語言為完成輸入/輸出工作而預(yù)定義的類的集合。

C++的I/O流類庫是用繼承方法建立起來的一個(gè)輸入輸出類庫,這些類構(gòu)成一個(gè)層次結(jié)構(gòu)的系統(tǒng)。 它具有兩個(gè)平行類:即streambuf類和ios類,這兩個(gè)類是基本類,所有的流類都可以由它們派生出來。1)streambuf類

streambuf類提供物理設(shè)備的接口,它提供緩沖或處理流的通用方法,幾乎不需要任何格式。緩沖區(qū)由一個(gè)字符序列和兩個(gè)指針組成,這兩個(gè)指針是輸入緩沖區(qū)指針和輸出緩沖區(qū)指針,它們分別指向字符要被插入或取出的位置。

streambuf類提供對緩沖區(qū)的低級操作,如設(shè)置緩沖區(qū)、對緩沖區(qū)指針進(jìn)行操作、從緩沖區(qū)取字符、向緩沖區(qū)存儲字符。streambufstrstreambuffilebufconbuf streambuf有三個(gè)派生類,即filebuf、strstreambuf和conbuf,其成員函數(shù)大多采用內(nèi)置函數(shù)方式定義,以提高效率。 下圖為它們之間的層次關(guān)系。2)ios類

ios類是一個(gè)虛基類,它主要定義了用于格式化輸入輸出及出錯(cuò)的成員函數(shù)。

在ios類和它的各級派生類中,均含有一個(gè)指向流緩沖類streambuf的對象的指針。ios類(及其派生類)使用streambuf類以及從它派生的文件緩沖類filebuf和字符緩沖類strstreambuf進(jìn)行輸入輸出。

常用ios流類的簡要說明和類聲明所在的頭文件名見書第373頁表13-1。iostreamiosistreamfstreambasestrstreambaseostreamistrstreamostrstreamofstreamifstreamstrstreamfstreamios流類層次圖

在頭文件iostream.h中,提供了4個(gè)預(yù)定義的標(biāo)準(zhǔn)流對象:externistream_withassigncin; //預(yù)定義代表標(biāo)準(zhǔn)輸入設(shè)備鍵盤externostream_withassigncout; //預(yù)定義代表標(biāo)準(zhǔn)輸出設(shè)備顯示器externistream_withassigncerr;

//

預(yù)定義代表標(biāo)準(zhǔn)出錯(cuò)輸出設(shè)備顯示器externistream_withassignclog;

//預(yù)定義代表標(biāo)準(zhǔn)出錯(cuò)輸出設(shè)備顯示器。[說明]:

這四個(gè)標(biāo)準(zhǔn)流對象是程序中進(jìn)行標(biāo)準(zhǔn)輸入輸出要用到的。cin對象是從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)輸入到內(nèi)存的數(shù)據(jù)流,稱為cin流或標(biāo)準(zhǔn)輸入流。cout對象是從內(nèi)存輸入到標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù)流,稱為cout流或標(biāo)準(zhǔn)輸出流。cerr和clog均為向輸出設(shè)備(顯示器)輸出出錯(cuò)信息。

在很多情況下,程序員需要控制輸入輸出格式。

C++提供了兩種格式控制方法:

使用ios類中有關(guān)格式控制的成員函數(shù);

使用稱為控制符的特殊類型的函數(shù)。8.2格式化I/Oios類中有幾個(gè)成員函數(shù)可以用來對輸入輸出進(jìn)行格式控制。進(jìn)行格式控制主要是通過對格式狀態(tài)字、域?qū)?、填充字符以及輸出精度的操作來完成的?.用ios類的成員函數(shù)進(jìn)行格式控制C++可以給每個(gè)流對象的輸入輸出進(jìn)行格式控制,以滿足程序員對輸入輸出格式的需求。

輸入輸出格式由一個(gè)longint類型的格式狀態(tài)字確定,狀態(tài)字的各位都控制一定的輸入輸出特征。

在ios類的public部分定義了一個(gè)枚舉,它的每個(gè)成員可以分別定義格式狀態(tài)字的一個(gè)位,每一個(gè)位稱為一個(gè)狀態(tài)標(biāo)志位。這個(gè)枚舉的定義如下:1)

格式狀態(tài)字enum{skipws=0x0001,left=0x0002,right=0x0004,internal=0x0008,dec=0x0010,oct=0x0020,hex=0x0040,showbase=0x0080,showpoint=0x0100,uppercase=0x0200,showpos=0x0400,scientific=0x0800,fixed=0x1000,unitbuf=0x2000,stdio=0x4000};

在ios類的說明中,定義了幾個(gè)用于格式控制的公有成員函數(shù),列舉如下:

longios::flags();//返回當(dāng)前格式狀態(tài)字

longios::flags(long)://設(shè)置格式狀態(tài)字并返回

longios::setf(long);//設(shè)置指定的標(biāo)志位

longios::unsetf(long);//清除指定的標(biāo)志位

intios::width();//返回當(dāng)前顯示數(shù)據(jù)的域?qū)?/p>

intios::width(int);//設(shè)置當(dāng)前顯示數(shù)據(jù)域?qū)挷⒎祷卦驅(qū)?/p>

charios::fill();

//返回當(dāng)前填充字符2)ios類中用于控制輸入輸出格式的成員函數(shù)[例]:見書第376頁例13-1。2.使用I/O操縱符進(jìn)行格式控制

使用ios類的成員函數(shù)進(jìn)行輸入輸出格式控制時(shí),每個(gè)函數(shù)的調(diào)用需要寫一條語句,而且不能將它們直接嵌入到輸入輸出語句中,使人感到不夠簡潔、方便。

C++提供另一種進(jìn)行輸入輸出格式控制的方法,這一方法使用一種稱為操縱符的特殊函數(shù)。在很多情況下,使用操縱符進(jìn)行格式化控制比用ios格式標(biāo)志和成員函數(shù)要方便。C++預(yù)定義的操縱符分為帶參數(shù)的操縱符和不帶參數(shù)的操縱符。通常,不帶參數(shù)的操縱符在iostream文件中定義,而帶參數(shù)的操縱符在iomanip文件中定義。

在進(jìn)行輸入輸出時(shí),操縱符被嵌入到輸入或輸出鏈中,用來控制輸入輸出格式,而不執(zhí)行輸入或輸出操作。

定義在iostream頭文件中的操縱符有:

endl輸出時(shí)插入換行符并刷新流

ends輸出時(shí)在字符串后插入空字符(NULL)作為尾符

flush刷新,把流從緩沖區(qū)輸出到目標(biāo)設(shè)備

ws輸入時(shí)略去空白字符

dec以十進(jìn)制形式輸入或輸出整型數(shù)

hex以十六進(jìn)制形式輸入或輸出整型數(shù)

oct以八進(jìn)制形式輸入或輸出整型數(shù)

定義在iomanip頭文件中的操縱符有:

setbase(intn)設(shè)置轉(zhuǎn)換基數(shù)為n(n取值為0、8、10或16),缺省時(shí)為0,表示采用十進(jìn)制形式輸出

resetiosflags(longf)清除由參數(shù)f指定的標(biāo)志位,用于輸入輸出

setiosflags(longf)設(shè)置參數(shù)f指定的標(biāo)志位

setfill(charc)設(shè)置填充字符

setprecision(intn)設(shè)置浮點(diǎn)數(shù)精度(缺省為6)setw(intn)設(shè)置數(shù)據(jù)寬度

程序中如果使用帶參數(shù)的操縱符,還必須使用預(yù)編譯命令:#include<iomanip>將需要的頭文件包含進(jìn)來。[例]:見書第379頁例13-3。8.3重載I/O運(yùn)算符 C++創(chuàng)建自己的流庫的主要目的,就是用戶自定義類型數(shù)據(jù)的輸入輸出也能像系統(tǒng)預(yù)定義類型數(shù)據(jù)的輸入輸出一樣簡單、方便,這是通過重載輸入運(yùn)算符“>>”和輸出運(yùn)算符“<<”來實(shí)現(xiàn)的。1.重載輸出運(yùn)算符“<<”1)一般格式:

ostream&operator<<(ostream&out,user-typeobj) {//操作代碼

returnout; } [說明]:

由于重載輸出運(yùn)算符時(shí),其函數(shù)中的第一個(gè)參數(shù)必須是輸出流,因此重載輸出運(yùn)算符必須是非成員函數(shù)。2)示例:書第380頁例13-4。書第381頁例13-5。2.重載輸入運(yùn)算符“>>”1)一般格式:

istream&operator>>(istream&in,user-type&obj) {//操作代碼

returnin; } [說明]:重載輸入運(yùn)算符時(shí),函數(shù)中的第二個(gè)參數(shù)必須是一個(gè)引用;重載輸入運(yùn)算符必須是非成員函數(shù)。[例]:見書第382頁例13-6。8.4文件流C++把文件看作是字符(字節(jié))的序列,即由一個(gè)一個(gè)字符(字節(jié))的數(shù)據(jù)順序組成。根據(jù)數(shù)據(jù)的組織形式,可分為ASCII文件和二進(jìn)制文件。

在C++中,進(jìn)行文件操作:首先建立一個(gè)文件流,然后把這個(gè)流和實(shí)際的文件相關(guān)聯(lián),這稱為打開文件;文件打開后,可以按要求進(jìn)行讀寫操作,一般來說,在主存與外設(shè)的數(shù)據(jù)傳輸中,由主存到外設(shè)叫做輸出或?qū)懀赏庠O(shè)到主存叫做輸入或讀;完成輸入輸出后,還必須將已打開的文件關(guān)閉,即取消文件和流的關(guān)聯(lián)。1.文件的打開和關(guān)閉1)文件的打開

文件使用時(shí),必須先打開,后使用。打開文件時(shí)必須指定文件的打開方式。

C++為文件輸入輸出提供了3個(gè)類:ifstream、ofstream和fstream。與這三個(gè)類相對應(yīng),C++為文件輸入輸出提供了三種類型的流,即輸入流、輸出流以及輸入/輸出流。[例如]:

ifstreamin;//輸入

ofstreamout;//輸出

fstreamboth;//輸入和輸出

文件的打開有兩種方式:用輸入輸出流的成員函數(shù)打開用構(gòu)造函數(shù)打開

用流ifstream、ofstream和fstream類對象的成員函數(shù)方式打開文件。open()函數(shù)是這三個(gè)流類的成員函數(shù),其原型為:

voidopen(constunsignedchar*,intmode,intaccess=filebuf::openprot);

其中第一個(gè)參數(shù)用來傳遞文件名,第二個(gè)參數(shù)mode的值決定文件的打開方式,第三個(gè)參數(shù)決定文件的保護(hù)方式,用戶通常只使用缺省值。

用輸入輸出流的成員函數(shù)打開

打開方式是已經(jīng)在ios類中定義了的枚舉常量。常用的有:

ios::in打開一個(gè)文件用于輸入(讀)操作。

ios::out打開一個(gè)文件用于輸出(寫)操作

ios::ate打開一個(gè)已有的文件,文件指針指向文件尾。

ios::app以輸出方式打開文件,寫入的數(shù)據(jù)添加在文件末尾ios::trunc打開一個(gè)文件。如果文件已存在,則刪除其中全部數(shù)據(jù);如果文件不存在,則建立新文件。如果已指定了ios::out,而未指定ios::app、ios::ate、ios::in,則同時(shí)默認(rèn)此方式。ios::nocreate打開一個(gè)已有的文件,如果文件不存在,則打開文件失?。床粍?chuàng)建一個(gè)新文件)。ios::noreplace如果文件不存在則建立新文件,如果文件存在,則打開失敗。noreplace是不更新原有文件的意思。ios::binary指定文件以二進(jìn)制方式打開,而不是缺省說明的文本方式。

用構(gòu)造函數(shù)打開文件

用構(gòu)造函數(shù)打開文件的格式是:ifstream對象名("文件名")ofstream對象名("文件名")fstream對象名("文件名",打開方式)[例如]:

ofstreamfout(“mytest.txt”);它相當(dāng)于語句:

ofstreamfout;

fout.open("mytest.txt");

只有在打開文件之后,才能對文件進(jìn)行讀寫操作。如果由于某些原因打不開文件(即執(zhí)行函數(shù)open()失敗),則流變量的值將為0。因此,在對文件進(jìn)行操作前,必須確保文件已打開,否則要進(jìn)行相應(yīng)的處理。

為了確認(rèn)打開一個(gè)文件是否成功,可以使用類似下面的辦法進(jìn)行檢測:ifstreamfin("mytest.txt");//打開輸入文件if(!fin){cout<<”Cannotopenfile!\n”

;

//錯(cuò)誤處理代碼}

為了確保文件操作的順利進(jìn)行,在打開文件時(shí)通常都要判斷是否成功。2)文件的關(guān)閉

當(dāng)對一個(gè)打開的文件操作完畢后,應(yīng)及時(shí)調(diào)用文件流的成員函數(shù)來關(guān)閉相應(yīng)的文件。具體格式為:流對象名.close();

其中流對象名為待關(guān)閉的文件流的對象名。close()函數(shù)不帶任何參數(shù),也不返回任何值。

文件流的對象通過文件打開函數(shù),建立起文件名與該對象的聯(lián)系后,就可對文件進(jìn)行讀、寫操作,文件關(guān)閉后,就斷開了文件流與對象間的聯(lián)系。如果要對文件再次進(jìn)行讀、寫,就要重新打開文件。2.文件的讀寫

當(dāng)文件打開以后,即文件與流建立了聯(lián)系后,就可以進(jìn)行讀寫操作了。1)文本文件的讀寫對文本文件的讀寫操作可以用以下兩種方法:用流輸出運(yùn)算符“<<”和流輸入運(yùn)算符“>>”輸入輸出標(biāo)準(zhǔn)類型的數(shù)據(jù)。用文件流的put、get和getline等成員函數(shù)進(jìn)行字符的輸入輸出。

在對磁盤文件的操作中,可以通過文件流對象和運(yùn)算符“<<”和“>>”實(shí)現(xiàn)對磁盤文件的讀寫,如同用cin、cout和<<、>>對標(biāo)準(zhǔn)設(shè)備進(jìn)行讀寫一樣,只是必須用與文件相連接的文件流代替cin和cout。

用流輸出運(yùn)算符“<<”和流輸入運(yùn)算符“>>”輸入輸出標(biāo)準(zhǔn)類型的數(shù)據(jù)。例13-7生成一個(gè)sqrtable.txt文件,該文件內(nèi)容為100以內(nèi)整數(shù)的平方根表,結(jié)果精確到小數(shù)點(diǎn)后4位。#include<fstream>#include<iostream>#include<iomanip>#include<cmath>usingnamespacestd;intmain(){ofstreamtable;table.open("sqrtable.txt");inti,j;if(!table){cout<<"Cannotopenoutputfile!\n";return1;}table<<"|";for(i=0;i<10;i++) table<<setw(5)<<i<<"";table<<endl;table<<"---+";for(i=0;i<10;i++)table<<"--------";table<<fixed<<setprecision(4);for(i=0;i<10;i++){table<<endl;table<<setw(2)<<i<<"|";for(j=0;j<10;j++)table<<setw(8)<<sqrt(10*i+j);}table.close();return0;}

用文件流的put、get和getline等成員函數(shù)進(jìn)行字符的輸入輸出。

成員函數(shù)put用于輸出一個(gè)字符,格式為:

輸出流對象.put(ch);

成員函數(shù)get用于讀入一個(gè)字符,它有3種形式:

輸入流對象.get();

輸入流對象.get(ch);

輸入流對象.get(字符數(shù)組或字符指針,字符個(gè)數(shù)n,終止字符);

成員函數(shù)getline用于讀入一行字符,其用法與帶3個(gè)參數(shù)的get函數(shù)類似,即:

輸入流對象.getline(字符數(shù)組或字符指針,字符個(gè)數(shù)n,終止字符);例13-8將文件sqrtable.txt復(fù)制為文件mttable.txt。#include<fstream>#include<iostream>usingnamespacestd;intmain(){ charc; ifstreamfin("sqrtable.txt"); if(!fin) { cout<<"Cannotopeninputfile!\n"; return1; } ofstreamfout("mytable.txt"); if(!fout) { cout<<"Cannotopenoutputfile!\n"; return1; } while(fin.get(c)) fout.put(c); return0;}2)二進(jìn)制文件的讀寫對二進(jìn)制文件的讀寫主要用istream類的成員函數(shù)read和ostream類的成員函數(shù)write來實(shí)現(xiàn)的。這兩個(gè)函數(shù)的原型如下:

istream&read(char*buffer,intlen);ostream&write(constchar*buffer,intlen);read是流類istream中的成員函數(shù),其功能為:從相應(yīng)的流中讀取len個(gè)字節(jié),并把它們放入指針buffer所指向的緩沖區(qū)中。

該函數(shù)有兩個(gè)參數(shù),其中第一個(gè)參數(shù)buffer是一個(gè)指針,它是讀入數(shù)據(jù)的存放地址(起始地址);第二個(gè)參數(shù)len是一個(gè)整數(shù)值,它是要讀入的數(shù)據(jù)的字節(jié)數(shù)。其調(diào)用格式為:read(緩沖區(qū)首址,讀入的字節(jié)數(shù)),其中,“緩沖區(qū)首址”的數(shù)據(jù)類型為char*,當(dāng)輸入其他類型數(shù)據(jù)時(shí),必須進(jìn)行類型轉(zhuǎn)換。例如:

intarrryi[]={100,200,300};read((char*)&arrayi[0],sizeof(arrayi));[例]:見書第388頁例13-9和13-10。3)文件的隨機(jī)讀寫

隨機(jī)存取文件(又稱直接存取文件)在訪問文件中的元素時(shí),不必考慮各個(gè)元素的排列次序或位置,可以根據(jù)需要訪問文件中的任一個(gè)元素。

為了進(jìn)行隨機(jī)存取,必須先確定文件指針的位置。在C++中,可以用以下幾個(gè)函數(shù)來確定指文件指針位置。(1)seekg(pos);

seekp(pos);

這兩個(gè)函數(shù)都是從文件頭開始,把文件指針向后移動

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論