




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第9章I/O流類庫1主要內容基本概念C++的基本流類結構istream類和ostream類格式控制文件的讀/寫可流類29.1基本概念設備間的數據傳送內存顯示屏內存文件鍵盤內存文件內存鍵盤文件輸出輸入39.1基本概念流面向對象技術中,任何設備都可以表示為相應類的對象,設備之間的數據傳送即對象之間的數據傳送。數據從源對象到目的對象的傳送可以抽象看做一個“流”。輸入流:表示數據從某個設備傳送到內存變量中。輸出流:表示數據從內存變量傳送到某個設備中。49.1基本概念流類把實現設備之間信息交換的類稱作流類。根據一個流類定義的對象也時常被稱為流。
C++預定義流標準輸入流cin(缺省為鍵盤)標準輸出流cout(顯示終端)非緩沖型的標準出錯流cerr(顯示終端)緩沖型的標準出錯流clog(顯示終端)59.1基本概念流庫若干流類的集合稱做流類庫。C++流類庫是用繼承方法建立起來的一個輸入/輸出類庫,它具有兩個平行的基類,即streambuf類和ios類,所有其它的流類都是從它們直接或間接地派生出來的。69.2C++的基本流庫結構C++為何建立自己的輸入輸出系統C語言的輸入/輸出庫函數不支持用戶自定義的數據類型(如結構、類),用戶也不能通過重載這些庫函數來實現用戶自定義數據類型的輸入/輸出。structmy_struct{inti;floatf;char*str;}s;printf(“%my_struct”,s);//error79.2C++的基本流庫結構C++流庫結構C++流庫主要由兩個流類層次組成以streambuf類為父類的類層次主要完成信息通過緩沖區的交換。以ios類為父類的類層次在streambuf類實現功能的基礎上,增加了各種格式化的輸入/輸出控制方法。89.2C++的基本流庫結構C++流庫結構streambuf類層次結構streambufstrstreambufstdiobuffilebufstreambuf類層次結構99.2C++的基本流庫結構C++流庫結構streambuf類層次結構streambuf類為所有的streambuf類層次對象設置了一個固定的內存緩沖區,動態劃分為兩部分:用做輸入的取區,用取指針指示當前取字符位置。用做輸出的存區,用存指針指示當前存字符位置。109.2C++的基本流庫結構C++流庫結構streambuf類層次結構filebuf類它是在fstream.h中定義的streambuf類的一個派生類,它使用文件來保存緩沖區中的字符序列。當寫文件時,是將緩沖區的字符寫到指定的文件中,之后刷新緩沖區;當讀文件時,是將指定文件中的內容讀到緩沖區中來。119.2C++的基本流庫結構C++流庫結構streambuf類層次結構strstreambuf類擴展了streambuf類的功能,增加了動態內存管理功能,提供了在內存中進行提取和插入操作的緩沖區管理。stdiobuf類主要用作C++語言的流類層次方法和C語言的標準輸入/輸出方法混合使用時系統的緩沖區管理。129.2C++的基本流庫結構C++流庫結構ios類層次結構iosistreamostreamiostreamistrstreamistream_withassignifstreamostrstreamostream_withassignofstreamstrstreamstdiostreamfstreamios類層次結構139.2C++的基本流庫結構C++流庫結構ios類層次結構ios類及其派生類是在streambuf類實現的通過緩沖區信息交換的基礎上,進一步增加了各種格式化的輸入/輸出控制方法。ios類的成員變量中包括一個streambuf類類型的指針成員變量,通過該指針,ios類中的成員函數可以調用streambuf類中的公有成員函數。學習中要注意的是,ios類通過指針類型的成員變量,調用streambuf類中公有成員函數的方法,是2.4.1節討論的對象模式中的消息模式的典型應用例子。149.2C++的基本流庫結構C++流庫結構ios類層次結構ios設計成虛基類。主要完成流的狀態設置、狀態報告、顯示精度、域寬、填充字符的設置,文件流的操作模式定義等。ios類的定義在include目錄下的文件ios.h中:15classios{protected:streambuf*bp;longx_flags;intx_precision;charx_fill;intx_width;public:inlinelongflags()const;inlinelongflags(long_l);inlinelongsetf(long_l);inlinelongunsetf(long_l);16inlineintwidth()const;inlineintwidth(int_i);inlinecharfill()const;inlinecharfill(char_c);inlineintprecision(int_i);inlineintprecision()const;…};17C++流庫結構ios類層次結構istream類和ostream類對運算符>>和<<進行重載。iostream類以istream類和ostream類為基類,多重繼承派生。可同時進行輸入輸出操作。9.2C++的基本流庫結構189.3istream類和ostream類istream類在流庫中提供主要的輸入操作,默認對象是cinistream類是在include目錄下的文件istream.h中,istream類中定義的運算符和成員函數包括輸入運算符>>、get函數、getline函數、read函數等。istream類的定義:19classistream:virtualpublicios{public: istream(streambuf*); istream&operator>>(char*); istream&operator>>(int&); inlineistream&operator>>(unsignedchar*); intget(); istream&get(signedchar*,int,char=‘\n’); istream&get(streambuf&,char=‘\n’); istream&get(unsignedchar&); istream&getline(signedchar*,int,char=‘\n’);
intpeek(); //表示不輸入并返回下一個字符
intgcount(); //用來返回上次輸入的字符數
istream&read(signedchar*,int); …};209.3istream類和ostream類istream類>>叫做輸入運算符,將數據從左邊的流中讀出。
inti;
cin>>i; //cin.operator>>(i);重載的輸入運算符“>>”均返回流類istream的引用,因此輸入運算符可連用。例如:intx;chary;cin>>x>>y;219.3istream類和ostream類istream類intget();跳過輸入流中1個字符。istream&get(unsignedchar&); 從輸入流中提出一個字符。istream&getline(signedchar*,int,char=‘\n’);從輸入流中提取指定個數(遇到回車換行符時計數結束)字符到字符數組中。229.3istream類和ostream類istream類例9.1設計一個從鍵盤輸入中提取若干個字符或字符串的例子。#include<iostream.h>voidmain(void){intlength=6;chara,b[6],c[6];cin.get(a);cin.get(); cin.getline(b,length);cin.get();cin.getline(c,length);cout<<a<<“”<<b<<“”<<c<<endl;}239.3istream類和ostream類ostream類ostream類在流庫中提供主要的輸出操作,默認對象是cout。ostream類是在include目錄下的文件ostream.h中,ostream類中定義的運算符和成員函數包括輸出運算符<<、put函數、write函數等。ostream類定義:249.3istream類和ostream類classostream:virtualpublicios{public:ostream(streambuf*);ostream&operator<<(constchar*);ostream&operator<<(int);inlineostream&put(char);ostream&write(constchar*,int);//…};259.3istream類和ostream類ostream類<<叫做輸出運算符,將運算符右邊的數據存儲到左邊的流中。
cout<<“string”;//cout.operator<<(“string”);269.3istream類和ostream類
ostream類所有重載的輸出運算符均返回ostream的引用,利用該引用可繼續調用下一個輸出運算符函數,因而在一條語句中可以顯示多個數據,如:
intx;cout<<“x=“<<x;系統執行如下:輸出運算符按自左至右的順序cout.operator<<(“x=“).operator<<(x)279.3istream類和ostream類
ostream類ostream&put(char);把一個字符插入到輸出流中。ostream&write(constchar*,int);從字符數組中提取若干個字符插入到輸出流中。289.3istream類和ostream類
ostream類例9.2設計一個包含幾種典型情況的屏幕輸出的例子。#include<iostream.h>voidmain(void){charch1[]=“i=“,ch2=“x=“;inti=100;floatx=11.11cout<<ch1<<i<<endl;cout<<ch2<<x<<endl;charch3[]=“abcdefg”cout.write(ch3,5);}299.4格式控制C++語言提供了兩種格式控制方法利用ios類中的格式控制成員函數利用操作符309.4格式控制格式控制成員函數狀態設置和狀態報告ios類中定義的long類型的保護數據成員x_flags用于存入控制輸入輸出格式的狀態標志。狀態標志位共15個,各占一個二進制位,稱為格式狀態位。若設置了某個狀態標志位,則x_flags中的某一位為“1”,否則為“0”。例如:若在狀態標志中設定了skipws和dec,其它均未設定,則x_flags的值應為0000000000010001,即為十六進制的0x0011。這些狀態值之間是或的關系,可用“||”連接要設置的狀態標志位。319.4格式控制格式控制成員函數狀態設置和狀態報告設置狀態標志longios::setf(longflags){
x_flags=x_flags|flags; returnx_flag;}
功能:把指定位的狀態標志設置為1。調用:cout<<setf(ios::hex||ios::scientific);329.4格式控制格式控制成員函數狀態設置和狀態報告清除狀態標志longios::unsetf(longflags){
x_flags=(x_flags)&(~flags); returnx_flags;}功能:把指定位的狀態標志設置為0。339.4格式控制格式控制成員函數狀態設置和狀態報告取狀態標志longios::flags()const{ returnx_flags;}功能:返回當前流的狀態標志位數值。longios::flags(longflags){ longx=x_flags;
x_flags=flag; returnx;}功能:設置指定位的狀態標志,并返回設置前的狀態標志位數值。349.4格式控制格式控制成員函數精度設置C語言中采用%m.nf格式,n表示輸出精度。C++語言在ios類中用x_precision來存放浮點數的輸出顯示精度,表示整個數據的位數。int
ios::precision()
{ returnx_precision;}功能:返回當前的顯示精度。359.4格式控制格式控制成員函數精度設置int
ios::precision(intn)
{
intx=x_precison;
x_precison=n; returnx;}功能:設置顯示精度為n位,并返回設置前的顯示精度。369.4格式控制格式控制成員函數域寬設置在ios類中用x_width存放域寬值。int
ios::width(){returnx_width;}功能:返回當前的域寬值。379.4格式控制格式控制成員函數域寬設置int
ios::width(intn){
inti=x_width;
x_width=n; returni;}功能:設置域寬為n位。389.4格式控制格式控制成員函數填充字符設置在ios類中用x_fill來存放填充字符,填充字符的作用是當輸出值不滿域寬時用填充字符來填充。缺省情況下填充字符為空格。與width()函數配合使用。399.4格式控制格式控制成員函數填充字符設置charios::fill(){returnx_fill;}功能:返回當前的填充字符值charios::fill(charc){charx=x_fill;
x_fill=c;returnx;} 功能:設置填充字符為c。40例子:#include<iostream.h>voidmain(){intcount=432,state=1234;floatx=555.55,y=666.66;cout.fill('#');cout<<"x=";cout.width(8);cout<<x<<endl;cout.setf(ios::dec);cout<<"count="<<count<<endl;cout.setf(ios::hex);cout<<"state="<<state<<endl;cout.precision(4);cout<<"x="<<x<<endl;cout.setf(ios::scientific);cout<<"y="<<y<<endl; }x=##555.55count=432state=4d2x=555.5y=6.6666e+002419.4格式控制操作符使用ios類的成員函數來控制輸入/輸出格式時,必須綴上使用它的流對象(見例9.2),而且不能將它們直接嵌入到輸入/輸出語句中。操作符是一個函數,它以一個流引用作為參數,并返回同一流的引用。操作符可以嵌入到輸入/輸出操作的鏈中。例如,hex操作符的函數體定義:ios&hex(ios&o){o.setf(ios::hex);returno;}429.4格式控制操作符無參數操作符(表9.1)操作符功能dec選擇I/O十進制格式化標志endl插入換行符并刷新輸出緩沖流ends插入空字符flush刷新輸出緩沖流hex選擇I/O十六進制格式化標志oct選擇I/O八進制格式化標志ws從輸入流中提取空字符439.4格式控制操作符無參數操作符(表9.1)例9.4voidmain(void){intcount=432;intstate=1234;floatx=555.55;cout<<“count=“<<dec<<count<<endl;cout<<“state=“<<hex<<state<<endl;cout.setf(ios::scientific);cout<<“x=“<<x<<endl;}449.4格式控制操作符有參數操作符(表9.2)操作符功能resetionflat(longn)清除n指定的格式化標志setbase(intn)設置以n表示的整型基數setfill(intc)設置以c表示的填充字符setionflags(longn)設置以n表示的格式化標志setprecision(intn)設置以n表示的數值精度setw(intn)設置以n表示的I/O域寬459.4格式控制操作符有參數操作符voidmain(void){constdoublePI=3.141592653589793;cout<<“PI=“<<setprecision(10)<<PI<<endl;intk;cin>>oct>>k;cout<<“k=“<<hex<<k<<endl;floatd=324.567;cout<<“d=“<<setw(10)<<setprecision(5)<<setfill(‘*’)<<dec<<d<<endl;}469.5文件的讀/寫基本概念C++把文件看作字符序列,即所謂流式文件。根據數據的組織形式,文件可分為文本文件和二進制文件。文本文件又稱ASCII文件,它的每個字節存放一個ASCII代碼,代表一個字符。這樣便于對字符進行處理,也便于輸出,但占用存儲空間較多479.5文件的讀/寫基本概念二進制文件是把內存中的數據,按其在內存中的存儲形式原樣寫到磁盤上。用二進制形式輸出數據,可節省存儲空間和轉換時間,但一個字節并不對應一個字符。489.5文件的讀/寫基本概念文件流是文件與內存等設備之間的信息交換過程。按操作方法,文件可分為輸入文件和輸出文件。輸入文件:文件流從文件到內存(文件流的讀)輸出文件:文件流從內存到文件(文件流的寫)文件流的讀打開的文件其它設備(變量)文件流的寫499.5文件的讀/寫基本概念C++中文件輸入/輸出的基本過程在程序中要包含頭文件fstream.h。創建一個流。將這個流與文件相關聯,即打開文件。進行文件的讀寫操作。關閉文件。509.5文件的讀/寫文件的打開和關閉文件的打開在C++中,打開一個文件,就是將這個文件與一個流建立關聯。C++中的文件流類(fstream.h)輸入文件流類:ifstream輸出文件流類:ofstream輸入/輸出文件流類:fstream各有4個重載的構造函數。519.5文件的讀/寫文件的打開和關閉打開文件的兩種方式用構造函數方法打開文件——方法1ifstream(constchar*,int=ios::in,int=filebuf::openprot);ofstream(constchar*,int=ios::out,int=filebuf::openprot);fstream(constchar*,int,int=filebuf::openprot);參數含義:字符串形式的文件名、文件流的操作模式、打開文件的共享/保護模式。529.5文件的讀/寫文件的打開和關閉打開文件的兩種方式定義文件流類的對象,建立外存介質上的文件和內存的交換通道,并指定數據交換的方向。例如:ifstreamifs(“Data1.dat”);ofstreamofs(“Data2.dat”);fstreamiofs(“Data3.data”,ios::in|ios::out);539.5文件的讀/寫文件的打開和關閉打開文件的兩種方式用打開成員函數打開文件——方法2voidifstream::open(constchar*,int=ios::in,
int=filebuf::openprot);voidofstream::open(constchar*,int=ios::out,
int=filebuf::openprot);voidfstream::open(constchar*,int,
int=filebuf::openprot);549.5文件的讀/寫例如:ifstreamifs;ofstreamofs;fstreamiofs;ifs.open(“Data1.dat”);ofs.open(“Data2.dat”);iofs.open(“Data3.dat”,ios::in|ios::out);打開當前工作目錄下的指定的文件;如果當前工作目錄下不存在指定文件,則在當前工作目錄下創建一個新的指定文件。可指定文件目錄,如:ifstreamifs(“e:\mytest\Data1.dat”);559.5文件的讀/寫文件的打開和關閉文件的關閉關閉文件即是使打開的文件與流“脫鉤”。使用流類的成員函數close()完成,它不帶參數,無返回值。例如:ifs.close();將關閉與流ifs相連接的文件。569.5文件的讀/寫文件的打開和關閉關閉文件的作用把要寫入文件的數據從緩沖區中完全寫回磁盤。(內存和文件的數據交換是通過緩沖區完成的。)保證文件安全。579.5文件的讀/寫文件的打開和關閉文件的操作模式ios類中定義的文件操作模式共8種,每種占一個二進制。Emum
open_mod{in=0x01,out=0x02,….};允許同時有一個以上的操作模式位為1。文件打開的默認方式為文本方式。589.5文件的讀/寫文本文件的讀/寫基本概念文件打開的默認方式是文本格式(text)。本文件支持文件的順序訪問,即從文件的起始到文件的結束順序地訪問(即存取)文件中的數據。599.5文件的讀/寫文本文件的讀/寫文本文件的讀文件打開的缺省方式是以文本格式打開,在輸入時回車和換行兩個字符要轉換為字符‘\n’;在輸出時,字符‘\n’轉換為回車和換行兩個字符。文件流的讀對應內存變量的輸入,即產生一個輸入流。ifstream類的對象可以使用ios類中定義的輸入運算符“>>”以及get()、getline()成員函數向內存變量“輸入”信息。609.5文件的讀/寫文本文件的讀/寫文本文件的讀例9.6把當前工作目錄下的Data1.dat文件中的字符數據顯示在屏幕上。用get()成員函數輸入#include<fstream.h>#include<stdlib.h>voidmain(){ifstreamifs(“data1.txt");if(!ifs){cerr<<"錯誤:無法打開文件"<<endl;return;}
619.5文件的讀/寫
charc;intn=0;while(ifs.get(c)){cout.put(c);n++;}cout<<endl<<"字符個數:"<<n<<endl;ifs.close();}注意:‘\n’轉換與回車和換行字符之間的轉換。629.5文件的讀/寫用getline()成員函數輸入charbuffer[20];intn=0;while(!ifs.eof()){ifs.getline(buffer,sizeof(buffer));cout<<buffer<<endl;n++;}cout<<endl<<"行數:"<<n<<endl;639.5文件的讀/寫用輸入操作符“>>”把文件流中的數據輸入到內存變量說明:輸入操作符“>>”將略去回車換行符。charc;intn=12;while(n){ifs>>c;cout<<c<<endl;n--;}文件內容:HowareyouThankyou程序運行結果:HowareyouTha649.5文件的讀/寫文本文件的讀/寫文本文件的寫文件流的寫對應內存變量的輸出,即產生一個輸出流。
ofstream類的對象可以使用ostream類中定義的輸出操作符“<<”,以及put()、wirte()成員函數“輸出”信息。例9.7把內存變量中的字符數據輸出到當前目錄下的文件Data2.dat中。659.5文件的讀/寫用put()成員函數輸出voidmain(){ofstreamofs("data2.txt");if(!ofs){cerr<<"錯誤:無法打開文件"<<endl;return;}
charstr[]="Howareyou\nThankyou";intlen=strlen(str);for(inti=0;i<len;i++)ofs.put(str[i]);}669.5文件的讀/寫用write()成員函數輸出用輸出操作符“<<”輸出charstr1[]="Howareyou\n";charstr2[]="Thankyou\n";ofs.write(str1,strlen(str1));ofs.write(str2,strlen(str2));charstr1[]="Howareyou\n";charstr2[]="Thankyou\n";ofs<<str1;ofs<<str2;679.5文件的讀/寫二進制文件的讀/寫基本概念二進制文件不僅支持順序訪問,還支持隨機訪問。文本文件的讀/寫要進行字符‘\n’與回車和換行符之間的轉換,而在二進制方式下,不進行這樣的轉換。在創建二進制文件流類的文件對象時,用邏輯或的方法加上操作模式ios::binary,即表示采用二進制格式進行文件流的讀/寫。689.5文件的讀/寫二進制文件的讀/寫//讀文件ifstreamifs("data3.dat",ios::binary);//…ifs>>d;ifs>>c;ifs>>r;cout<<"d="<<d<<endl;cout<<"r="<<r<<endl;ifs.close();699.5文件的讀/寫二進制文件的讀/寫//寫文件ofstreamofs("data3.dat",ios::binary);//…判斷打開成功與否intd=44,r=99;charc=',';ofs<<d;ofs<<c;ofs<<r;ofs.close();709.5文件的讀/寫二進制文件的讀/寫二進制文件支持隨機訪問,使用read()和write()成員函數讀/寫文件。istream&istream::read(char*,int);ostream&ostream:write(constchar*,int);例9.8719.5文件的讀/寫隨機訪問文件文件指針指示文件流的當前位置。讀指針寫指針729.5文件的讀/寫
隨機訪問文件文件指針的定位操作讀指針的成員函數:istream&seekg(<偏移量>,<參照位置>);操作寫指針的成員函數:ostream&seekp(<偏移量>,<參照位置>);偏移量:文件指針相對于參照位置偏移的字節量。參照位置:ios::beg
ios
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CAQI 64-2019小型新風系統用風管
- T/CAQI 52-2018干衣機羽毛羽絨填充織物烘干性能評價方法
- T/CAQI 28-2017中小學校園飲用水處理裝置服務規范
- T/CAPE 13001-2023石化設備運維數字化信息系統建設規范
- T/CAOE 52-2023含水合物沉積物三軸剪切試驗方法
- 黑龍江面試題庫及答案
- 急診培訓考試題及答案
- T/CADERM 3001-2019外傷后破傷風預防規范
- T/CADBM 66-2022建筑室內窗飾產品安全無拉繩操作系統
- 夫妻雙方婚前分房協議書
- 2024貴州貴陽農商銀行“超享聘旭日”大學生招聘50人筆試歷年典型考題及考點剖析附帶答案詳解
- 2025年三級安全培訓考試試題附參考答案【考試直接用】
- 上海市徐匯區2025屆八下物理期末考試試題含解析
- 2025浙江省樂清蒼南永嘉二模聯考科學試題卷
- 2025年中國鎳合金箔帶材市場調查研究報告
- 2025年河北邢臺市水務發展集團有限公司社會招聘47人筆試參考題庫附帶答案詳解
- 2024年高考江蘇卷生物試題解析版
- 基于BIM的建筑行業工程項目施工質量管理與改進報告
- 2025人教版五年級數學下冊期末復習計劃
- 2024年河北省井陘縣事業單位公開招聘警務崗筆試題帶答案
- 2025年政治考研真題及答案
評論
0/150
提交評論