




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章
C++的輸入和輸出
9.1C++為何建立自己的輸入輸出系統(tǒng)
因?yàn)樵贑++中用戶需要定義眾多的自定義類型,但C語(yǔ)言的輸入輸出系統(tǒng)不支持用戶自定義的類型。請(qǐng)看下面的類:
classmy_class{inti;floatf;char*str;}obj;對(duì)此類類型,在C語(yǔ)言中下面的語(yǔ)句是不能接受的:printf("%my_class",obj);使用C++的輸入輸出系統(tǒng),可通過重載”<<”和”>>”運(yùn)算符來(lái)解決以上問題;C++的流類比C的輸入輸出函數(shù)具有更大的優(yōu)越性。9.2C++的流庫(kù)及其基本結(jié)構(gòu)9.2.1C++的流
在C++中,流類是為輸入輸出提供的一組類,它們都放在流庫(kù)中。流總是與某一設(shè)備相聯(lián)系的(例如鍵盤、屏幕或硬盤等),通過使用流類中定義的方法,就可以完成對(duì)這些設(shè)備的輸入輸出操作。
流具有方向性:與輸入設(shè)備(如鍵盤)相聯(lián)系的流稱為輸入流;與輸出設(shè)備(如屏幕)相聯(lián)系的流稱為輸出流;與輸入輸出設(shè)備(如磁盤)相聯(lián)系的流稱為輸入輸出流。
C++中包含幾個(gè)預(yù)定義的流對(duì)象:標(biāo)準(zhǔn)輸入流cin 與標(biāo)準(zhǔn)輸入設(shè)備相關(guān)聯(lián)。缺省情況下,標(biāo)準(zhǔn)輸入設(shè)備是鍵盤。
標(biāo)準(zhǔn)輸出流cout
與標(biāo)準(zhǔn)輸出設(shè)備相關(guān)聯(lián),缺省情況下,標(biāo)準(zhǔn)輸出設(shè)備是屏幕。非緩沖型的標(biāo)準(zhǔn)出錯(cuò)流cerr
與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相關(guān)聯(lián)。非緩沖方式,直接向顯示器上輸出有關(guān)信息緩沖型的標(biāo)準(zhǔn)出錯(cuò)流clog
與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相關(guān)聯(lián)。緩沖方式,clog中的信息存放在緩沖區(qū)中,緩沖區(qū)滿后或遇endl時(shí)向顯示器輸出。9.2.2流類庫(kù)
C++流類庫(kù)具有兩個(gè)平行的基類:streambuf類和ios類,所有其他的流類都是從它們直接或間接地派生出來(lái)的其中:ios類為輸入輸出操作在用戶一方的接口,負(fù)責(zé)高層操作;streambuf類為輸入輸出操作在物理設(shè)備一方的接口,負(fù)責(zé)低層操作。
9.3預(yù)定義類型的輸入輸出
9.3.1無(wú)格式輸入輸出基于C++類庫(kù)的輸入輸出需使用兩個(gè)流對(duì)象cin和cout,還要用與之相配套的兩個(gè)輸入輸出運(yùn)算符“>>”和“<<”,其一般的格式為:
cin>>變量;
//輸人
cout<<常量或變量;
//輸出1.輸出運(yùn)算符從運(yùn)算符角度來(lái)看,輸出通過輸出運(yùn)算符“<<”來(lái)完成的。輸出運(yùn)算符“<<”也稱插入運(yùn)算符,它是一個(gè)雙目運(yùn)算符,有兩個(gè)操作數(shù),左操作數(shù)為ostream類的一個(gè)對(duì)象(如cout),右操作數(shù)為一個(gè)系統(tǒng)預(yù)定義類型的常量或變量。例如cout<<"Thisisastring.\n";完成的功能為:寫字符串“Thisisastring.”到流對(duì)象cout。(cout為標(biāo)準(zhǔn)輸出流,通常為屏幕。)2.輸入運(yùn)算符從運(yùn)算符角度來(lái)看,輸入操作通過輸入運(yùn)算符“>>”來(lái)完成。輸入運(yùn)算符“>>”也稱提取運(yùn)算符,也是一個(gè)雙目運(yùn)算符,有兩個(gè)操作數(shù),左面的操作數(shù)是istream類的一個(gè)對(duì)象(cin),右面的操作數(shù)是系統(tǒng)預(yù)定義的任何數(shù)據(jù)類型的變量。例如:intx;cin>>x;此時(shí),用戶從鍵盤輸入的數(shù)值會(huì)自動(dòng)地轉(zhuǎn)換為變量x的類型,并存入變量x內(nèi)。
9.3.2格式化輸入輸出
C++提供了兩種進(jìn)行格式控制的方法:一種是使用ios類中有關(guān)格式控制的成員函數(shù)進(jìn)行格式控制;另一種是使用稱為操縱符的特殊類型的函數(shù)進(jìn)行格式控制。
1.用ios類的成員函數(shù)進(jìn)行格式控制
1)狀態(tài)標(biāo)志字
格式控制主要是通過對(duì)狀態(tài)標(biāo)志字的操作來(lái)完成的。
在ios類的public部分定義了一個(gè)枚舉,它的每個(gè)成員分別定義狀態(tài)標(biāo)志字的一個(gè)位,每一位都稱為一個(gè)狀態(tài)標(biāo)志位。enum{skipws=0x0001,//跳過輸入中的空白,可用于輸出left=0x0002,//左對(duì)齊輸出,可用于輸出right=0x0004,//右對(duì)齊輸出,可用于輸出internal=0x0008,//在符號(hào)位和基指示符后填入字符,可用于輸出dec=0x0010,//轉(zhuǎn)換基制為十進(jìn)制數(shù),可用于輸入或輸出oct=0x0020,//轉(zhuǎn)換基制為八進(jìn)制數(shù),可用于輸入或輸出hex=0x0040,//轉(zhuǎn)換基制為十六進(jìn)制數(shù),可用于輸入或輸出showbase=0x0080,//在輸出時(shí)顯示基指示符,可用于輸入或輸出showpoint=0x0100,//在輸出時(shí)顯示小數(shù)點(diǎn),可用于輸出
uppercase=0x0200,//十六進(jìn)制輸出時(shí),表示制式//和表示數(shù)值的字符一律為大寫,可用于輸出showpos=0x0400,//對(duì)正整數(shù)顯示正號(hào),可用于輸出scientific=0x0800,//用科學(xué)表示法顯示浮點(diǎn)數(shù),可用于輸出fixed=0x1000,//用定點(diǎn)形式顯示浮點(diǎn)數(shù),可用于輸出unitbuf=0x2000,//在輸出操作后立即刷新所有流,可用于輸出stdio=0x4000,//在輸出操作后刷新stdout和stderr,可用于輸出};
這些枚舉元素的值有一個(gè)共同的特點(diǎn):分別使二進(jìn)制表示的狀態(tài)標(biāo)志字的不同位為“1”,例如:skipws0x00010000000000000001left0x00020000000000000010right0x00040000000000000100
2)控制輸入輸出格式的成員函數(shù)
函數(shù)原型功能longios∷setf(longflags);longios∷unsetf(longflags);longios∷flags();longios∷flags(longflags);intios∷width();intios∷width(intw);intios∷precision(intp);charios∷fill();charios∷fill(charch);設(shè)置狀態(tài)標(biāo)志flags清除狀態(tài)標(biāo)志,并返回前狀態(tài)標(biāo)志測(cè)試狀態(tài)標(biāo)志設(shè)置標(biāo)志flags,并返回前狀態(tài)標(biāo)志返回當(dāng)前的寬度設(shè)置值設(shè)置域?qū)抴,返回以前的設(shè)置設(shè)置小數(shù)位數(shù)p,返回以前的小數(shù)位數(shù)返回當(dāng)前的填充字符設(shè)置填充字符ch,返回當(dāng)前的填充字符例9.3成員函數(shù)進(jìn)行格式控制。
cout<<"x_width="<<cout.width()<<endl;cout<<"x_fill="<<cout.fill()<<endl;cout<<"x_precision="<<cout.precision()<<endl;cout<<123<<""<<123.45678<<endl;cout<<"_________________________________\n";程序運(yùn)行結(jié)果如下:x_width=0//默認(rèn)為0,按實(shí)際寬度輸出x_fill=//默認(rèn)取空格x_precision=0//默認(rèn)取0,按實(shí)際小數(shù)位數(shù)輸出123123.45678-----------------------------cout<<"***x_width=10,x_fill=,x_precision=4***\n";cout.width(10);cout.precision(4);cout<<123<<""<<123.45678<<""<<234.567<<endl;cout<<"x_width="<<cout.width()<<endl;cout<<"x_fill="<<cout.fill()<<endl;cout<<"x_precision="<<cout.precision()<<endl;cout<<"_________________________________\n";程序運(yùn)行結(jié)果如下:***x_width=10,x_fill=,x_precision=4***123123.4568234.567
x_width=0//所設(shè)置的域?qū)拑H對(duì)下一個(gè)流輸出操作有效,當(dāng)一次輸出操作完成后,域?qū)捰只謴?fù)為0x_fill=x_precision=4-----------------------------cout<<"***x_width=10,x_fill&,x_precision=4***\n";cout.fill(‘&’);cout.width(10);cout.precision(4);cout<<123<<""<<123.45678<<endl;
cout.setf(ios::left);//默認(rèn)時(shí)為右對(duì)齊cout.width(10); cout<<123<<""<<123.45678<<endl;cout<<"x_width="<<cout.width()<<endl;cout<<"x_fill="<<cout.fill()<<endl;cout<<"x_precision="<<cout.precision()<<endl;//設(shè)置了precision()和fill()后,在程序中一直有效,除非它們被重新設(shè)置程序運(yùn)行結(jié)果如下:***x_width=10,x_fill=&,x_precision=4***&&&&&&&123123.4568123&&&&&&&123.4568
x_width=0x_fill=&x_precision=4
C++提供的預(yù)定義操縱符如下:(1)dec以十進(jìn)制形式輸入或輸出整型數(shù)。
(2)hex以十六進(jìn)制形式輸入或輸出整型數(shù)。
(3)oct以八進(jìn)制形式輸入或輸出整型數(shù)。(4)ws用于在輸入時(shí)跳過前導(dǎo)的空白符,可用于輸入。(5)endl插入一個(gè)換行符并刷新輸出流,僅用于輸出。(6)ends插入一個(gè)空字符’\0’,通常用來(lái)結(jié)束一個(gè)字符串,僅用于輸出(7)flush刷新一個(gè)輸出流,僅用于輸出2.用C++提供的預(yù)定義的操縱符進(jìn)行輸入輸出格式控制(8)setbase(intn)設(shè)置轉(zhuǎn)換基格式為為n(n的取值為0、8、10或16,缺省為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為填充字符,缺省時(shí)為空格,可用于輸入或輸出(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;}
程序運(yùn)行結(jié)果為:123567①1231.234567e+02②1237b③7b
173④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重載輸出運(yùn)算符“<<”
定義輸出運(yùn)算符“<<”重載函數(shù)的一般格式如下:
ostream&operator<<(ostream&out,class_name&obj){out<<obj.item1;out<<obj.item2;...out<<obj.itemn;returnout;}
9.4用戶自定義類型的輸入輸出9.4.2重載輸入運(yùn)算符“>>”
定義輸入運(yùn)算符函數(shù)“>>”重載函數(shù)的一般格式如下:
istream&operator>>(istream&in,class_name&obj){in>>obj.item1;in>>obj.item2;...in>>obj.itemn;returnin;}
例9.7輸出運(yùn)算符“<<”重載。#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輸入運(yùn)算符“>>”重載。#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的對(duì)象obj cout<<obj;//輸出對(duì)象obj的成員值 cin>>obj;//輸入對(duì)象obj的各成員值,將原值覆蓋 cout<<obj;//輸出對(duì)象obj的成員值(新值) return0; }9.5文件的輸入輸出
9.5.1文件的打開與關(guān)閉1.文件的打開
為了對(duì)一個(gè)文件進(jìn)行讀寫操作,應(yīng)先“打開”該文件;在使用結(jié)束后,則應(yīng)“關(guān)閉”文件。
在C++中,打開一個(gè)文件,就是將這個(gè)文件與一個(gè)流建立關(guān)聯(lián);關(guān)閉一個(gè)文件,就是取消這種關(guān)聯(lián)。
要執(zhí)行文件的輸入輸出,須做三件事:(1)在程序中包含頭文件fstream.h;(2)建立流。建立流的過程就是定義流類的對(duì)象,例如:ifstreamin;ofstreamout;fstreamboth;分別定義了輸入流對(duì)象in;輸出流對(duì)象out;輸入輸出流對(duì)象both。
(3)使用open()函數(shù)打開文件,也就是使某一文件與上面的某一流相聯(lián)系。open()函數(shù)是上述三個(gè)流類的成員函數(shù),其原型是在fstream.h中定義的,原型為:
voidopen(constunsignedchar*filename,intmode,intaccess=filebuf::openprot);
filename:文件名,可包含路徑說(shuō)明。
Mode:文件打開的模式ios::in
打開文件進(jìn)行讀操作ios::out
打開文件進(jìn)行寫操作ios::ate
打開時(shí)文件指針定位到文件尾ios::app
添加模式,所有增加都在文件尾部ios::trunc如果文件已存在則清空原文件ios::nocreate
如果文件不存在則打開失敗ios::binary
二進(jìn)制文件(非文本文件)
對(duì)于ifstream流,mode的默認(rèn)值為ios::in;對(duì)于ofstream流,mode的默認(rèn)值為ios::out。Access:文件保護(hù)方式 filebuf::openprot兼容共享方式*filebuf::sh_none獨(dú)占不共享filebuf::sh_read允許讀共享filebuf::sh_write允許寫共享
2.文件的關(guān)閉在使用完一個(gè)文件后,應(yīng)該把它關(guān)閉。所謂關(guān)閉,實(shí)際上就是使打開的文件與流“脫鉤”。關(guān)閉文件可使用close()函數(shù)完成,close()函數(shù)也是流類中的成員函數(shù),它不帶參數(shù),不返回值。例如:
out.close();將關(guān)閉與流out相聯(lián)接的文件。9.5.2文件的讀寫
1.文本文件的讀寫一旦文件打開了,從文件中讀取文本數(shù)據(jù)與向文件中寫入文本數(shù)據(jù)都十分容易,只需使用運(yùn)算符“<<”與“>>”就可以了,只是必須用與文件相聯(lián)接的流代替cin和cout。
例9.9把一個(gè)整數(shù)、一個(gè)浮點(diǎn)數(shù)和一個(gè)字符串寫到磁盤文件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)流中只讀一個(gè)字節(jié),并把該值放入ch中并返回該流,當(dāng)?shù)竭_(dá)文件尾時(shí),使該流的值為0。
其它,如istream&get(char*,intnCount,chardelim)
//函數(shù)從輸入流中提取內(nèi)容,直到遇到文件結(jié)束,或遇到結(jié)束符delim,或已讀入nCount-1個(gè)字符.
istream&get(char*,int)put()函數(shù)的原型如下:
ostream&put(charch);put()函數(shù)將ch寫入流中并返回該流。例9.11將‘a(chǎn)’至‘z’的26個(gè)英文字母寫入文件,而后從該文件中讀出并顯示出來(lái)。#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> #inc
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)品加盟合同樣本樣本
- 公司訂購(gòu)電梯合同樣本
- 2013家裝合同標(biāo)準(zhǔn)文本
- 光伏運(yùn)營(yíng)合同樣本
- 公園椅子設(shè)備采購(gòu)合同標(biāo)準(zhǔn)文本
- 企業(yè)畫冊(cè)制作合同樣本
- 全包裝俢合同樣本
- 個(gè)人酒水購(gòu)銷合同樣本
- 中空錨桿合同樣本
- 住人集裝箱定做合同標(biāo)準(zhǔn)文本
- 《紅軍長(zhǎng)征與遵義會(huì)議》開辟新的發(fā)展道路課件
- 汽車坡道玻璃雨棚施工方案
- 標(biāo)準(zhǔn)化知識(shí)競(jìng)賽考試題庫(kù)(含答案)
- 3歲入園期陪孩子順利走進(jìn)幼兒園
- 年產(chǎn)10噸功能益生菌凍干粉的工廠設(shè)計(jì)改
- 噴砂崗位風(fēng)險(xiǎn)告知牌
- 《歌唱》天長(zhǎng)地久 第三課時(shí) 《倫敦德里小調(diào)》教學(xué)設(shè)計(jì)
- 小學(xué)科學(xué)實(shí)驗(yàn)教學(xué)論文4篇
- 踝骨骨折病人的護(hù)理
- 行政村村委會(huì)主任補(bǔ)選主持詞
- 松材線蟲病檢測(cè)技術(shù)
評(píng)論
0/150
提交評(píng)論