第九章 C++的輸入和輸出_第1頁
第九章 C++的輸入和輸出_第2頁
第九章 C++的輸入和輸出_第3頁
第九章 C++的輸入和輸出_第4頁
第九章 C++的輸入和輸出_第5頁
已閱讀5頁,還剩38頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第9章

C++的輸入和輸出

9.1C++為何建立自己的輸入輸出系統(tǒng)

因為在C++中用戶需要定義眾多的自定義類型,但是C語言的輸入輸出系統(tǒng)不支持用戶自定義的類型。請看下面的類:classmy_class{

inti;floatf;char*str;}obj;

對此類類型,在C語言中下面的語句是不能接受的:

printf("%my_class",obj);C++的流類比C的輸入輸出函數(shù)具有更大的優(yōu)越性。

9.2C++的流庫及其基本結(jié)構(gòu)

9.2.1C++的流

凡是數(shù)據(jù)從一個地方傳輸?shù)搅硪粋€地方的操作都是流的操作。流總是與某一設(shè)備相聯(lián)系的(例如鍵盤、屏幕或硬盤等),通過使用流類中定義的方法,就可以完成對這些設(shè)備的輸入輸出操作。流具有方向性:與輸入設(shè)備(如鍵盤)相聯(lián)系的流稱為輸入流;與輸出設(shè)備(如屏幕)相聯(lián)系的流稱為輸出流;與輸入輸出設(shè)備(如磁盤)相聯(lián)系的流稱為輸入輸出流。

在C++程序中,對數(shù)據(jù)的輸入輸出是以字節(jié)流實現(xiàn)的。在輸入操作中,字節(jié)序列從輸入設(shè)備流向內(nèi)存;在輸出操作中,字節(jié)序列從內(nèi)存流向輸出設(shè)備。在C++中,流類是為輸入輸出提供的一組類,它們都放在流庫中。

文件(File)是一個物理概念,代表存儲著信息集合的某個外部介質(zhì),它是C++語言對具體設(shè)備的抽象。例如,磁盤文件,顯示器,鍵盤。

當(dāng)程序與一個文件交換信息時,必須通過“打開文件”的操作將一個文件與一個流(類對象)聯(lián)系起來。一旦建立了這種聯(lián)系,以后對該流(類對象)的訪問就是對該文件的訪問,也就是對一個具體設(shè)備的訪問。可通過“關(guān)閉文件”的操作將一個文件與流(類對象)的聯(lián)系斷開。

3.C++的基本流類庫

頭文件“iostream.h”中說明(預(yù)定義)了一批基本流類:

ios--基本流類的基類;

istream--由ios派生,支持輸入(提取“>>”)操作;ostream--由ios派生,支持輸出(插入“<<”)操作;iostream--由istream與ostream共同派生,支持輸入和輸出雙向操作。

C++預(yù)定義的流有:istreamcin;--對象cin對應(yīng)于鍵盤文件ostreamcout;--對象cout對應(yīng)于顯示器文件ostreamcerr;--對象cerr對應(yīng)于顯示器文件ostreamclog;--對象clog對應(yīng)于顯示器文件程序中可直接對上述4個預(yù)定義流類對象進(jìn)行讀寫,而不必先進(jìn)行“打開文件”的操作,使用完后也不需要進(jìn)行“關(guān)閉文件”的操作。(因為這些流類對象與文件之間的聯(lián)系是預(yù)定義好的,可認(rèn)為系統(tǒng)已為每一程序都隱含進(jìn)行了對它們的打開與關(guān)閉操作)。

Cerr和clog都是用來輸出出錯信息的。Cerr是不經(jīng)過緩沖區(qū),直接向顯示器輸出有關(guān)信息。Clog中的信息存放在緩存區(qū)中,緩沖區(qū)滿后或遇上endl時,向顯示器輸出。4.C++的文件流類庫

從邏輯概念上來說,普通磁盤文件與標(biāo)準(zhǔn)設(shè)備(鍵盤、顯示器)文件沒有本質(zhì)的區(qū)別,標(biāo)準(zhǔn)流cin、cout等與文件流大致相當(dāng)。不過,在具體細(xì)節(jié)上還是有些區(qū)別。因此,在頭文件“fstream.h”中說明(預(yù)定義)了一批文件流類,專用于磁盤文件:

ifstream--由istream派生,支持從磁盤文件中輸入(讀入)數(shù)據(jù);ofstream--由ostream派生,支持往磁盤文件中輸出(寫出)數(shù)據(jù);fstream--由iostream派生,支持對磁盤文件進(jìn)行輸入和輸出數(shù)據(jù)的雙向操作。C++中沒有預(yù)定義的文件流(類對象),程序中用到的所有文件流類對象都要進(jìn)行自定義。9.3預(yù)定義類型的輸入輸出

9.3.1無格式輸入輸出基于C++類庫的輸入輸出需使用兩個流對象cin和cout,還要用與之相配套的兩個輸入輸出運算符“>>”和“<<”,其一般的格式為

cin>>變量;//輸人

cout<<常量或變量;//輸出

9.3.2格式化輸入輸出

C++提供了兩種進(jìn)行格式控制的方法:1.使用ios類中有關(guān)格式控制的成員函數(shù)進(jìn)行格式控制;2.使用稱為操縱符的特殊類型的函數(shù)進(jìn)行格式控制。

1.用ios類的成員函數(shù)進(jìn)行格式控制

格式控制主要是通過對狀態(tài)標(biāo)志字的操作來完成的。在ios類的public部分定義了一個枚舉,它的每個成員分別定義狀態(tài)標(biāo)志字的一個位,每一位都稱為一個狀態(tài)標(biāo)志位。enum{skipws=0x0001.//跳過輸入中的空白,可用于輸出left=0x0002.//左對齊輸出,可用于輸出right=0x0004.//右對齊輸出,可用于輸出internal=0x0008.//在符號位和基指示符后填入字符,可用于輸出dec=0x0010.//轉(zhuǎn)換基制為十進(jìn)制數(shù),可用于輸入或輸出oct=0x0020.//轉(zhuǎn)換基制為八進(jìn)制數(shù),可用于輸入或輸出hex=0x0040.//轉(zhuǎn)換基制為十六進(jìn)制數(shù),可用于輸入或輸出showbase=0x0080.//在輸出時顯示基指示符,可用于輸入或輸出showpoint=0x0100.//在輸出時顯示小數(shù)點,可用于輸出

uppercase=0x0200.//在以科學(xué)表示法格式E和以十六進(jìn)制輸出字母時,用大寫表示,用于輸出。showpos=0x0400.//對正整數(shù)顯示正號,可用于輸出scientific=0x0800.//用科學(xué)表示法顯示浮點數(shù),可用于輸出fixed=0x1000.//用定點形式顯示浮點數(shù),可用于輸出unitbuf=0x2000.//在輸出操作后立即刷新所有流,可用于輸出stdio=0x4000.//在輸出操作后刷新stdout和stderr,可用于輸出};

表1控制輸入輸出格式的成員函數(shù)

函數(shù)原型

功能

longios∷setf(longflags);longios∷unsetf(longflags);intios∷width(intw);intios∷precision(intp);charios∷fill(charch);設(shè)置狀態(tài)標(biāo)志flags清除狀態(tài)標(biāo)志,并返回前狀態(tài)標(biāo)志設(shè)置域?qū)抴,返回以前的設(shè)置設(shè)置小數(shù)位數(shù)p,返回以前的小數(shù)位數(shù)設(shè)置填充字符ch,返回當(dāng)前的填充字符C++提供的預(yù)定義操縱符如下:(1)dec以十進(jìn)制形式輸入或輸出整型數(shù),可用于輸入或輸出。(2)hex以十六進(jìn)制形式輸入或輸出整型數(shù),可用于輸入或輸出。(3)oct以八進(jìn)制形式輸入或輸出整型數(shù),可用于輸入或輸出。(4)ws用于在輸入時跳過前導(dǎo)的空白符,可用于輸入。(5)endl插入一個換行符并刷新輸出流,僅用于輸出。(6)ends插入一個空字符’\0’,通常用來結(jié)束一個字符串,用于輸出(7)flush刷新一個輸出流,僅用于輸出2使用預(yù)定義的操縱符進(jìn)行輸入輸出格式控制(8)setbase(intn)設(shè)置轉(zhuǎn)換基格式為為n(n的取值為0、8、10或16),n的缺省值為0,即表示采用十進(jìn)制,僅用于輸出。(9)resetiosflags(longf)關(guān)閉由參數(shù)f指定的格式標(biāo)志,可用于輸入或輸出(10)setiosflags(longf)設(shè)置由參數(shù)f指定的格式標(biāo)志,可用于輸入或輸出(11)setfill(intch)設(shè)置ch為填充字符,缺省時為空格,可用于輸入或輸出(12)setprecision(intn)設(shè)置小數(shù)部分的位數(shù),可用于輸入或輸出(13)setw(intn)設(shè)置域?qū)挒閚,可用于輸入或輸出

例9.4操縱符的使用。 #include<iostream.h> #include<iomanip.h> main() {cout<<setw(10)<<123<<567<<endl;//① cout<<123<<setiosflags(ios::scientific)<<setw(20)//② <<123.456789<<endl; cout<<123<<setw(10)<<hex<<123<<endl;//③ cout<<123<<setw(10)<<oct<<123<<endl;//④ cout<<123<<setw(10)<<dec<<123<<endl;//⑤ cout<<resetiosflags(ios::scientific)<<setprecision(4)//⑥ <<123.456789<<endl; cout<<setiosflags(ios::left)<<setfill('#')<<setw(8)//⑦ <<123<<endl; cout<<resetiosflags(ios::left)<<setfill('$')<<setw(8)//⑧ <<456<<endl; return0;}

程序運行結(jié)果為:123567①1231.234567e+02②1237b③7b173④173123⑤123.4568⑥123#####⑦$$$$$456⑧3.用戶自定義的操縱符

若為輸出流定義操縱符函數(shù),則定義形式如下:

ostream&manip_name(ostream&stream){…//自定義代碼returnstream;}

若為輸入流定義操縱符函數(shù),則定義形式如下:

istream&manip_name(istream&stream){…//自定義代碼returnstream;}例9.5為輸出流定義操縱符函數(shù)。 #include<iostream.h> #include<iomanip.h> ostream&output1(ostream&stream) {stream.setf(ios::left); stream<<setw(10)<<hex<<setfill(’&’); returnstream; } intmain() {cout<<123<<endl; cout<<output1<<123<<endl; return0; }例9.6為輸入流定義操縱符函數(shù)。 #include<iostream.h> #include<iomanip.h> istream&input1(istream&in) {in>>hex; cout<<"Enternumberusinghexformat:"; returnin; } intmain() {inti; cin>>input1>>i; cout<<"***"<<hex<<i<<"***"<<dec<<i<<"***"<<endl; return0; }9.4.1重載輸出運算符“<<”

定義輸出運算符“<<”重載函數(shù)的一般格式如下:

ostream&operator<<(ostream&out,class_name&obj){out<<obj.item1;out<<obj.item2;...out<<obj.itemn;returnout;}

9.4.2重載輸入運算符“>>”

定義輸入運算符函數(shù)“>>”重載函數(shù)的一般格式如下:

istream&operator>>(istream&in,class_name&obj){in>>obj.item1;in>>obj.item2;...in>>obj.itemn;returnin;}

例9.7輸出運算符“<<”重載。#include<iostream.h>classcoord{intx,y;public:coord(inti=0,intj=0){x=i;y=j;}friendostream&operator<<(ostream&stream,coord&ob);};ostream&operator<<(ostream&stream,coord&ob){stream<<ob.x<<","<<ob.y<<endl;returnstream;}main(){coorda(55,66),b(100,200);cout<<a<<b;return0;}例9.8輸入運算符“<<”重載。#include<iostream.h>classthree_d{ public:three_d(inta,intb,intc) {x=a;y=b;z=c;}friendostream&operator<<(ostream&output,three_d&ob);friendistream&operator>>(istream&itput,three_d&ob);private:intx,y,z; }; ostream&operator<<(ostream&output,three_d&ob) {output<<ob.x<<","; output<<ob.y<<","; output<<ob.z<<endl; returnoutput; }

istream&operator>>(istream&input,three_d&ob) { cout<<"Enterx,y,zvalue:"; input>>ob.x; input>>ob.y; input>>ob.z; returninput; } main() { three_dobj(10,20,30);//定義類three_d的對象obj cout<<obj;//輸出對象obj的成員值 cin>>obj;//輸入對象obj的各成員值,將原值覆蓋 cout<<obj;//輸出對象obj的成員值(新值) return0; }9.5文件的輸入輸出在一個程序中當(dāng)需要進(jìn)行標(biāo)準(zhǔn)I/O操作時,則必須包含頭文件iostream.h。當(dāng)需要進(jìn)行文件I/O操作時,則必須包含頭文件fstream.h。C++中沒有預(yù)定義的文件流類對象(如cin、cout對象),要進(jìn)行文件的讀寫,首先必須建立一個文件流對象,然后把這個流對象與實際文件相關(guān)聯(lián)(稱為打開文件)。一旦流與文件連接后,就可以使用流類的各種功能對文件操作。對文件操作完成后,需要關(guān)閉文件。

對自定義磁盤文件進(jìn)行讀寫的一般處理過程:創(chuàng)建文件流對象=>打開文件=>讀寫操作=>關(guān)閉文件。9.5.1文件的打開與關(guān)閉1.文件的打開為了對一個文件進(jìn)行讀寫操作,應(yīng)先“打開”該文件;在使用結(jié)束后,則應(yīng)“關(guān)閉”文件。在C++中,打開一個文件,就是將這個文件與一個流建立關(guān)聯(lián);關(guān)閉一個文件,就是取消這種關(guān)聯(lián)。

要執(zhí)行文件的輸入輸出,須做三件事:(1)在程序中包含頭文件fstream.h;(2)建立流。建立流的過程就是定義流類的對象,例如:ifstreamin;ofstreamout;fstreamboth;分別定義了輸入流對象in;輸出流對象out,輸入輸出流對象both。(3)打開文件文件的打開有兩種方式。(1)利用流對象的構(gòu)造函數(shù)打開文件。(2)利用open函數(shù)打開文件。open()函數(shù)是定義在類ifstream、ofstream和fstream中的成員函數(shù)。文件流對象.open(文件名,使用方式)打開方式1舉例:

ofstreamoutfile1("myfile1.txt");

創(chuàng)建ofstream類的對象outfile1;使流類對outfile1與磁盤文件“myfile1.txt”相聯(lián)系;并打開用于“寫”(輸出)的磁盤文件"myfile1.txt"。打開方式2舉例:

ofstreamoutfile1;//創(chuàng)建ofstream類的對象outfile1outfile1.open(“myfile1.txt”,ios::out);//顯式調(diào)用成員函數(shù)open來打開文件文件的輸入輸出方式參數(shù)有默認(rèn)值,對于類ifstream,文件使用方式的默認(rèn)值為ios::in,而對于類ofstream,文件使用方式的默認(rèn)值為ios::out.文件打開方式作用ios::in打開一個輸入文件。用這個標(biāo)志作為ifstream的打開方式,可避免刪除一個已有的文件中的內(nèi)容ios::out打開一個輸出文件,對于ofstream對象,該方式是隱含的ios::app以輸入方式打開文件,寫入的數(shù)據(jù)添加到文件尾部ios::ate打開一個已有文件,把文件指針移到文件結(jié)尾ios::nocreate如果一個文件已存在,則打開它,否則失敗ios::noreplace打開一個文件,若文件不存在,則建立新文件,若文件存在,則打開失敗。ios::trunc打開一個文件。如果文件存在,刪除舊的文件。若文件不存在,則建立新文件。ios::binary打開一個二進(jìn)制文件,如果不指定此方式,默認(rèn)為文本文件表2文件打開方式(4)進(jìn)行讀寫操作。在建立(或打開)的文件基礎(chǔ)上執(zhí)行所要求的輸入或輸出操作。(5)文件的關(guān)閉在使用完一個文件后,應(yīng)該把它關(guān)閉。所謂關(guān)閉,實際上就是使打開的文件與流“脫鉤”。關(guān)閉文件可使用close()函數(shù)完成,close()函數(shù)也是流類中的成員函數(shù),它不帶參數(shù),不返回值。例如:out.close();將關(guān)閉與流out相聯(lián)接的文件。

9.5.2文件的讀寫

1.文本文件的讀寫一旦文件打開了,從文件中讀取文本數(shù)據(jù)與向文件中寫入文本數(shù)據(jù)都十分容易,只需使用運算符“<<”與“>>”就可以了,只是你必須用與文件相聯(lián)接的流代替cin和cout。

例9.9把一個整數(shù)、一個浮點數(shù)和一個字符串寫到磁盤文件test中。#include<fstream.h> intmain() {ofstreamfout("test"); if(!fout) {cout<<"Cannotopenoutputfile\n,"; return1; } fout<<10<<""<<123.456<<"\"Thisisatextfile.\"\n"; fout.close(); return0; }

2.二進(jìn)制文件的讀寫

(1)用get()函數(shù)和put()函數(shù)讀寫二進(jìn)制文件get()函數(shù)有許多格式,其中最常用的版本原型如下:

istream&get(char&ch);get()函數(shù)從相關(guān)流中只讀一個字節(jié),并把該值放入ch中并返回該流,當(dāng)?shù)竭_(dá)文件尾時,使該流的值為0。put()函數(shù)的原型如下:

ostream&put(charch);put()函數(shù)將ch寫入流中并返回該流。例9.11將‘a(chǎn)’至‘z’的26個英文字母寫入文件,而后從該文件中讀出并顯示出來。#include<iostream.h>#include<fstream.h>voidtest_write(){ofstreamfs("d:\\test.dat"); inti; charc='a'; for(i=0;i<26;i++){fs.put(c);c++;}}voidtest_read(){ifstreamfs("d:\\test.dat"); charc; while(fs.get(c))cout<<c;}voidmain(){test_write();test_read();}(2)用read()函數(shù)和write()函數(shù)讀寫二進(jìn)制文件

read()和write()原型如下:

istream&read(unsignedchar*buf,intnum);ostream&write(constunsignedchar*buf,intnum);例9-12用write()函數(shù)向文件test中寫入整數(shù)與雙精度數(shù)。 #include<iostream.h> #incl

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論