第13章C++流和文件流_第1頁(yè)
第13章C++流和文件流_第2頁(yè)
第13章C++流和文件流_第3頁(yè)
第13章C++流和文件流_第4頁(yè)
第13章C++流和文件流_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第13章C++流和文件流C++語(yǔ)言中沒(méi)有專(zhuān)門(mén)的輸入/輸出(I/O)語(yǔ)句,C++中的I/O操作是通過(guò)一組標(biāo)準(zhǔn)I/O函數(shù)和I/O流來(lái)實(shí)現(xiàn)的。C++的標(biāo)準(zhǔn)I/O函數(shù)是從C語(yǔ)言繼承而來(lái)的,同時(shí)對(duì)C語(yǔ)言的標(biāo)準(zhǔn)I/O函數(shù)進(jìn)行了擴(kuò)充。C++的I/O流不僅擁有標(biāo)準(zhǔn)I/O函數(shù)的功能,而且比I/O函數(shù)更方便、更可靠。13.1什么是流C++中把數(shù)據(jù)之間的傳輸操作稱(chēng)作流。在C++中,流既可以表示數(shù)據(jù)從內(nèi)存?zhèn)魉偷侥硞€(gè)載體或設(shè)備中,即輸出流;也可以表示數(shù)據(jù)從某個(gè)載體或設(shè)備傳送到內(nèi)存緩沖區(qū)變量中,即輸入流。在進(jìn)行I/O操作時(shí),操作步驟如下:(1)打開(kāi)操作,使流和文件發(fā)生聯(lián)系,建立聯(lián)系后的文件才允許數(shù)據(jù)流入或流出;(2)輸入或輸出操作;(3)結(jié)束后,使用關(guān)閉操作使文件與流斷開(kāi)聯(lián)系。C++中所有流都是相同的,但操作的文件可以不同。使用流以后,程序用流統(tǒng)一對(duì)各種計(jì)算機(jī)設(shè)備和文件進(jìn)行操作,使程序與設(shè)備、程序與文件無(wú)關(guān),從而提高了程序設(shè)計(jì)的通用性和靈活性。也就是說(shuō),無(wú)論與流相聯(lián)系的實(shí)際物理設(shè)備差別有多大,流都采用相同的方式運(yùn)行。這種機(jī)制使得流可以跨越物理設(shè)備平臺(tái),實(shí)現(xiàn)流的透明運(yùn)作,而與實(shí)際的物理設(shè)備無(wú)關(guān)。例如,往顯示器上輸出字符和向磁盤(pán)文件或打印機(jī)輸出字符,盡管接收輸出的物理設(shè)備不同,但具體操作過(guò)程是相同的。13.1.1預(yù)定義流在程序開(kāi)始運(yùn)行時(shí),C++會(huì)自動(dòng)打開(kāi)4個(gè)流,這些流是C++流類(lèi)庫(kù)的預(yù)定義流,如下表所列。流含義所屬類(lèi)庫(kù)默認(rèn)設(shè)備cin標(biāo)準(zhǔn)輸入iostream.h鍵盤(pán)cout標(biāo)準(zhǔn)輸出iostream.h顯示器cerr沒(méi)有被緩沖的標(biāo)準(zhǔn)錯(cuò)誤輸出iostream.h顯示器clog被緩沖了的標(biāo)準(zhǔn)錯(cuò)誤輸出iostream.h顯示器C++的流通過(guò)重載運(yùn)算符“<<”和“>>”執(zhí)行輸出和輸入操作。輸出操作是向流中插入一個(gè)字符序列,因此,在流操作中,將運(yùn)算符“<<”稱(chēng)為插入運(yùn)算符。輸入操作是從流中提取一個(gè)字符序列,因此,將運(yùn)算符“>>”稱(chēng)為提取運(yùn)算符。1.coutcout是與標(biāo)準(zhǔn)輸出設(shè)備連接的預(yù)定義輸出流,稱(chēng)為匯。C++的插入運(yùn)算符“<<”向輸出流發(fā)送字符。實(shí)際上,位于插入運(yùn)算符右側(cè)的字符串被存儲(chǔ)在“<<”左側(cè)的流中。例如:cout<<name<<""<<number<<'\n';cout是數(shù)據(jù)的目的地,插入運(yùn)算符“<<”把對(duì)象或文字?jǐn)?shù)據(jù)(字符串、數(shù)字或任何對(duì)象)傳送到cout。cout一般連接到標(biāo)準(zhǔn)輸出設(shè)備即顯示器(默認(rèn)設(shè)備)。2.cincin是與標(biāo)準(zhǔn)輸入設(shè)備連接的預(yù)定義輸入流,稱(chēng)為源。它從輸入流中取出數(shù)據(jù),數(shù)據(jù)從輸入提取運(yùn)算符“>>”處流進(jìn)程序。為了保留輸入數(shù)據(jù),輸入語(yǔ)句要求有目的地址,即指定數(shù)據(jù)類(lèi)型的存儲(chǔ)單元,例如:inti;cin>>i;這段代碼所進(jìn)行的操作是:提取運(yùn)算符“>>”從cin參數(shù)中提取一個(gè)整型輸入數(shù)據(jù),并存入一個(gè)對(duì)象(變量),在此例中即為整型數(shù)i。cin一般連接到標(biāo)準(zhǔn)輸入設(shè)備即鍵盤(pán)(默認(rèn)設(shè)備)。3.cerrcerr類(lèi)似標(biāo)準(zhǔn)錯(cuò)誤文件。cerr與cout的差別在于:(1)cerr是不能重定向的;(2)cerr不能被緩沖,它的輸出總是直接傳送到標(biāo)準(zhǔn)輸出設(shè)備上。錯(cuò)誤信息是寫(xiě)到cerr的項(xiàng)。即使在各種其他輸出語(yǔ)句中,如果使用下列語(yǔ)句,則錯(cuò)誤信息“Error”總能保證在顯示器上顯示出來(lái):cerr<<"Error"<<"\n";4.clogclog是不能重定向的,但是可以被緩沖。在某些系統(tǒng)中,由于緩沖,使用clog代替cerr可以改進(jìn)顯示速度:clog<<"Error"<<"\n";13.1.2C++的流類(lèi)庫(kù)C++提供了一個(gè)流類(lèi)庫(kù),流類(lèi)庫(kù)由若干完成I/O操作的基礎(chǔ)類(lèi)以及若干支持特定種類(lèi)的源和目標(biāo)的I/O操作類(lèi)組成。流類(lèi)庫(kù)的基礎(chǔ)類(lèi)利用繼承關(guān)系組織起來(lái),其類(lèi)層次如下圖所示,這些類(lèi)的說(shuō)明如表13.2所列。所有使用流類(lèi)庫(kù)的程序必須用“#include”編譯指令將iostream.h包含進(jìn)來(lái)。I/O流類(lèi)庫(kù)的類(lèi)層次輸入流類(lèi)istream通用輸入流類(lèi)和其他輸入流的基類(lèi)iostream.hifstream輸入文件流類(lèi)fstream.histream_withassigncin的輸入流類(lèi)iostream.histrstream輸入字符串流類(lèi)strstrea.h輸出流類(lèi)ostream通用輸出流類(lèi)和其他輸出流的基類(lèi)iostream.hofstream輸出文件流類(lèi)fstream.hostream_withassigncout、cerr和clog的輸出流類(lèi)iostream.hostrstream輸出字符串流類(lèi)strstrea.hI/O流類(lèi)iostream通用I/O流類(lèi)和其他I/O流的基類(lèi)iostream.hfstreamI/O文件流類(lèi)fstream.hstrstreamI/O字符串流類(lèi)strstrea.h13.2格式化I/O在以前的程序中,所有I/O采用的格式都是由C++流類(lèi)庫(kù)提供的默認(rèn)方式。在實(shí)際應(yīng)用中,常常需要準(zhǔn)確控制數(shù)據(jù)(特別是整數(shù)、浮點(diǎn)數(shù)與字符串)的I/O格式。流類(lèi)庫(kù)可用兩種方法控制數(shù)據(jù)的格式:使用ios類(lèi)的成員函數(shù)和使用I/O操縱符。13.2.1使用ios成員函數(shù)每一個(gè)C++流都有自己當(dāng)前的數(shù)據(jù)格式控制狀態(tài),這些狀態(tài)用一個(gè)長(zhǎng)整數(shù)表示,即ios類(lèi)的數(shù)據(jù)成員x_flags,稱(chēng)為格式化標(biāo)志字。這些格式化標(biāo)志字在ios類(lèi)中定義為公有的枚舉量。在iostream.h頭文件中定義了以下枚舉類(lèi)型:enum{skipws=0x0001,//跳過(guò)輸入中的空白(空格、制表符、回車(chē)、換行等)left=0x0002, //輸出左對(duì)齊right=0x0004, //輸出右對(duì)齊internal=0x0008, //在符號(hào)或基位與數(shù)值之間補(bǔ)齊空格dec=0x0010, //按十進(jìn)制I/Ooct=0x0020, //按八進(jìn)制I/Ohex=0x0040, //按十六進(jìn)制I/Oshowbase=0x0080,//輸出數(shù)制的基showpoint=0x0100,//強(qiáng)制浮點(diǎn)數(shù)輸出小數(shù)點(diǎn)uppercase=0x0200,//十六進(jìn)制采用大寫(xiě)輸出showpos=0x0400,//在正數(shù)前加上“+”scientific=0x0800, //浮點(diǎn)數(shù)使用科學(xué)記數(shù)法fixed=0x1000,//浮點(diǎn)數(shù)使用普通記數(shù)法unitbuf=0x2000, //每次插入后刷新所有流stdio=0x4000 //每次插入后刷新標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出流};(1)setf()成員函數(shù)setf()用于設(shè)置狀態(tài)標(biāo)志。例如,設(shè)置輸出流cout的showbase標(biāo)志使用如下語(yǔ)句:

cout.setf(ios::showbase);設(shè)置輸入流cin的skipws標(biāo)志使用如下語(yǔ)句:

cin.setf(ios::skipws);

注意:格式標(biāo)志前的限定“ios::”不可缺少,因?yàn)檫@些標(biāo)志是在ios類(lèi)中定義的。在setf()中還可用位或操作“|”將多個(gè)標(biāo)志連在一起。例如:

cout.setf(ios::scientific|ios::showpoint);同時(shí)設(shè)置scientific和showpoint兩個(gè)標(biāo)志。(2)unsetf()成員函數(shù)unsetf()用來(lái)取消格式標(biāo)志,unsetf()的用法與setf()相似。(3)flags()成員函數(shù)flags()用于獲取當(dāng)前格式標(biāo)志的狀態(tài),即返回保護(hù)成員x_flags的當(dāng)前值。(4)precision()該函數(shù)的說(shuō)明如下:intprecision([intnum]);用于設(shè)置或返回(不帶參數(shù)時(shí))浮點(diǎn)數(shù)的輸出精度,也就是通過(guò)這個(gè)公共成員函數(shù)設(shè)置ios類(lèi)的保護(hù)數(shù)據(jù)成員x_precision的值,該成員的默認(rèn)值為6。precision()函數(shù)的設(shè)置值一直有效,直到下一個(gè)precision()函數(shù)改變?cè)撝禐橹?。?)width()該函數(shù)的說(shuō)明如下:intwidth([intlen]);用于設(shè)置或返回(不帶參數(shù)時(shí))輸出數(shù)據(jù)的字段寬度,也就是通過(guò)這個(gè)公共成員函數(shù)設(shè)置ios類(lèi)的保護(hù)數(shù)據(jù)成員x_width的值。width()函數(shù)的設(shè)置值只對(duì)下一個(gè)輸出有效。(6)fill()該函數(shù)的說(shuō)明如下:charfill([charch]);用于設(shè)置或返回(不帶參數(shù)時(shí))輸出的填充字符,也就是通過(guò)這個(gè)公共成員函數(shù)設(shè)置ios類(lèi)的保護(hù)數(shù)據(jù)成員x_fill的值,該成員的默認(rèn)值為空格。fill()函數(shù)的設(shè)置值一直有效,直到下一個(gè)fill()函數(shù)改變?cè)撝禐橹埂!纠糠治鲆韵鲁绦虻膱?zhí)行結(jié)果。#include<iostream.h>voidmain(){intn=123;doubled=1234.5678;cout.precision(10);cout.width(10);cout.fill('*');cout<<n<<endl;cout<<d<<endl;cout.precision(6);cout.width(6);cout<<n<<endl;cout<<d<<endl;}*******1231234.5678***1231234.57

右對(duì)齊13.2.2使用I/O操縱符除ios類(lèi)成員函數(shù)之外,C++的流類(lèi)庫(kù)還提供了另一種更方便的I/O格式化方法,這種方法使用一種稱(chēng)為操縱符的特殊函數(shù),操縱符的特點(diǎn)是可以直接包含在I/O表達(dá)式中。所有不帶形參的操縱符都定義在頭文件iostream.h中,而帶形參的操縱符則定義在頭文件iomanip.h中,因而使用相應(yīng)的操縱符就必須包含相應(yīng)的頭文件。表13.3列出了這些I/O操縱符。已在第3章已介紹,這是不再討論。13.3重載I/O運(yùn)算符C++的I/O系統(tǒng)的另一個(gè)優(yōu)點(diǎn)是可以重載I/O運(yùn)算符。通過(guò)重載I/O運(yùn)算符,可以建立適合于類(lèi)需要的輸入和輸出界面。I/O運(yùn)算符重載的實(shí)質(zhì)就是把用于變量輸入輸出的運(yùn)算符轉(zhuǎn)化為對(duì)于類(lèi)對(duì)象的輸入輸出操作。13.3.1重載輸出運(yùn)算符“<<”在C++中,輸出操作稱(chēng)為插入,“<<”稱(chēng)為插入運(yùn)算符。當(dāng)重載輸出運(yùn)算符“<<”用于輸出時(shí),相當(dāng)于創(chuàng)建一個(gè)插入符函數(shù)。插入符函數(shù)的格式如下:

friendostream&operator<<(ostream&stream,類(lèi)名&類(lèi)引用名){函數(shù)體;returnstream;}該插入符函數(shù)是以友元方式說(shuō)明的。其中的第一個(gè)參數(shù)是ostream類(lèi)對(duì)象的一個(gè)引用,即stream必須是一個(gè)輸出流?!邦?lèi)引用名”接收待輸出的對(duì)象。該函數(shù)返回ostream的一個(gè)引用stream?!昂瘮?shù)體”中給出實(shí)現(xiàn)該插入符重載目的的代碼。【例】分析以下程序的執(zhí)行結(jié)果。#include<iostream.h>classSample{intx,y;public:Sample(intm,intn){x=m;y=n;}friendostream&operator<<(ostream&stream,Sample&s){cout<<"x="<<s.x<<",y="<<s.y<<endl;returnstream;}};voidmain(){SampleA(1,2),B(3,4);cout<<A<<B;}x=1,y=2x=3,y=413.3.2重載輸入運(yùn)算符“>>”在C++中,“>>”運(yùn)算符稱(chēng)為提取運(yùn)算符,對(duì)它進(jìn)行重載的函數(shù)稱(chēng)為提取符函數(shù)。這個(gè)運(yùn)算符函數(shù)接收流的輸入信息。其格式如下:

friendistream&operator>>(istream&stream,類(lèi)名&類(lèi)引用名){函數(shù)體;returnstream;}該提取符函數(shù)是以友元方式說(shuō)明的。其中的第一個(gè)參數(shù)是istream類(lèi)對(duì)象的一個(gè)引用,即stream必須是一個(gè)輸入流?!邦?lèi)引用名”接收輸入對(duì)象的引用。該函數(shù)返回istream的一個(gè)引用stream。“函數(shù)體”中給出實(shí)現(xiàn)該提取符重載目的的代碼?!纠糠治鲆韵鲁绦虻膱?zhí)行結(jié)果。#include<iostream.h>classSample{intx,y;public:Sample(){}friendistream&operator>>(istream&stream,Sample&s){cout<<"輸入x和y的值"<<endl;cout<<"x:";stream>>s.x;cout<<"y:";stream>>s.y;returnstream;}friendostream&operator<<(ostream&stream,Sample&s){cout<<"輸出x和y的值"<<endl;cout<<"x="<<s.x<<",y="<<s.y<<endl;returnstream;}};voidmain(){SampleA;cin>>A;cout<<A;}輸入x和y的值x:5<Enter>y:8<Enter>輸出x和y的值x=5,y=813.4檢測(cè)流操作的錯(cuò)誤在I/O流的操作過(guò)程中可能出現(xiàn)各種錯(cuò)誤,每一個(gè)流都有一個(gè)狀態(tài)標(biāo)志字,以指示是否發(fā)生了錯(cuò)誤以及出現(xiàn)了哪種類(lèi)型的錯(cuò)誤,這種處理技術(shù)與格式控制標(biāo)志字是相同的。ios類(lèi)定義了以下枚舉類(lèi)型:enumio_state{goodbit=0x00,//不設(shè)置任何位,一切正常eofbit=0x01,//輸入流已經(jīng)結(jié)束,無(wú)字符可讀入failbit=0x02,//上次讀/寫(xiě)操作失敗,但流仍可使用badbit=0x04,//試圖作無(wú)效的讀/寫(xiě)操作,流不再可用hardfail=0x80//不可恢復(fù)的嚴(yán)重錯(cuò)誤};對(duì)應(yīng)于這個(gè)標(biāo)志字各狀態(tài)位,ios類(lèi)還提供了以下成員函數(shù)來(lái)檢測(cè)或設(shè)置流的狀態(tài):intrdstate(); //返回流的當(dāng)前狀態(tài)標(biāo)志字inteof(); //返回非0值表示到達(dá)文件尾intfail(); //返回非0值表示操作失敗intbad(); //返回非0值表示出現(xiàn)錯(cuò)誤intgood(); //返回非0值表示流操作正常intclear(intflag=0); //將流的狀態(tài)設(shè)置為flag為提高程序的可靠性,我們應(yīng)在程序中檢測(cè)I/O流的操作是否正常。當(dāng)檢測(cè)到流操作出現(xiàn)錯(cuò)誤時(shí),可以通過(guò)異常處理來(lái)解決問(wèn)題。13.5文件流文件是存儲(chǔ)在磁盤(pán)、磁帶等外部設(shè)備上的數(shù)據(jù)集合,每一個(gè)文件都必須有一個(gè)惟一名字。使用文件前必須首先打開(kāi),使用完畢后必須關(guān)閉文件。對(duì)文件的操作是由文件流類(lèi)完成的。文件流類(lèi)在流與文件之間建立連接,使用這些文件流類(lèi)必須用#include編譯指令將頭文件fstream.h包含進(jìn)來(lái)。13.5.1文件的打開(kāi)與關(guān)閉流可以分為3類(lèi):輸入流、輸出流以及輸入/輸出流,相應(yīng)地必須將流說(shuō)明為ifstream、ofstream以及fstream類(lèi)的對(duì)象。例如:ifstreamifile; //說(shuō)明一個(gè)輸入流ofstreamofile; //說(shuō)明一個(gè)輸出流fstreamiofile; //說(shuō)明—個(gè)輸入/輸出流說(shuō)明了流對(duì)象之后,可使用函數(shù)open()打開(kāi)文件。文件的打開(kāi)即是在流與文件之間建立一個(gè)連接。open()的函數(shù)原型為:voidopen(constchar*filename,intmode,intprot=filebuf::openprot);其中,filename是文件名字,它可包含路徑說(shuō)明。mode說(shuō)明文件打開(kāi)的模式,它對(duì)文件的操作影響重大,mode的取值必須是以下值之一:?

ios::in打開(kāi)文件進(jìn)行讀操作?

ios::out打開(kāi)文件進(jìn)行寫(xiě)操作?

ios::ate打開(kāi)時(shí)文件指針定位到文件尾?

ios::app添加模式,所有增加都在文件尾部進(jìn)行?

ios::trunc如果文件已存在則清空原文件?

ios::nocreate如果文件不存在則打開(kāi)失敗?

ios::noreplace如果文件存在則打開(kāi)失敗?

ios::binary二進(jìn)制文件(非文本文件)對(duì)于ifstream流,mode的默認(rèn)值為ios::in;對(duì)于ofstream流,mode的默認(rèn)值為ios::out。prot決定文件的訪(fǎng)問(wèn)方式,取值如下:?

0普通文件?

1只讀文件?

2隱含文件?

4系統(tǒng)文件一般情況下,該訪(fǎng)問(wèn)方式使用默認(rèn)值。與其他狀態(tài)標(biāo)志一樣,mode的符號(hào)常量可以用位或運(yùn)算“|”組合在一起,如ios::in|ios::binary表示以只讀方式打開(kāi)二進(jìn)制文件。例如:ifstreamifile;ifile.open("c:\\vc\\abc.txt",ios::ate);表示以文本文件形式打開(kāi)C:\vc目錄下的abc.txt文件,文件指針定位到文件尾,準(zhǔn)備進(jìn)行讀文件操作。而操作:ofstreamofile;ofile.open("c:\\vc\\abc.txt",ios::binary);表示以二進(jìn)制文件形式打開(kāi)C:\vc目錄下的abc.txt文件,準(zhǔn)備進(jìn)行寫(xiě)文件操作。其中,文件名中“\\”的第一個(gè)“\”為轉(zhuǎn)義字符。除了open()成員函數(shù)外,ifstream、ofstream和fstream三類(lèi)流的構(gòu)造函數(shù)也可以打開(kāi)文件,其參數(shù)同open()函數(shù)。例如:ifstreamifile("c:\\vc\\abc.txt");說(shuō)明一個(gè)輸入流對(duì)象的同時(shí),將這個(gè)流與文件“c:\vc\abc.txt”連接起來(lái),使流ifile可以用文本形式對(duì)該文件進(jìn)行讀操作。13.5.2文件的讀寫(xiě)通過(guò)打開(kāi)文件就建立I/O流與文本文件的連接,之后就可以進(jìn)行文件的讀寫(xiě)操作了。1.文件讀寫(xiě)方法在C++中提供了幾種文件讀寫(xiě)方法。(1)使用流運(yùn)算符直接讀寫(xiě)。文件的讀/寫(xiě)操作可以直接使用流的插入運(yùn)算符“<<”和提取運(yùn)算符“>>”,這些運(yùn)算符將完成文件的字符轉(zhuǎn)換工作。

(2)使用流成員函數(shù)。常用的輸出流成員函數(shù)如下:

?put函數(shù)該函數(shù)把一個(gè)字符寫(xiě)到輸出流中。下面兩個(gè)語(yǔ)句默認(rèn)是相同的,但第二個(gè)受該流的格式化參數(shù)的影響:

cout.put('A');//精確地輸出一個(gè)字符cout<<'A';//輸出一個(gè)字符,但此前設(shè)置的寬度和填充方式在此起作用?write函數(shù)該函數(shù)把內(nèi)存中的一塊內(nèi)容寫(xiě)到一個(gè)輸出文件流中,長(zhǎng)度參數(shù)指出寫(xiě)的字節(jié)數(shù)。write函數(shù)當(dāng)遇到空字符時(shí)并不停止,因此能夠?qū)懭胪暾念?lèi)結(jié)構(gòu),該函數(shù)帶兩個(gè)參數(shù):一個(gè)char指針(指向內(nèi)存數(shù)據(jù)的起始地址)和一個(gè)所寫(xiě)的字節(jié)數(shù)。

注意,在該結(jié)構(gòu)對(duì)象的地址之前需要char做強(qiáng)制類(lèi)型轉(zhuǎn)換。常用的輸入流成員函數(shù)如下:

?

get函數(shù)該函數(shù)的功能與提取運(yùn)算符(>>)很相似,主要的不同點(diǎn)是get函數(shù)在讀取數(shù)據(jù)時(shí)包括空白字符,而提取運(yùn)算符在默認(rèn)情況下拒絕接受空白字符。

?getline函數(shù)該函數(shù)的功能是允許從輸入流中讀取多個(gè)字符,并且允許指定輸入終止字符(默認(rèn)值是換行字符),在讀取完成后,從讀取的內(nèi)容中刪除該終止字符。?read函數(shù)該函數(shù)從一個(gè)文件讀字節(jié)到一個(gè)指定的存儲(chǔ)器區(qū)域,由長(zhǎng)度參數(shù)確定要讀的字節(jié)數(shù)。雖然給出長(zhǎng)度參數(shù),但當(dāng)遇到文件結(jié)束或者在文本模式文件中遇到文件結(jié)束標(biāo)記字符時(shí)讀就結(jié)束。2.文本文件的讀寫(xiě)文本文件只適用于那些解釋為ASCII碼的文件。處理文本文件時(shí)將自動(dòng)作一些字符轉(zhuǎn)換,如輸出換行字符0x0A時(shí)將轉(zhuǎn)換為回車(chē)0x0D與換行0x0A兩個(gè)字符存入文本文件,讀入時(shí)也會(huì)將回車(chē)與換行兩個(gè)字符合并為一個(gè)換行字符,這樣內(nèi)存中的字符與寫(xiě)入文件中的字符之間就不再是一一對(duì)應(yīng)關(guān)系。文本文件的結(jié)束以ASCII碼的控制字符0x1A表示。【例】分析以下程序的執(zhí)行結(jié)果。#include<iostream.h>#include<fstream.h>intmain(){ofstreamofile("test");//打開(kāi)test文件用于寫(xiě),即輸出if(!ofile){cout<<"test文件不能打開(kāi)"<<endl;return0;}ofile<<"ThisbookisC++"<<""<<12345<<endl;ofile.close();ifstreamifile("test");//打開(kāi)test文件用于讀,即輸入if(!ifile){cout<<"test文件不能打開(kāi)"<<endl;return0;}charstr[80];ifile>>str;ifile.close();cout<<str<<endl;return1;}本程序先在當(dāng)前目錄下建立一個(gè)test文本文件,并寫(xiě)入“ThisbookisC++12345”數(shù)據(jù),然后打開(kāi)該文件,將其中的數(shù)據(jù)輸入到變量str中,由于讀時(shí)遇到空格時(shí)終止,所以str為“This”。程序的執(zhí)行結(jié)果如下:This【例】編寫(xiě)一個(gè)程序,將文本文件abc.txt復(fù)制到文本文件xyz.txt。解:使用輸入流成員函數(shù)get()從文本文件abc.txt中讀取一個(gè)字符ch,然后使用輸出流成員函數(shù)put()將字符ch寫(xiě)入文本文件xyz.txt中,繼續(xù)這一過(guò)程直到get()讀完為止。實(shí)現(xiàn)本例功能的程序如下:#include<iostream.h>#include<fstream.h>intmain(){ifstreamifile("abc.txt");charch;if(!ifile){cout<<"abc.txt文件不能打開(kāi)"<<endl;return0;}ofstreamofile("xyz.txt");if(!ofile){cout<<"xyz.txt文件不能打開(kāi)"<<endl;return0;}while(ifile.get(ch))ofile.put(ch);ifile.close();ofile.close();return1;}3.二進(jìn)制文件的讀寫(xiě)二進(jìn)制文件不同于文本文件,它可用于任何類(lèi)型的文件(包括文本文件),讀寫(xiě)二進(jìn)制文件的字符不作任何轉(zhuǎn)換,讀寫(xiě)的字符與文件之間是完全一致的。一般地,對(duì)二進(jìn)制文件的讀寫(xiě)可采用兩種方法:一種是使用get()和put();另一種是使用read()和write()?!纠恳韵鲁绦蚪⒁粋€(gè)輸出文件流并將一個(gè)Date結(jié)構(gòu)體變量的二進(jìn)制值寫(xiě)入到該文件中。#include<fstream.h>structDate{ intmo,da,yr;};voidmain(){Datedt={2,20,2001};ofstreamofile("data.dat",ios::binary);ofile.write((char*)&dt,sizeofdt);ofile.close();}4.文件的隨機(jī)讀寫(xiě)每一個(gè)文件都有兩個(gè)指針:一個(gè)是讀指針,說(shuō)明輸入操作當(dāng)前在文件中的位置;另一個(gè)是寫(xiě)指針,說(shuō)明下次寫(xiě)操作的當(dāng)前位置。每次執(zhí)行輸入或輸出時(shí),相應(yīng)的讀/寫(xiě)指針將自動(dòng)向后移動(dòng)。C++語(yǔ)言的文件流不僅可以按這種順序方式進(jìn)行讀/寫(xiě),而且還可以隨機(jī)地移動(dòng)文件的讀/寫(xiě)指針。有一些外部設(shè)備(如磁帶、行式打印機(jī)等)關(guān)聯(lián)的流只能作順序訪(fǎng)問(wèn),但在許多情況下使用隨機(jī)方式訪(fǎng)問(wèn)文件更加方便靈活。(1)輸出流隨機(jī)訪(fǎng)問(wèn)函數(shù)輸出流隨機(jī)訪(fǎng)問(wèn)函數(shù)有seekp和tellp。一個(gè)輸出文件流保存一個(gè)內(nèi)部指針以指出下一次寫(xiě)數(shù)據(jù)的位置。seekp成員函數(shù)設(shè)置這個(gè)指針,因此可以以隨機(jī)方式向磁盤(pán)文件輸出。tellp成員函數(shù)返回該文件位置指針值。這兩個(gè)成員函數(shù)的原型如下:ostream&ostream::seekp(流中的位置);ostream&ostream::seekp(偏移量,參照位置);streamposostream::tellp();其中,streampos被定義為long型,并以字節(jié)數(shù)為單位?!皡⒄瘴恢谩本哂腥缦潞x:?

cur=1相對(duì)于當(dāng)前寫(xiě)指針?biāo)付ǖ奈恢谩?

beg=0相對(duì)于流的開(kāi)始位置。?

end=2相對(duì)于流的結(jié)尾處。(2)輸入流隨機(jī)訪(fǎng)問(wèn)函數(shù)。輸入流隨機(jī)訪(fǎng)問(wèn)函數(shù)有seekg和tellg。在輸入文件流中,保留著一個(gè)指向文件中下一個(gè)將要讀數(shù)據(jù)的位置的內(nèi)部指針,可以用seekg函數(shù)來(lái)設(shè)置這個(gè)指針。使用seekg可以實(shí)現(xiàn)面向記錄的數(shù)據(jù)管理系統(tǒng),用固定長(zhǎng)度的記錄大小乘以記錄號(hào)便得到相對(duì)于文件末尾的字節(jié)位置,然后使用get讀這個(gè)記錄。tellg成員函數(shù)返回當(dāng)前文件讀指針的位置,這個(gè)值是streampos類(lèi)型,該typedef結(jié)構(gòu)定義在iostream.h中。這兩個(gè)成員函數(shù)的說(shuō)明原型如下:istream&istream::seekg(流中的位置);istream&istream::seekg(偏移量,參照位置);streamposistream::tellg();其中,streampos被定義為long型,并以字節(jié)數(shù)為單位?!皡⒄瘴恢谩本哂腥缦潞x:

?

cur=1相對(duì)于當(dāng)前讀指針?biāo)付ǖ奈恢谩?/p>

?

beg=0相對(duì)于流的開(kāi)始位置。

?

end=2相對(duì)于流的結(jié)尾處。【例】編寫(xiě)一個(gè)程序,在文件City.dat中輸入幾個(gè)城市的名稱(chēng)和區(qū)號(hào),并根據(jù)用戶(hù)輸入的區(qū)號(hào)查找對(duì)應(yīng)的城市。解

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論