C語言 第10講課件_第1頁
C語言 第10講課件_第2頁
C語言 第10講課件_第3頁
C語言 第10講課件_第4頁
C語言 第10講課件_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

本講主要介紹C語言中文件的基本類型及其相關(guān)操作要求掌握文件的打開、關(guān)閉文件寫入、讀取第十講文件第十講文件文件概述文件的打開與關(guān)閉文件的讀寫操作文件概述為什么引入文件?程序運行時,程序本身和數(shù)據(jù)一般都存放在內(nèi)存中運行結(jié)束后,程序和數(shù)據(jù)被釋放。如果需要長期保存程序運行所需的原始數(shù)據(jù),或程序運行產(chǎn)生的結(jié)果,就必須以文件形式存儲到外部存儲介質(zhì)上。文件概述文件與文件名文件是指存放在外部存儲介質(zhì)上的程序與數(shù)據(jù)的集合。文件必須放在外部介質(zhì)上,外部介質(zhì)包括硬盤、軟盤、光盤等。為標(biāo)識一個文件,每個文件都必須有一個文件名,其一般結(jié)構(gòu)為:

主文件名[.擴展名]

文件命名規(guī)則,遵循操作系統(tǒng)的約定。操作系統(tǒng)是以文件為單位來管理各種各樣的程序和數(shù)據(jù)的。文件的內(nèi)容文件的類別根據(jù)存儲形式分為:

ASCII碼文件:以字符的ASCII碼為單位

二進(jìn)制文件:按數(shù)據(jù)在內(nèi)存中的模式來組織文件概述ASCII碼文件:以字符的ASCII碼為單位組織數(shù)據(jù)的一種文件。每個字節(jié)存放一個ASCII碼,代表一個字符,即逐個字符存儲其ASCII碼。1個字節(jié)存儲1個字符,便于對字符進(jìn)行逐個處理,所以適合存儲文本內(nèi)容。如果用于存儲數(shù)值,則一般占用存儲空間較多,且要花費轉(zhuǎn)換時間(ASCII碼與二進(jìn)制之間轉(zhuǎn)換)。文件概述二進(jìn)制文件:內(nèi)存中的數(shù)據(jù),原樣輸出。用二進(jìn)制形式存儲數(shù)值,可以節(jié)省存儲空間和轉(zhuǎn)換時間;因此,一般中間結(jié)果數(shù)據(jù)需要暫時保存在外存上,以后又需要輸入內(nèi)存的,常用二進(jìn)制文件保存。但是1個字節(jié)并不對應(yīng)1個字符,因此不能直接輸出字符形式。文件概述文件類型指針文件型指針文件型指針的作用:打開和關(guān)閉操作靠文件指針來實現(xiàn)。作用是用來指向文件的當(dāng)前位置。當(dāng)定義一個文件型指針并使其指向某個文件后,系統(tǒng)就通過文件指針來讀取這個文件。文件型指針定義格式:FILE*fpfp是一個指向FILE類型結(jié)構(gòu)體的指針變量,通過該結(jié)構(gòu)體變量中的文件信息能夠訪問該文件。系統(tǒng)給每個打開的文件都在內(nèi)存中開辟一個區(qū)域,用于存放文件的有關(guān)信息(如文件名、文件位置等),這些信息保存在一個FILE結(jié)構(gòu)類型的變量(由系統(tǒng)定義)中。必須大寫文件的打開與關(guān)閉一、文件的打開C語言文件的打開是通過stdio.h函數(shù)庫的fopen()函數(shù)實現(xiàn)的。fopen()函數(shù)的原型是:FILE*fopen(char*filename,char*mode);其中filename是要打開的文件名,mode是說明處理文件的方式。它的調(diào)用方式一般為:文件指針變量=fopen(文件名,處理文件方式);例如:fp=fopen(“a:\\exam1.c”,”r”)注意:“文件名”是要打開的文件的文件名字,可以是包含盤符、路徑、文件名、擴展名的文件標(biāo)識符。但在書寫時要符合C語言的規(guī)定。例如文件名”a:\tc\w1.c”,在該函數(shù)中的文件名應(yīng)寫成”a:\\tc\\w1.c”。【例14.1】打開名為text1的文件,如打開失敗,顯示“無法打開”。#include<stdio.h>#include<stdlib.h>//exit函數(shù)說明voidmain(){FILE*fp;fp=fopen("d:\\text1.txt","r");if(fp==NULL){printf("can'topenfile\n");exit(1);}fclose(fp);}其中第6-7句也可合成一個語句:if((fp=fopen("d:\\text1.txt","r"))==NULL)必須大寫打開名為text1的文件,使用的存取文件方式是“讀”,并令指針fp指向文件text1。注意c中用\\表示一個字符\文件的打開與關(guān)閉二、文件的關(guān)閉當(dāng)C語言文件使用完后,應(yīng)該立即關(guān)閉文件,防止由于誤操作等原因破壞已經(jīng)打開的文件。文件的關(guān)閉通過stdio.h中的fclose()函數(shù)實現(xiàn)。具體用法是:intfclose(FILE*文件指針);功能:關(guān)閉“文件指針”所指向的文件。使文件指針變量不指向該文件,也就是文件指針變量與文件“脫鉤”,此后不能再通過該指針對原來與其相聯(lián)系的文件進(jìn)行讀寫操作。包括清空內(nèi)部數(shù)據(jù)緩沖區(qū)。參數(shù)說明:文件指針指向已經(jīng)打開的文件。函數(shù)返回值:正常關(guān)閉,返回值為0;否則,返回值為EOF。例如:fclose(fp);則程序?qū)⑽募愋椭羔榝p所指向的文件關(guān)閉。fp不再指向該文件。所謂讀文件是指,將磁盤文件中的數(shù)據(jù)傳送到計算機內(nèi)存的操作:文件(磁盤)

內(nèi)存所謂寫文件是指,從計算機內(nèi)存向磁盤文件中傳送數(shù)據(jù)的操作:內(nèi)存

文件(磁盤)

文件的讀寫操作文件的讀寫操作C語言提供多種對文件的讀取和寫入的函數(shù),這里主要介紹四種常用文件的讀寫操作函數(shù),它們都在頭文件stdio.h定義的:按字符讀寫的函數(shù)fgetc()、fputc()按字符串讀寫的函數(shù)fgets()、fputs()按格式要求讀寫的函數(shù)fprintf()、fscanf()按數(shù)據(jù)塊讀寫的函數(shù)fread()、fwrite()按字符讀寫的函數(shù)fgetc()、fputc()1.

fputc()函數(shù)函數(shù)fputc()的作用是向文件寫入一個字符。其調(diào)用形式為:fputc(字符,文件型指針變量)

例:fputc(‘A’,fp);fp為一個文件類型指針變量,上式將字符常量’A’(也可以是字符型變量)寫入文件當(dāng)前位置,并且使文件位置指針下移一個字節(jié)。如果寫入操作成功,返回值是該字符,否則返回EOF。按字符讀寫的函數(shù)fgetc()、fputc()通過鍵盤輸入字符到文件中,直到輸入“*”結(jié)束。#include<stdio.h>intmain(){ FILE*fp; charin_char; fp=fopen("test.txt","w+"); in_char=getchar(); while(in_char!='*') {fputc(in_char,fp); in_char=getchar(); } fclose(fp);return0;}按字符讀寫的函數(shù)fgetc()、fputc()2.

fgetc()函數(shù)函數(shù)fgetc()的作用是從一個文件中讀取一個字符。其調(diào)用形式為:fgetc(文件型指針變量)例:a=fgetc(fp);fp為一個文件類型指針變量,函數(shù)fgetc(fp)不僅返回文件當(dāng)前位置的字符,并且使文件位置指針下移一個字符。如果遇到文件結(jié)束,則返回值為文件結(jié)束標(biāo)志EOF。按字符讀寫的函數(shù)fgetc()、fputc()輸入文件名,輸出該文件的內(nèi)容。

#include<stdio.h>intmain(){FILE*fp;charout_ch,f_name[30];scanf("%s",f_name);fp=fopen(f_name,"r");if(fp!=NULL){while((out_ch=fgetc(fp))!=feof)//fileendoffileputchar(out_ch);}elseprintf("\n\n\t\t%s文件不存在。\n",f_name);fclose(fp);return0;}按字符讀寫的函數(shù)fgetc()、fputc()◆符號常量EOF

在對ASCII碼文件執(zhí)行讀入操作時,如果遇到文件尾,則返回一個文件結(jié)束標(biāo)志EOF(其值在頭文件stdio.h中被定義為-1)。◆庫函數(shù)feof()(1)用法:intfeof(文件指針);(2)功能:在執(zhí)行讀文件操作時,如果遇到文件尾,則函數(shù)返回邏輯真(1);否則,則返回邏輯假(0)。feof()函數(shù)同時適用于ASCII碼文件和二進(jìn)制文件(只能使用該函數(shù),不能使用EOF)。 FILE*fp; fp=fopen("11.25","r"); chara[10][15]={'\0'}; intm=0,n=0;

while(!feof(fp)) { fgets(a[m],15,fp); m++; }

按字符串讀寫的函數(shù)fgets()、fputs()1.

fputs函數(shù)函數(shù)fputs的作用是向文件寫入一個字符串。并將讀寫位置指針向前移動length(串長)個字節(jié)。其調(diào)用形式為:fputs(字符串,文件型指針變量)其中字符串可以是字符串常量、指向字符串的指針變量、存放字符串?dāng)?shù)組的數(shù)組名。寫入文件成功,函數(shù)返回值為0,否則為EOF。注意:字符串的結(jié)束標(biāo)志’\0’不寫入。例如:

fputs(“Hello”,fp);fp為一個文件類型指針變量,上式將字符串中的字符H、e、l、l、o寫入文件指針的當(dāng)前位置。按字符串讀寫的函數(shù)fgets()、fputs()2.

fgets函數(shù)函數(shù)fgets的作用是從一個文件中讀取一個字符串。其調(diào)用形式為:fgets(字符數(shù)組,字符數(shù),文件型指針變量)例:fgets(str,n,fp);其作用是從fp指向的文件的當(dāng)前位置開始讀取n-1個字符,并加上字符串結(jié)束標(biāo)志’\0’一起放入字符數(shù)組str中,同時,將讀寫位置指針向前移動length(串長)個字節(jié)。如果從文件讀取字符時遇到換行符或文件結(jié)束標(biāo)志EOF,讀取結(jié)束。函數(shù)返回值為字符數(shù)組str的首地址。按字符串讀寫的函數(shù)fgets()、fputs()將文件d:\data1.txt中的內(nèi)容復(fù)制到d:\data2.txt中。#include<stdio.h>intmain(){FILE*f_in,*f_out;charstr[50]={0};f_out=fopen(“d:\\data1.txt”,"r");f_in=fopen(“d:\\data2.txt”,"w");

fgets(str,50,f_out);fputs(str,f_in);fclose(f_out);fclose(f_in);return0;}按格式要求讀寫函數(shù)fprintf()、fscanf()1.

fprintf()函數(shù)函數(shù)fprintf()的作用與printf()相似,只是輸出對象不是標(biāo)準(zhǔn)輸出設(shè)備而是文件,即按照格式要求將數(shù)據(jù)寫入文件。它調(diào)用的一般形式為:fprintf(文件型指針變量,格式控制,輸出表列)例如:

fprintf(fp,”%ld,%s,%5.1f”,num,name,score);它的作用是將變量num、name、score按照%ld、%s、%5.1f的格式寫入fp指向的文件的當(dāng)前位置。按格式要求讀寫函數(shù)fprintf()、fscanf()2.

fscanf()函數(shù)函數(shù)scanf()從通過標(biāo)準(zhǔn)輸入設(shè)備讀取數(shù)據(jù),同樣函數(shù)fscanf()按照格式要求從文件中讀取數(shù)據(jù)。它調(diào)用的一般形式為:fscanf(文件型指針變量,格式控制,輸入表列);例如:fscanf(fp,”%ld,%s,%5.1f”,&num,&name,&score);它的作用是從fp指向的文件的當(dāng)前位置開始,按照%ld、%s、%5.1f的格式取出數(shù)據(jù),賦給變量num、name和score。按格式要求讀寫函數(shù)fprintf()、fscanf()將10個學(xué)生記錄輸入文件d:\stu1.txt中,并且顯示在屏幕上。

FILE*fp;longnum;intn,score;charname[20];fp=fopen("d:\\stu1.txt","w");for(n=1;n<=10;n++){scanf("%s%10ld%d",name,&num,&score);fprintf(fp,"%20s%10ld%5d\n",name,num,score);}fclose(fp);fp=fopen("d:\\stu1.txt","r");for(n=1;n<=10;n++){fscanf(fp,"%20s%10ld%5d\n",name,&num,&score);printf("%20s%10ld%5d\n",name,num,score);}fclose(fp);}函數(shù)feof()函數(shù)feof()函數(shù)feof()用來檢測一個指向文件的指針是否已經(jīng)指到了文件最后的結(jié)束標(biāo)志EOF。調(diào)用的一般形式為:

feof(文件型指針變量);如果文件型指針指向的文件的當(dāng)前位置為結(jié)束標(biāo)志EOF,則函數(shù)返回一個非零值,否則返回0值。例如:feof(fp);宏定義宏:一種使用標(biāo)識符表示字符序列的機制。宏定義分為帶參數(shù)的宏定義和不帶參數(shù)的宏定義。不帶參數(shù)的宏定義一般形式為:

#define標(biāo)識符字符串它的作用是在編譯預(yù)處理時,將源程序中所有標(biāo)識符替換成字符串。例如:

#definePRprintf #defineN2則源程序中所有“PR”標(biāo)識符在編譯預(yù)處理時將被“printf”代替、所有“N”標(biāo)識符在編譯預(yù)處理時將被“2”代替。帶參數(shù)的宏定義為了進(jìn)一步擴大宏的應(yīng)用范圍,在定義宏時,還可以帶參數(shù)。一般形式為:#define標(biāo)識符(參數(shù)表)字符串它的作用是在編譯預(yù)處理時,將源程序中所有標(biāo)識符替換成字符串,并且將字符串中的參數(shù)用實際使用的參數(shù)替換。例如:#defineS(a,b,c)(a+b+c)/2則源程序中如果使用了S(3,4,5),在編譯預(yù)處理時將替換為(3+4+5)/2。#include<stdio.h>#definePI3.14159#defineL(r)2*PI*(r)#defineS(r)PI*(r)*(r)voidmain(){floatradius,circle,area;scanf(“%f”,&radius);circle=L(radius);area=S(radius);printf(“radius:%f\tcircle:%f\tarea:%f\n”,radius,circle,area);}}例:鍵盤上輸入n,從文件11.2中讀出小于n的所有素數(shù),輸出到屏幕和d:\s002.txt文件中。鍵盤輸入nscanf小于n的素數(shù)計數(shù)器++與文件有關(guān),讀寫不同文件FILE*fp1,*fp2

溫馨提示

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

評論

0/150

提交評論