10 輸入輸出(過(guò)程式)_第1頁(yè)
10 輸入輸出(過(guò)程式)_第2頁(yè)
10 輸入輸出(過(guò)程式)_第3頁(yè)
10 輸入輸出(過(guò)程式)_第4頁(yè)
10 輸入輸出(過(guò)程式)_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

輸入/輸出過(guò)程式途徑主要內(nèi)容輸入/輸出(I/O)概述面向控制臺(tái)的I/O面向文件的I/O輸入/輸出(I/O)概述輸入/輸出(簡(jiǎn)稱(chēng)I/O)是程序的一個(gè)重要組成部分:程序運(yùn)行所需要的數(shù)據(jù)往往要從外設(shè)(如:鍵盤(pán)、文件等)得到程序的運(yùn)行結(jié)果通常也要輸出到外設(shè)(如:顯示器、打印機(jī)、文件等)中去。在C++中,輸入/輸出操作不是語(yǔ)言定義的成分,而是由具體的實(shí)現(xiàn)作為標(biāo)準(zhǔn)庫(kù)的功能來(lái)提供。C++輸入輸出的方式在標(biāo)準(zhǔn)庫(kù)中提供了兩種輸入/輸出的方式過(guò)程式——通過(guò)從C語(yǔ)言保留下來(lái)的函數(shù)庫(kù)中的輸入/輸出函數(shù)來(lái)實(shí)現(xiàn)。例如:printfscanf......面向?qū)ο蟆ㄟ^(guò)C++的I/O類(lèi)庫(kù)中的類(lèi)/對(duì)象來(lái)實(shí)現(xiàn)。例如:ostream、cout,<<istream、cin,>>......在C++中,輸入/輸出是一種基于字節(jié)流的操作:在進(jìn)行輸入操作時(shí),可把輸入的數(shù)據(jù)看成逐個(gè)字節(jié)地從外設(shè)流入到計(jì)算機(jī)內(nèi)存。在進(jìn)行輸出操作時(shí),則把輸出的數(shù)據(jù)看成逐個(gè)字節(jié)地從內(nèi)存流出到外設(shè)。在C++的標(biāo)準(zhǔn)庫(kù)中,提供了:基于字節(jié)的I/O操作。基于C++基本數(shù)據(jù)類(lèi)型數(shù)據(jù)的I/O操作(在這些操作的內(nèi)部實(shí)現(xiàn)基本數(shù)據(jù)類(lèi)型與字節(jié)流之間的轉(zhuǎn)換)。I/O的分類(lèi)面向控制臺(tái)的I/O從標(biāo)準(zhǔn)輸入設(shè)備(如:鍵盤(pán))獲得數(shù)據(jù)把程序結(jié)果從標(biāo)準(zhǔn)輸出設(shè)備(如:顯示器)輸出面向文件的I/O從外存文件獲得數(shù)據(jù)把程序結(jié)果保存到外存文件中面向字符串變量的I/O從程序中的字符串變量中獲得數(shù)據(jù)把程序結(jié)果保存到字符串變量中過(guò)程式輸入/輸出控制臺(tái)輸出

把ch中的字符輸出到標(biāo)準(zhǔn)輸出設(shè)備,函數(shù)返回輸出的字符:intputchar(intch);把p所指向的字符串輸出到標(biāo)準(zhǔn)輸出設(shè)備,操作成功時(shí)函數(shù)返回一個(gè)非負(fù)整數(shù):intputs(constchar*p);提供對(duì)基本類(lèi)型數(shù)據(jù)的輸出操作,操作成功時(shí)返回輸出的字符個(gè)數(shù):intprintf(constchar*format[,<參數(shù)表>]);printf輸出格式控制printf是一個(gè)帶可變參數(shù)的函數(shù),第一個(gè)參數(shù)是一個(gè)字符串(稱(chēng)為格式串),它用來(lái)指出要輸出的數(shù)據(jù)的類(lèi)型和格式:inti=12;doublej=34.5;printf("i=%d,j=%f\n",i,j);//i=12,j=34.5格式串的說(shuō)明參見(jiàn)教材<表9-1>在調(diào)用函數(shù)printf時(shí),編譯程序?qū)?duì)實(shí)參的類(lèi)型進(jìn)行:整型提升轉(zhuǎn)換把float型轉(zhuǎn)成double型控制臺(tái)輸入從鍵盤(pán)輸入一個(gè)字符作為返回值:intgetchar();從鍵盤(pán)輸入一個(gè)字符串放入p所指向的內(nèi)存空間,成功時(shí)返回p,否則,返回NULL:char*gets(char*p);對(duì)基本類(lèi)型的數(shù)據(jù)進(jìn)行輸入,返回實(shí)際輸入并保存的數(shù)據(jù)個(gè)數(shù):intscanf(constchar*format[,<參數(shù)表>]);scanf輸入格式控制scanf是一個(gè)帶可變參數(shù)的函數(shù),第一個(gè)參數(shù)是一個(gè)字符串(稱(chēng)為格式串),它用來(lái)指出要輸入的數(shù)據(jù)的類(lèi)型和格式(與printf基本相同);其它參數(shù)為接收數(shù)據(jù)的內(nèi)存地址:inti;doublej;scanf("i=%d,j=%lf",&i,&j);//i=12,j=34.5在輸入某個(gè)指定類(lèi)型的數(shù)據(jù)時(shí),輸入過(guò)程遇到下面的情況結(jié)束:格式串中指定的字符空白符不屬于指定類(lèi)型數(shù)據(jù)的字符面向文件的I/O需求:程序運(yùn)行結(jié)果有時(shí)需要永久性地保存起來(lái),以供其它程序或本程序下一次運(yùn)行時(shí)使用。程序運(yùn)行所需要的數(shù)據(jù)也常常要從其它程序或本程序上一次運(yùn)行所保存的數(shù)據(jù)中獲得。用于永久性保存數(shù)據(jù)的設(shè)備稱(chēng)為外部存儲(chǔ)器(簡(jiǎn)稱(chēng):外存),如:磁盤(pán)、磁帶、光盤(pán)等。在外存中保存數(shù)據(jù)的方式通常有兩種:文件數(shù)據(jù)庫(kù)本課程只介紹以文件方式來(lái)永久性地保存數(shù)據(jù)。文件的基本概念在C++中,把文件看成是由一系列字節(jié)所構(gòu)成的字節(jié)串,對(duì)文件中數(shù)據(jù)的操作(輸入/輸出)通常是逐個(gè)字節(jié)順序進(jìn)行,因此稱(chēng)為流式文件。

每個(gè)打開(kāi)的文件都有一個(gè)內(nèi)部(隱藏)的位置指針,它指出文件的當(dāng)前讀寫(xiě)位置。進(jìn)行讀/寫(xiě)操作時(shí),每讀入/寫(xiě)出一個(gè)字節(jié),文件位置指針會(huì)自動(dòng)往后移動(dòng)一個(gè)字節(jié)的位置。位置指針文件數(shù)據(jù)的存儲(chǔ)方式

文本方式(text)只包含可顯示的字符和有限的幾個(gè)控制字符(如:‘\r’、‘\n’、‘\t’等)的編碼。一般用于存儲(chǔ)具有“行”結(jié)構(gòu)的文字?jǐn)?shù)據(jù),數(shù)據(jù)可用記事本等軟件打開(kāi)察看。二進(jìn)制方式(binary)

包含任意的沒(méi)有顯式含義的純二進(jìn)制字節(jié)。一般用于存儲(chǔ)任意結(jié)構(gòu)的數(shù)據(jù),數(shù)據(jù)由使用它的應(yīng)用程序來(lái)解釋例如,對(duì)于一個(gè)整數(shù)1234567文本方式:按字符串把字符1、2、3、4、5、6、7的ASCII碼依次寫(xiě)入文件。(共7個(gè)字節(jié))

二進(jìn)制方式:按1234567的int型機(jī)內(nèi)表示(0012D687)把它逐個(gè)字節(jié)依次寫(xiě)入文件。(共4個(gè)字節(jié))文件的讀寫(xiě)過(guò)程在外存(如磁盤(pán))中,每個(gè)文件都有一個(gè)名字(文件名)(操作系統(tǒng)一般采用樹(shù)型的目錄結(jié)構(gòu)來(lái)管理外存中的文件)。對(duì)文件數(shù)據(jù)進(jìn)行讀寫(xiě)的過(guò)程:打開(kāi)文件:把程序內(nèi)部的一個(gè)表示文件的變量/對(duì)象與外部的一個(gè)具體文件關(guān)聯(lián)起來(lái),并創(chuàng)建內(nèi)存緩沖區(qū)。文件讀/寫(xiě):存取文件中的內(nèi)容。關(guān)閉文件:把暫存在內(nèi)存緩沖區(qū)中的內(nèi)容寫(xiě)入到文件中,并歸還打開(kāi)文件時(shí)申請(qǐng)的內(nèi)存資源(包括內(nèi)存緩沖區(qū))。

文件輸出操作

打開(kāi)文件FILE*fopen(constchar*filename,constchar*mode);filename是要打開(kāi)的外部文件名(包括路徑)mode表示打開(kāi)方式,它可以是:"w":打開(kāi)一個(gè)外部文件用于寫(xiě)操作。如果外部文件已存在,則首先把它的內(nèi)容清除;否則,先創(chuàng)建該外部文件。"a":打開(kāi)一個(gè)外部文件用于添加(從文件末尾)操作。如果外部文件不存在,則先創(chuàng)建該外部文件。返回值為一個(gè)指針,在今后的文件操作中用它來(lái)指出要操作的文件。在打開(kāi)方式w或a的后面還可以加上t或b,指出以文本或二進(jìn)制方式打開(kāi)文件。默認(rèn)打開(kāi)方式為文本方式。以文本方式打開(kāi)的文件,在Windows環(huán)境中輸出時(shí),會(huì)把'\n'轉(zhuǎn)換成'\r'和'\n'兩個(gè)字符。執(zhí)行文件打開(kāi)操作后,如果fopen返回非空指針,則表示文件打開(kāi)成功,否則表示打開(kāi)失敗。例如:FILE*fp=fopen("d:\\data\\file1.txt","w");if(fp==NULL){ printf("文件打開(kāi)失敗\n"); exit(-1); }文件成功打開(kāi)后,就可以進(jìn)行文件數(shù)據(jù)的輸出操作了:輸出一個(gè)字符,輸出成功時(shí)返回輸出的字符intfputc(intc,FILE*stream);輸出一個(gè)字符串,輸出成功時(shí)返回一個(gè)非負(fù)整數(shù)intfputs(constchar*string,FILE*stream);輸出基本類(lèi)型數(shù)據(jù),返回輸出的字符數(shù)intfprintf(FILE*stream,constchar*format[,argument]...);按字節(jié)(二進(jìn)制方式)輸出一批數(shù)據(jù)size_tfwrite(constvoid*buffer,size_tsize, size_tcount,FILE*stream);buffer為數(shù)據(jù)在內(nèi)存中的首地址,size為字節(jié)塊的大??;count為字節(jié)塊的個(gè)數(shù);返回實(shí)際輸出的字節(jié)塊的個(gè)數(shù)輸出數(shù)據(jù)例如:

intx=12;doubley=12.3;......//以文本方式輸出數(shù)據(jù)FILE*fp=fopen("d:\\myfile.txt","w");if(fp==NULL)exit(-1);fprintf(fp,"%d%f",x,y);//1212.3或//以二進(jìn)制方式輸出數(shù)據(jù)FILE*fp=fopen("d:\\myfile.dat","wb");if(fp==NULL)exit(-1);fwrite(&x,sizeof(x),1,fp);//4個(gè)字節(jié)fwrite(&y,sizeof(y),1,fp);//8個(gè)字節(jié)再例如:structStudent{intno;

charname[10];

intscores[5];}s1={161220042,"張三",{90,95,85,75,95}};//以文本方式輸出數(shù)據(jù)FILE*fp=fopen("d:\\students.txt","w");if(fp==NULL)exit(-1);fprintf(fp,"%d%s",s1.no,);for(inti=0;i<5;i++)

fprintf(fp,"%d",s1.scores[i]);fputc('\n',fp);//以二進(jìn)制方式輸出數(shù)據(jù)FILE*fp=fopen("d:\\students.dat","wb");if(fp==NULL)exit(-1);fwrite(&s1,sizeof(s1),1,fp);文件輸出操作結(jié)束后要關(guān)閉文件:fclose(FILE*stream);

關(guān)閉文件的目的:把文件內(nèi)存緩沖區(qū)的內(nèi)容寫(xiě)到磁盤(pán)文件中!文件輸入操作打開(kāi)文件FILE*fp=fopen(constchar*filename,constcharmode);filename是要打開(kāi)的外部文件名;mode是打開(kāi)方式,它可以是:"r",表示打開(kāi)一個(gè)外部文件用于讀操作,這時(shí),外部文件必須存在,否則打開(kāi)文件失敗。在r的后面還可以加上t或b,指出是以文本或二進(jìn)制方式打開(kāi)文件,默認(rèn)打開(kāi)方式為文本方式。以文本方式打開(kāi)的文件,在Windows環(huán)境中輸入時(shí),會(huì)把'\r'和'\n'兩個(gè)字符轉(zhuǎn)換成'\n'一個(gè)字符。返回值為一個(gè)指針,在今后的文件操作中用它來(lái)指出要操作的文件。對(duì)文件打開(kāi)操作的成功與否進(jìn)行判斷FILE*fp=fopen("d:\\data\\file1.txt","r");if(fp==NULL){ printf("文件打開(kāi)失敗\n"); exit(-1); }文件成功打開(kāi)后,就可以進(jìn)行文件數(shù)據(jù)的輸入操作了:輸入一個(gè)字符,返回字符的編碼intfgetc(FILE*stream);輸入一個(gè)字符串,函數(shù)正常結(jié)束時(shí)返回string的值,否則返回NULLchar*fgets(char*string,intn,FILE*stream);輸入基本類(lèi)型的數(shù)據(jù),返回值表示讀入并存儲(chǔ)的數(shù)據(jù)個(gè)數(shù)intfscanf(FILE*stream,constchar*format[,argument]...);按字節(jié)(二進(jìn)制方式)輸入一批數(shù)據(jù)。size_tfread(constvoid*buffer,size_tsize,size_tcount,FILE*stream);buffer為數(shù)據(jù)在內(nèi)存中的首地址,size為字節(jié)塊的大小,count為字節(jié)塊的個(gè)數(shù)。返回值表示讀入的字節(jié)塊的個(gè)數(shù)輸入數(shù)據(jù)例如:

intx;doubley;......//以文本方式輸入數(shù)據(jù)FILE*fp=fopen("d:\\myfile.txt","r");if(fp==NULL)exit(-1);fscanf(fp,"%d%lf",&x,&y);//x為12,y為12.3//以二進(jìn)制方式輸入數(shù)據(jù)FILE*fp=fopen("d:\\myfile.dat","rb");if(fp==NULL)exit(-1);fread(&x,sizeof(x),1,fp);//x為12fread(&y,sizeof(y),1,fp);//y為12.3注意:從文件輸入必須要知道文件中數(shù)據(jù)的存儲(chǔ)方式和格式!再例如:structStudent{intno;charname[10];intscores[5];}s1;//以文本方式輸入數(shù)據(jù)FILE*fp=fopen("d:\\students.txt","r");if(fp==NULL)exit(-1);fscanf(fp,"%d%s",&s1.no,&);for(inti=0;i<5;i++)

fscanf(fp,"%d",&s1.scores[i]);//以二進(jìn)制方式輸入數(shù)據(jù)FILE*fp=fopen("d:\\students.dat","rb");if(fp==NULL)exit(-1);fread(&s1,sizeof(s1),1,fp);讀取數(shù)據(jù)過(guò)程中有時(shí)需要判斷是否正確讀入了數(shù)據(jù)(尤其是在文件末尾處)。判斷是否正確讀入了數(shù)據(jù),可以根據(jù)輸入函數(shù)的返回值來(lái)實(shí)現(xiàn):fgetc:返回EOF表示失敗fgets:返回NULL表示失敗fscanf:返回EOF表示失敗例:從文件讀入一系列整型數(shù)......FILE*fp=fopen("d:\\myfile.txt","r");if(fp==NULL)exit(-1);intx;//讀入第一個(gè)整型數(shù)

intrc=fscanf(fp,"%d",&x);while

(rc!=EOF)

{

......

//使用x的值//讀入下一個(gè)整型數(shù)

rc=fscanf(fp,"%d",&x);}fclose(fp);......文件中的數(shù)據(jù)形式1

2

3

4\n

------------------1\n

2\n

3\n

4\n

------------------

1

2

3

4

------------------1\n

2\n

3\n

4structStudent{intno;charname[10];intscores[5];}s1;FILE*fp=fopen("d:\\students.txt","r");if(fp==NULL)exit(-1);intrc=fscanf(fp,"%d",&s1.no);while

(rc!=EOF){fscanf(fp,"%s",);for(inti=0;i<5;i++)

fscanf(fp,"%d",&s1.scores[i]);

......//使用s1中讀入的當(dāng)前學(xué)生數(shù)據(jù)

rc=fscanf(fp,"%d",&s1.no);//讀入下一個(gè)學(xué)號(hào)}fclose(fp);例:從文件讀入一系列學(xué)生數(shù)據(jù)文件中的數(shù)據(jù)形式1001

張三9288709085\n

1002

李四9080909588\n1003

王五

9585809280\n......文件輸入操作結(jié)束后要關(guān)閉文件:fclose(FILE*stream);

有關(guān)文件讀寫(xiě)的幾點(diǎn)注意以文本方式輸出的文件要以文本方式輸入;以二進(jìn)制方式輸出的文件要以二進(jìn)制方式輸入!以文本方式讀寫(xiě)的文件要以文本方式打開(kāi);以二進(jìn)制方式讀寫(xiě)的文件要以二進(jìn)制方式打開(kāi)!以二進(jìn)制方式存取文件不利于程序的兼容性和可移植性。例如,在不同計(jì)算機(jī)平臺(tái)上,整型數(shù)的各字節(jié)在內(nèi)存中的存儲(chǔ)次序可能不一樣。在不同的編譯環(huán)境下,同樣結(jié)構(gòu)類(lèi)型數(shù)據(jù)的尺寸(字節(jié)數(shù))可能不一樣。......既能輸入也能輸出的文件打開(kāi)一個(gè)既能讀入數(shù)據(jù)、也能輸出數(shù)據(jù)的文件FILE*fopen(c

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論