




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第9章
C++的輸入和輸出
9.1C++為何建立自己的輸入輸出系統
因為在C++中用戶需要定義眾多的自定義類型,但是C語言的輸入輸出系統不支持用戶自定義的類型。請看下面的類:classmy_class{
inti;floatf;char*str;}obj;
對此類類型,在C語言中下面的語句是不能接受的:
printf("%my_class",obj);C++的流類比C的輸入輸出函數具有更大的優越性。
9.2C++的流庫及其基本結構
9.2.1C++的流
凡是數據從一個地方傳輸到另一個地方的操作都是流的操作。流總是與某一設備相聯系的(例如鍵盤、屏幕或硬盤等),通過使用流類中定義的方法,就可以完成對這些設備的輸入輸出操作。流具有方向性:與輸入設備(如鍵盤)相聯系的流稱為輸入流;與輸出設備(如屏幕)相聯系的流稱為輸出流;與輸入輸出設備(如磁盤)相聯系的流稱為輸入輸出流。
在C++程序中,對數據的輸入輸出是以字節流實現的。在輸入操作中,字節序列從輸入設備流向內存;在輸出操作中,字節序列從內存流向輸出設備。在C++中,流類是為輸入輸出提供的一組類,它們都放在流庫中。
文件(File)是一個物理概念,代表存儲著信息集合的某個外部介質,它是C++語言對具體設備的抽象。例如,磁盤文件,顯示器,鍵盤。
當程序與一個文件交換信息時,必須通過“打開文件”的操作將一個文件與一個流(類對象)聯系起來。一旦建立了這種聯系,以后對該流(類對象)的訪問就是對該文件的訪問,也就是對一個具體設備的訪問。可通過“關閉文件”的操作將一個文件與流(類對象)的聯系斷開。
3.C++的基本流類庫
頭文件“iostream.h”中說明(預定義)了一批基本流類:
ios--基本流類的基類;
istream--由ios派生,支持輸入(提取“>>”)操作;ostream--由ios派生,支持輸出(插入“<<”)操作;iostream--由istream與ostream共同派生,支持輸入和輸出雙向操作。
C++預定義的流有:istreamcin;--對象cin對應于鍵盤文件ostreamcout;--對象cout對應于顯示器文件ostreamcerr;--對象cerr對應于顯示器文件ostreamclog;--對象clog對應于顯示器文件程序中可直接對上述4個預定義流類對象進行讀寫,而不必先進行“打開文件”的操作,使用完后也不需要進行“關閉文件”的操作。(因為這些流類對象與文件之間的聯系是預定義好的,可認為系統已為每一程序都隱含進行了對它們的打開與關閉操作)。
Cerr和clog都是用來輸出出錯信息的。Cerr是不經過緩沖區,直接向顯示器輸出有關信息。Clog中的信息存放在緩存區中,緩沖區滿后或遇上endl時,向顯示器輸出。4.C++的文件流類庫
從邏輯概念上來說,普通磁盤文件與標準設備(鍵盤、顯示器)文件沒有本質的區別,標準流cin、cout等與文件流大致相當。不過,在具體細節上還是有些區別。因此,在頭文件“fstream.h”中說明(預定義)了一批文件流類,專用于磁盤文件:
ifstream--由istream派生,支持從磁盤文件中輸入(讀入)數據;ofstream--由ostream派生,支持往磁盤文件中輸出(寫出)數據;fstream--由iostream派生,支持對磁盤文件進行輸入和輸出數據的雙向操作。C++中沒有預定義的文件流(類對象),程序中用到的所有文件流類對象都要進行自定義。9.3預定義類型的輸入輸出
9.3.1無格式輸入輸出基于C++類庫的輸入輸出需使用兩個流對象cin和cout,還要用與之相配套的兩個輸入輸出運算符“>>”和“<<”,其一般的格式為
cin>>變量;//輸人
cout<<常量或變量;//輸出
9.3.2格式化輸入輸出
C++提供了兩種進行格式控制的方法:1.使用ios類中有關格式控制的成員函數進行格式控制;2.使用稱為操縱符的特殊類型的函數進行格式控制。
1.用ios類的成員函數進行格式控制
格式控制主要是通過對狀態標志字的操作來完成的。在ios類的public部分定義了一個枚舉,它的每個成員分別定義狀態標志字的一個位,每一位都稱為一個狀態標志位。enum{skipws=0x0001.//跳過輸入中的空白,可用于輸出left=0x0002.//左對齊輸出,可用于輸出right=0x0004.//右對齊輸出,可用于輸出internal=0x0008.//在符號位和基指示符后填入字符,可用于輸出dec=0x0010.//轉換基制為十進制數,可用于輸入或輸出oct=0x0020.//轉換基制為八進制數,可用于輸入或輸出hex=0x0040.//轉換基制為十六進制數,可用于輸入或輸出showbase=0x0080.//在輸出時顯示基指示符,可用于輸入或輸出showpoint=0x0100.//在輸出時顯示小數點,可用于輸出
uppercase=0x0200.//在以科學表示法格式E和以十六進制輸出字母時,用大寫表示,用于輸出。showpos=0x0400.//對正整數顯示正號,可用于輸出scientific=0x0800.//用科學表示法顯示浮點數,可用于輸出fixed=0x1000.//用定點形式顯示浮點數,可用于輸出unitbuf=0x2000.//在輸出操作后立即刷新所有流,可用于輸出stdio=0x4000.//在輸出操作后刷新stdout和stderr,可用于輸出};
表1控制輸入輸出格式的成員函數
函數原型
功能
longios∷setf(longflags);longios∷unsetf(longflags);intios∷width(intw);intios∷precision(intp);charios∷fill(charch);設置狀態標志flags清除狀態標志,并返回前狀態標志設置域寬w,返回以前的設置設置小數位數p,返回以前的小數位數設置填充字符ch,返回當前的填充字符C++提供的預定義操縱符如下:(1)dec以十進制形式輸入或輸出整型數,可用于輸入或輸出。(2)hex以十六進制形式輸入或輸出整型數,可用于輸入或輸出。(3)oct以八進制形式輸入或輸出整型數,可用于輸入或輸出。(4)ws用于在輸入時跳過前導的空白符,可用于輸入。(5)endl插入一個換行符并刷新輸出流,僅用于輸出。(6)ends插入一個空字符’\0’,通常用來結束一個字符串,用于輸出(7)flush刷新一個輸出流,僅用于輸出2使用預定義的操縱符進行輸入輸出格式控制(8)setbase(intn)設置轉換基格式為為n(n的取值為0、8、10或16),n的缺省值為0,即表示采用十進制,僅用于輸出。(9)resetiosflags(longf)關閉由參數f指定的格式標志,可用于輸入或輸出(10)setiosflags(longf)設置由參數f指定的格式標志,可用于輸入或輸出(11)setfill(intch)設置ch為填充字符,缺省時為空格,可用于輸入或輸出(12)setprecision(intn)設置小數部分的位數,可用于輸入或輸出(13)setw(intn)設置域寬為n,可用于輸入或輸出
例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;}
程序運行結果為:123567①1231.234567e+02②1237b③7b173④173123⑤123.4568⑥123#####⑦$$$$$456⑧3.用戶自定義的操縱符
若為輸出流定義操縱符函數,則定義形式如下:
ostream&manip_name(ostream&stream){…//自定義代碼returnstream;}
若為輸入流定義操縱符函數,則定義形式如下:
istream&manip_name(istream&stream){…//自定義代碼returnstream;}例9.5為輸出流定義操縱符函數。 #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為輸入流定義操縱符函數。 #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重載輸出運算符“<<”
定義輸出運算符“<<”重載函數的一般格式如下:
ostream&operator<<(ostream&out,class_name&obj){out<<obj.item1;out<<obj.item2;...out<<obj.itemn;returnout;}
9.4.2重載輸入運算符“>>”
定義輸入運算符函數“>>”重載函數的一般格式如下:
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文件的輸入輸出在一個程序中當需要進行標準I/O操作時,則必須包含頭文件iostream.h。當需要進行文件I/O操作時,則必須包含頭文件fstream.h。C++中沒有預定義的文件流類對象(如cin、cout對象),要進行文件的讀寫,首先必須建立一個文件流對象,然后把這個流對象與實際文件相關聯(稱為打開文件)。一旦流與文件連接后,就可以使用流類的各種功能對文件操作。對文件操作完成后,需要關閉文件。
對自定義磁盤文件進行讀寫的一般處理過程:創建文件流對象=>打開文件=>讀寫操作=>關閉文件。9.5.1文件的打開與關閉1.文件的打開為了對一個文件進行讀寫操作,應先“打開”該文件;在使用結束后,則應“關閉”文件。在C++中,打開一個文件,就是將這個文件與一個流建立關聯;關閉一個文件,就是取消這種關聯。
要執行文件的輸入輸出,須做三件事:(1)在程序中包含頭文件fstream.h;(2)建立流。建立流的過程就是定義流類的對象,例如:ifstreamin;ofstreamout;fstreamboth;分別定義了輸入流對象in;輸出流對象out,輸入輸出流對象both。(3)打開文件文件的打開有兩種方式。(1)利用流對象的構造函數打開文件。(2)利用open函數打開文件。open()函數是定義在類ifstream、ofstream和fstream中的成員函數。文件流對象.open(文件名,使用方式)打開方式1舉例:
ofstreamoutfile1("myfile1.txt");
創建ofstream類的對象outfile1;使流類對outfile1與磁盤文件“myfile1.txt”相聯系;并打開用于“寫”(輸出)的磁盤文件"myfile1.txt"。打開方式2舉例:
ofstreamoutfile1;//創建ofstream類的對象outfile1outfile1.open(“myfile1.txt”,ios::out);//顯式調用成員函數open來打開文件文件的輸入輸出方式參數有默認值,對于類ifstream,文件使用方式的默認值為ios::in,而對于類ofstream,文件使用方式的默認值為ios::out.文件打開方式作用ios::in打開一個輸入文件。用這個標志作為ifstream的打開方式,可避免刪除一個已有的文件中的內容ios::out打開一個輸出文件,對于ofstream對象,該方式是隱含的ios::app以輸入方式打開文件,寫入的數據添加到文件尾部ios::ate打開一個已有文件,把文件指針移到文件結尾ios::nocreate如果一個文件已存在,則打開它,否則失敗ios::noreplace打開一個文件,若文件不存在,則建立新文件,若文件存在,則打開失敗。ios::trunc打開一個文件。如果文件存在,刪除舊的文件。若文件不存在,則建立新文件。ios::binary打開一個二進制文件,如果不指定此方式,默認為文本文件表2文件打開方式(4)進行讀寫操作。在建立(或打開)的文件基礎上執行所要求的輸入或輸出操作。(5)文件的關閉在使用完一個文件后,應該把它關閉。所謂關閉,實際上就是使打開的文件與流“脫鉤”。關閉文件可使用close()函數完成,close()函數也是流類中的成員函數,它不帶參數,不返回值。例如:out.close();將關閉與流out相聯接的文件。
9.5.2文件的讀寫
1.文本文件的讀寫一旦文件打開了,從文件中讀取文本數據與向文件中寫入文本數據都十分容易,只需使用運算符“<<”與“>>”就可以了,只是你必須用與文件相聯接的流代替cin和cout。
例9.9把一個整數、一個浮點數和一個字符串寫到磁盤文件test中。#include<fstream.h> intmain() {ofstreamfout("test"); if(!fout) {cout<<"Cannotopenoutputfile\n,"; return1; } fout<<10<<""<<123.456<<"\"Thisisatextfile.\"\n"; fout.close(); return0; }
2.二進制文件的讀寫
(1)用get()函數和put()函數讀寫二進制文件get()函數有許多格式,其中最常用的版本原型如下:
istream&get(char&ch);get()函數從相關流中只讀一個字節,并把該值放入ch中并返回該流,當到達文件尾時,使該流的值為0。put()函數的原型如下:
ostream&put(charch);put()函數將ch寫入流中并返回該流。例9.11將‘a’至‘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()函數和write()函數讀寫二進制文件
read()和write()原型如下:
istream&read(unsignedchar*buf,intnum);ostream&write(constunsignedchar*buf,intnum);例9-12用write()函數向文件test中寫入整數與雙精度數。 #include<iostream.h> #incl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 油墨在觸摸屏印刷中的技術要求考核試卷
- 穿戴式設備在智能機器人控制中的應用考核試卷
- 液體乳制造考核試卷
- 電視購物節目的制作與傳播技巧考核試卷
- 筆的制造與環境保護法規遵循考核試卷
- 石油開采業的創新技術與智能解決方案研究考核試卷
- 棉麻紡織品國際貿易風險防范考核試卷
- 珠海市珠海二中、斗門一中高三上學期期中聯考生物試題
- 珠海三中高二下學期期中考試文科地理試題
- 上海市寶山中學2025年高三下學期物理試題4月開學考試卷含解析
- 科學控糖與健康體重管理
- 2025年江蘇省南京市中考《二次函數綜合》專題復習講義
- 2025年廣東省高三高考模擬測試二生物試卷(有答案)
- 安全生產材料購買合同協議
- 橋梁工程施工檢驗測試計劃
- 四川農商銀行招聘筆試真題2024
- 右足底皮膚裂傷護理查房
- 淘寶商家押金協議書
- 2025年普通高中學業水平選擇性考試沖刺壓軸卷一英語試卷(含答案)
- 血液檢驗 3.2017-正常骨髓細胞形態學-陳學東-20170515173650 學習資料
- 陜西師大附中2025年高三5月總復習質檢(二模)生物試題含解析
評論
0/150
提交評論