C__程序設(shè)計(jì).ppt_第1頁(yè)
C__程序設(shè)計(jì).ppt_第2頁(yè)
C__程序設(shè)計(jì).ppt_第3頁(yè)
C__程序設(shè)計(jì).ppt_第4頁(yè)
C__程序設(shè)計(jì).ppt_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C+程序設(shè)計(jì),主講人:謝昕 華東交通大學(xué)信息工程學(xué)院,2008年春季學(xué)期,第16-17講 C+的I/O流庫(kù),流抽象的繼承結(jié)構(gòu) 預(yù)定義的插入符與提取符 插入符和提取符的重載 格式控制符的操作 磁盤文件的輸入和輸出 字符串流,主要內(nèi)容,I/O流的概念,1、流的引入 scanf(%d, 2、流的基本概念 流:數(shù)據(jù)從一個(gè)對(duì)象流動(dòng)到另一個(gè)對(duì)象,這種 流動(dòng)抽象為流。 流的操作:建立流、刪除流、提?。ㄗx操作/輸 入)、插入(寫操作/輸出)。,ios:對(duì)流狀態(tài)進(jìn)行設(shè)置,虛基類; streambuf:提供對(duì)數(shù)據(jù)的緩沖支持; istream、ostream、iostream:提取與插入,3、C+流的繼承結(jié)構(gòu),I/

2、O流的概念,4、文件的繼承結(jié)構(gòu),I/O流的概念,5、字符串類,提供處理內(nèi)部初始化字符序列的操作;,istrstream:從序列中取字符;,ostrstream:將字符放入序列;,I/O流的概念,6、預(yù)定義的流,cin:istream類對(duì)象,處理標(biāo)準(zhǔn)輸入,即鍵盤輸入;,cout:ostream類對(duì)象,處理標(biāo)準(zhǔn)輸出,即屏幕輸出;,cerr:ostream類對(duì)象,處理標(biāo)準(zhǔn)出錯(cuò)信息,提供不 帶緩沖區(qū)的輸出;,clog:ostream類對(duì)象,處理標(biāo)準(zhǔn)出錯(cuò)信息,提供帶 緩沖區(qū)的輸出;,I/O流的概念,預(yù)定義的插入符,1、預(yù)定義插入符的格式,ostream,其中:type為char、int、short、lo

3、ng類型和它們的unsigned和signed類型,以及float、double、long double、char *和void *;,2、說明,一般情況下將插入符作用于cout對(duì)象;輸出語(yǔ)句中可以串聯(lián)多個(gè)插入運(yùn)算符,輸出多個(gè)數(shù)據(jù)項(xiàng);,例1分析下列程序的輸出結(jié)果。,void main() char *str=Hello; int a=100; int *pa= ,輸出結(jié)果:,*pa=100 cout.put(a).put(, ).put(b).put(n); char c1=A,c2=B; cout.put(c1).put(c2).put(n); ,例3分析下列程序的輸出結(jié)果。,void Pr

4、intString(char *s) cout.write(s,strlen(s).put(n); cout.write(s,6)n; void main() char str=I love you?; coutThe string is: strendl; PrintString(str); PrintString(this is a string); ,The string is: I love you? I love you? I love this is a string this i,預(yù)定義的提取符,1、預(yù)定義提取符的格式,istream,2、說明,一般情況下將提取符作用于cin對(duì)象

5、;輸入語(yǔ)句中可以串聯(lián)多個(gè)提取運(yùn)算符,每個(gè)提取符后為一表達(dá)式,該表達(dá)式是獲得輸入值的變量或?qū)ο螅?提取操作時(shí),空白符(空格、tab鍵、換行符)只用于字符的分隔符,而本身不作為從輸入流中提取的字符;,提取符可從輸入流中讀取一個(gè)字符串,該字符串是以空白符結(jié)束的一個(gè)字符序列,由系統(tǒng)自動(dòng)加上0字符;,預(yù)定義的提取符,例4:分析下列程序的輸出結(jié)果,void main() const int SIZE=20; char bufSIZE; char *largest; int curLen,maxLen=-1,cnt=0; coutbuf) curLen=strlen(buf); cnt+; if(curLe

6、nmaxLen) ,maxLen=curLen; largest=buf; coutnCount of words:cnt; coutnNumber of longest word:maxLen; coutnThe word is:largestendl; ,輸 入,Input words: I love you everyone,輸 出,?請(qǐng)思考?,輸入ctrl+z鍵后,cinbuf 的值為0,退出while循環(huán);,輸 入,Input words: I love you everyone,輸 出,Count of words:4 Number of longest word:8 The wo

7、rd is:everyone,輸入ctrl+z鍵后,cinbuf 的值為0,退出while循環(huán),3、使用get( )獲取一個(gè)字符,istream,4、使用getline( )獲取多個(gè)字符,istream,getline( )最多可讀取Limit-1個(gè)字符;,預(yù)定義的提取符,從輸入流中讀取Limit-1個(gè)字符后; 從輸入流中讀取換行符或其他終止符后; 從輸出流中讀取到文件或輸入流結(jié)束符后; getline( )通常用來讀取一行字符:,getline( )函數(shù)結(jié)束操作的條件:,預(yù)定義的提取符,5、使用read( )讀取一串字符,istream,6、輔助操作,int istream:peek( );

8、/不輸入而返回下一個(gè)字符 istream/回放字符 int istream:gcount( )/返回上次輸入的字符數(shù),預(yù)定義的提取符,例5分析下列程序的輸出結(jié)果。,void main( ) char ch; coutInput: ; while(ch=cin.get()!=EOF) cout.put(ch); coutok! endl; ,輸入,abc xyz 123,輸出,abc xyz 123 ok!,例6分析下列程序的輸出結(jié)果。,void main() const int S=80; char bufS=; coutInputendl; cin.read(buf,S); coutendl

9、; coutbufendl; ,輸出,abcd efgh ijkl,輸入: Input. abcd efgh ijkl ,1、重載為友元函數(shù),ostream,2、函數(shù)調(diào)用形式,ostrmobj; 等價(jià)于operator (ostrm,obj);,ostrmobj1obj2; 等價(jià)于operator (operator(ostrm,obj1),obj2);,插入符和提取符的重載,例7分析下列程序的輸出結(jié)果,輸 出,Current date: 1999/10/22 Enter new date: 2005 5 27 New date: 2005/5/27,控制輸出格式,控制輸出寬度 1、在流中放入

10、setw操縱符 2、調(diào)用width成員函數(shù)為每個(gè)項(xiàng)指定輸出寬度,例如可使用width控制輸出寬度,1.23 35.36 653.7 4358.24,cout.fill(*);,*1.23 *35.36 *653.7 *4358.24,例8 使用width指定寬度,#include void main( ) double values = 1.23,35.36,653.7,4358.24; for(int i=0;i4;i+) cout.width(10); cout valuesi n; ,void main() double values = 1.23,35.36,653.7,4358.24

11、; char *names = Zoot, Jimmy, Al, Stan; for (int i=0;i4;i+) cout setw(6) namesi setw(10); cout valuesi endl; ,Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24,例9 使用setw控制輸出寬度,例10 設(shè)置對(duì)齊方式,#include void main() double values = 1.23,35.36,653.7,4358.24; char *names = Zoot, Jimmy, Al, Stan; for (int i=0;i4;i+)

12、cout setiosflags(ios:left)setw(6) namesi resetiosflags(ios:left) setw(10)valuesiendl; ,Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24,例11 控制輸出精度,#include void main() double values = 1.23,35.36,653.7,4358.24; char *names = Zoot, Jimmy, Al, Stan; cout setiosflags(ios:scientific); for (int i=0;i4;i+) cout

13、 setiosflags(ios:left)setw(6)namesi resetiosflags(ios:left)setw(10) setprecision(1) valuesiendl; ,Zoot 1 Jimmy 4e+001 Al 7e+002 Stan 4e+003,磁盤文件的輸入輸出,文件的打開與關(guān)閉 文本文件的讀寫操作 二進(jìn)制文件的讀寫操作 隨機(jī)文件有讀寫操作,1、文件的概念 在磁盤上保存的信息是按文件的形式組織的,每個(gè)文件都對(duì)應(yīng)一個(gè)文件名,并且屬于某個(gè)物理盤或邏輯盤的目錄層次結(jié)構(gòu)中一個(gè)確定的目錄之下。一個(gè)文件名由文件主名和擴(kuò)展名兩部分組成,2、文件的類型 按存儲(chǔ)格式分為兩種類

14、型,一種為字符格式文件(文本文件),另一種為內(nèi)部字節(jié)文件(二進(jìn)制文件)。,-文件的基本概念,3、文件流對(duì)象 要用#include命令。 它提供的輸入文件流類:ifstream 輸出文件流類:ofstream 輸入輸出文件流類:fstream 定義用戶所需要的文件流對(duì)象,然后利用open成員函數(shù),按照一定的方式打開一個(gè)文件。文件打開后通過流對(duì)象訪問其中內(nèi)容,結(jié)束后用close關(guān)閉。,-文件的基本概念,文件的打開與關(guān)閉,流可以分為3類:輸入流、輸出流以及I/O流,相應(yīng)地必須將流說明為ifstream、ofstream以及fstream類的對(duì)象。 例如: ifstream ifile; /說明一個(gè)輸

15、入流對(duì)象 ofstream ofile; /說明一個(gè)輸出流對(duì)象 fstream iofile; /說明一個(gè)輸入/輸出流對(duì)象,文件的打開與關(guān)閉,可用open( )來打開文件。即在流與文件之間建立一個(gè)連接。Open( )的函數(shù)原型為: void open(const char * filename, int mode,int prot=filebuf:openprot);,Filename:文件名,它可包含路徑說明; Mode:文件打開的模式; Prot:文件的訪問方式。取值為0 :普通文件; 1 :只讀文件;2:隱含文件 ;4:系統(tǒng)文件,相關(guān)參數(shù)說明,文件的打開與關(guān)閉,對(duì)于ifstream流,m

16、ode的默認(rèn)值為ios:in; 對(duì)于ofstream流,mode的默認(rèn)值為ios:out。,mode的符號(hào)常量可以|組合在一起,如ios:in|ios:binary 表示以只讀方式打開二進(jìn)制文件。,文件的打開與關(guān)閉,文件的讀寫方法,(1)使用流運(yùn)算符直接讀寫 可以直接使用流的,完成文件的字符轉(zhuǎn)換工作。 (2)使用流成員函數(shù) 輸出流成員函數(shù)為:put函數(shù)、write函數(shù) 輸入流成員函數(shù)有:get函數(shù)、getline函數(shù)、read函數(shù),例12-Simple:分析下列程序的輸出結(jié)果。,#include #include void main() ofstream ostrm; ostrm.open(C

17、:f1.dat); ostrmMendl; ostrm310.85endl; ostrm.close();,M,310.85,ifstream istrm(C:f1.dat); char n; double d; istrmnd; coutn, dendl; istrm.close(); ,#include #include #include void main() fstream outfile; outfile.open(f2.dat,ios:out); if(!outfile) coutf2.dat cant open. endl; abort(); outfilethis is a p

18、rogram. endl; outfile.close(); ,要指定具體路徑, 否則在當(dāng)前目錄!,例12:將文本寫入指定的文件,例13從文本文件中讀出信息,輸 出,this is a program.,例14使用get()和put()函數(shù)讀寫文件,this is a c+ program.,輸 出,例15將一文件內(nèi)容拷貝到另一文件,文件的讀寫方法,實(shí)現(xiàn)“真正”的COPY功能,如: mycopy c:abc.txt d:123.txt mycopy c:abc.txt d:(不給定文件名) 即:給定兩個(gè)參數(shù)!要用什么來實(shí)現(xiàn)?,例15-擴(kuò)展思考并設(shè)計(jì)一個(gè)自己的拷貝命令,文件的讀寫方法,設(shè)計(jì)Myc

19、opy-簡(jiǎn)單實(shí)現(xiàn),#include #include #include void main(int argc,char *argv) fstream outfile,infile; infile.open(argv1,ios:in); if(!infile) coutOpen file error!n; abort(); outfile.open(argv2,ios:out);,if(!outfile) coutOpen file error!n; abort(); char ch; while(infile.get(ch) outfile.put(ch); cout1 file copied

20、.n; outfile.close(); infile.close(); ,設(shè)計(jì)Mycopy-完美實(shí)現(xiàn),fstream outfile,infile;/輸入輸出流 char sour20,dest20;/放參數(shù)1,參數(shù)2 char sfile20,dfile20;/臨時(shí)存放源文件與目標(biāo)文件 strcpy(sour,argv1); int ns=strlen(argv1);/參數(shù)1的長(zhǎng)度 strcpy(dest,argv2); int nd=strlen(argv2);/參數(shù)2的長(zhǎng)度 /記住最后出現(xiàn)的位置,前是路徑,后為文件名 int pos=0; for(int j=ns-1;j=0;j-)/

21、從后往前循環(huán)查找,找到就停止 if(sourj=)pos=j; break;,/從開始往后取出文件名并放入s_temp_file for(int i=0,k=pos+1;kns;i+,k+) sfilei=sourk; sfilei=0;/一定要截止 /如果參數(shù)2是完整路徑與文件名,則可直接當(dāng)目標(biāo)文件使用 /否則目標(biāo)文件名是目標(biāo)路徑源文件名 if(destnd-1!=) /有完整路徑及文件名時(shí) strcpy(dfile,argv2); else /只有路徑時(shí) for(int i=0;ind;i+) dfilei=desti;/先取出路徑 dfilend=0;/一定要截止 strcat(dfil

22、e,sfile); /再把路徑與源文件名相連成目標(biāo)文件,設(shè)計(jì)Mycopy-完美實(shí)現(xiàn),infile.open(argv1,ios:in); if(!infile) coutOpen file error!n; abort(); outfile.open(dfile,ios:out); if(!outfile) coutOpen file error!n; abort(); char ch; while(infile.get(ch) /coutch; outfile.put(ch); cout1 file(s) copied.n; outfile.close(); infile.close();

23、,設(shè)計(jì)Mycopy-完美實(shí)現(xiàn),二進(jìn)制文件的讀寫操作,用write()往文件寫入n個(gè)字節(jié),ostream,寫入什么?,寫n個(gè)字節(jié),轉(zhuǎn)換成char *,用read()從文件讀取n個(gè)字節(jié),istream,從文件讀取到buf中去,讀n個(gè)字節(jié),struct person char name20; double height; int age; ; person people6; /假設(shè)數(shù)組已經(jīng)賦值 outfile.write( (char *),二進(jìn)制文件的讀寫操作,例16對(duì)一個(gè)二進(jìn)制文件進(jìn)行讀寫操作,輸 出,Wang1.6525 Zhang1.7224 Li1.6921 Huang1.722,二進(jìn)制文

24、件的讀寫操作,隨機(jī)訪問數(shù)據(jù)文件,1、讀文件指針(與get相對(duì),所以有g(shù)),istream/獲取當(dāng)前指針位置,streampos為long型;seek_dir的值:,cur=1,相對(duì)于當(dāng)前讀指針指定的位置;,beg=0,相對(duì)于流的開始位置;,end=2,相對(duì)于流的結(jié)尾位置;,2、寫文件指針(與put相對(duì),所以有p),ostream,隨機(jī)訪問數(shù)據(jù)文件,舉例隨機(jī)文件讀寫操作,struct student char name20; long number; double totalscore; ; studentstu5=Ma,97001,85.72, Li,97002,92.62, Hu,97003,89.25, Yan,97004,90.84, Lu,97005,80.92;,fstream file1; student one; for(int i=0;i5;i+) ;/注意:最前面的記錄是第0條! file1.write(char *),舉例隨機(jī)文件讀寫操作,例

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論