



版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇財(cái)經(jīng)職業(yè)技術(shù)學(xué)院《打印創(chuàng)新設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 天津醫(yī)科大學(xué)臨床醫(yī)學(xué)院《電視節(jié)目播音主持實(shí)訓(xùn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 邵陽職業(yè)技術(shù)學(xué)院《結(jié)構(gòu)設(shè)計(jì)軟件應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 長春職業(yè)技術(shù)學(xué)院《三維動畫MAYA》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)江師范學(xué)院《SAS與統(tǒng)計(jì)分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年重慶市建筑安全員考試題庫附答案
- 長春師范大學(xué)《公共管理與公共政策實(shí)務(wù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 西安航空學(xué)院《老年認(rèn)知癥的篩查與干預(yù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 南京科技職業(yè)學(xué)院《會展設(shè)計(jì)實(shí)務(wù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 襄陽職業(yè)技術(shù)學(xué)院《現(xiàn)代環(huán)境分析技術(shù)與應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 一通三防培訓(xùn)課件PPT課件(PPT 53頁)
- 江蘇省邳州市2021-2022學(xué)年人教版四年級上冊期末數(shù)學(xué)試卷(含答案)
- 大數(shù)據(jù)分析及應(yīng)用實(shí)踐全書課件匯總整本書電子教案(最新)
- 教練技術(shù)一階段講義(共59頁)
- 第3章-系統(tǒng)模型與模型化
- 精品課程建設(shè)驗(yàn)收自評報(bào)告
- 福建省義務(wù)教育課程設(shè)置及比例(修訂)
- 未成年人需辦銀行卡證明(模板)
- 建設(shè)項(xiàng)目職業(yè)病防護(hù)設(shè)施設(shè)計(jì)專篇編制導(dǎo)則
- 員工考勤流程圖
- 出口加工區(qū)外匯管理培訓(xùn)(ppt49)
評論
0/150
提交評論