版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第11章文件
學(xué)習(xí)內(nèi)容11.1磁盤文件信息復(fù)制11.2文件類型指針11.3文件的基本操作11.4文件的定位函數(shù)11.5文件出錯檢測函數(shù)11.6小型案例11.7小
結(jié)11.1磁盤文件信息復(fù)制問題
在我們使用電腦時,時常要將一個磁盤文件中的信息復(fù)制到另一個磁盤文件中,使其達(dá)到對文件信息備份及另存的目的。為此我們可以編寫一個程序來執(zhí)行其操作。
解決這個問題我們要明確操作文件的“三步曲”:第一步,對文件操作之前要將其打開;第二步,處理其數(shù)據(jù);第三步,數(shù)據(jù)處理完后將文件關(guān)閉。針對當(dāng)前任務(wù)的第一步就是明確原文件及目標(biāo)文件并將兩者打開,再將原文件信息讀出,把讀出的信息寫入目標(biāo)文件中,然后關(guān)閉原文件與目標(biāo)文件。通過這幾步,我們已明確了該問題的設(shè)計思路。分析11.1磁盤文件信息復(fù)制設(shè)計
圍繞文件操作的“三步曲”,我們可以用printf()函數(shù)進(jìn)行文件名的輸入提示,用scanf()函數(shù)將文件名輸入。使用fopen()函數(shù)打開兩個文件時判斷這兩個文件是否能正常打開,如不能打開則輸出提示。用fgetc()函數(shù)讀出原文件信息。用feof()函數(shù)判斷原文件信息是否讀完。用fputc()函數(shù)把讀出的信息寫入目標(biāo)文件中。最后用fclose()關(guān)閉原文件與目標(biāo)文件。11.1磁盤文件信息復(fù)制實現(xiàn)11.1
磁盤文件信息復(fù)制#include"stdio.h"main(){FILE*infp,*outfp;charch,infile[10],outfile[10];printf("Entertheinfilename:\n");scanf("%s",infile);printf("Entertheoutfilename:\n");scanf("%s",outfile);if((infp=fopen(infile,"r"))==NULL){printf("cannotopeninfile\n");exit(0);}if((outfp=fopen(outfile,"w"))==NULL){printf("cannotopenoutfile\n");exit(0);}while(!feof(infp))fputc(fgetc(infp),outfp);fclose(infp);fclose(outfp);}其程序運行情況如下:
Entertheinfilename:wj1.c(輸入原有磁盤文件名)Entertheoutfilename:wj2.c(輸入新復(fù)制的磁盤文件名)11.1磁盤文件信息復(fù)制11.2文件類型指針相關(guān)概述C語言在使用文件時,系統(tǒng)會在內(nèi)存中為每一個文件開辟一個區(qū)域,用來存放文件的有關(guān)信息(如文件的名字、文件狀態(tài)以及文件當(dāng)前的位置等)。這些信息是保存在一個結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是由系統(tǒng)定義的,取名為FILE。11.2文件類型指針TurboC在stdio.h文件中有以下的文件類型聲明:
typedef
struct{shortlevel; /*緩沖區(qū)“滿”或“空”的程度*/unsignedflags; /*文件狀態(tài)標(biāo)志*/charfd;
/*文件描述符*/unsignedcharhold; /*如無緩沖區(qū)不讀取字符*/shortbsize;
/*緩沖區(qū)的大小*/unsignedchar*buffer; /*數(shù)據(jù)緩沖區(qū)的位置*/unsignedchar*curp; /*指針,當(dāng)前的指向*/unsignedistemp; /*臨時文件,指示器*/shorttoken; /*用于有效性檢查*/}FILE;
有了結(jié)構(gòu)體FILE類型之后,可以用它來定義若干個FILE類型的變量,以便存放若干個文件的信息。例如,可以定義以下FILE類型的數(shù)組。
FILE
f[3];
定義了一個結(jié)構(gòu)體數(shù)組f,它有3個元素,可以用來存放3個文件的信息??梢远x文件型指針變量。如:
FILE*fp1,*fp2;
11.2文件類型指針11.3文件的基本操作文件的打開C語言在頭文件stdio.h中提供了標(biāo)準(zhǔn)輸入輸出函數(shù)庫,用fopen()函數(shù)來實現(xiàn)打開文件。fopen()函數(shù)的調(diào)用方式通常為
FILE
*fp;fp=fopen(“文件名”,“文件操作方式”);11.3文件的基本操作注意對于文件名的使用,應(yīng)注意以下幾個方面:使用文件名時,必須對其用雙引號括起來,如果使用的是字符數(shù)組(或字符指針),則不使用雙引號。如果在當(dāng)前目錄下使用一個文件,則可以不加路徑。如果使用的文件不在當(dāng)前目錄下,則有兩種情況:(1)如果不在當(dāng)前目錄的子目錄下使用某一個文件,則必須加上相對路徑。例如,在當(dāng)前目錄下有一個子目錄test,如果要以追加方式使用test目錄下的一個文件file0.txt,可以這樣使用:fp=fopen("test\\file0.txt","a");注意,test后面必須用“\\”,不能用“\”。(2)如果使用的文件在另外一個目錄下,此時必須使用絕對路徑,例如,在C盤下有一個目錄doc,如果要以只讀方式使用此目錄下的文件file1.txt,可以這樣使用:fp=fopen("c:\\doc\\file1.txt","r");或fp=fopen("c:/doc/file1.txt","r");11.3文件的基本操作文件的操作方式11.3文件的基本操作文件的關(guān)閉
所謂關(guān)閉文件,是指把(輸出)緩沖區(qū)的數(shù)據(jù)輸入到磁盤文件中,同時釋放文件指針變量(即使文件指針變量不再指向該文件)。此后,不能再通過該指針變量來訪問該文件,除非再次打開,使該指針變量重新指向該文件。11.3文件的基本操作
intfclose(文件指針名)已打開的文件指針函數(shù)功能:關(guān)閉文件指針指定的文件,釋放該文件的緩沖區(qū)、FILE類型變量及文件指針。若文件關(guān)閉成功,則返回0;若文件關(guān)閉失敗,則返回非0值。文件的關(guān)閉11.3文件的基本操作文件的關(guān)閉關(guān)閉文件的作用有以下兩點:1.使文件指針fp與文件脫離。2.刷新文件輸入輸出緩沖區(qū)。11.3文件的基本操作文件讀函數(shù)
fgetc()函數(shù)的作用是從“文件指針變量”所指向的文件(該文件必須是以讀或讀寫方式打開的)中,讀出一個字符,同時將讀寫位置指針向前移動1個字節(jié)(即指向下一個字符)。
fgetc()函數(shù)其調(diào)用形式為:ch=fgetc(fp);文件型指針變量字符變量11.3文件的基本操作文件讀函數(shù)注意:在對二進(jìn)制文件執(zhí)行讀入操作時,必須使用函數(shù)feof()來判斷是否遇到文件尾。
feof()函數(shù)其調(diào)用形式為:
feof(文件指針變量);
如:feof(fp)指測試fp所指向的文件當(dāng)前狀態(tài)是否“文件結(jié)束”。如果是文件結(jié)束,函數(shù)feof(fp)的值為1(真),否則為0(假)。如果想順序讀入一個二進(jìn)制文件中的數(shù)據(jù),可以用while(!feof(fp)){i=fgetc(fp);}11.3文件的基本操作文件讀函數(shù)
fread()函數(shù)其調(diào)用形式為:
fread(buffer,size,count,fp);buffer:是一個指針,它是讀入數(shù)據(jù)的存放地址。size:要讀的字節(jié)數(shù)。count:要進(jìn)行讀多少個size字節(jié)的數(shù)據(jù)項。fp:文件型指針。11.3文件的基本操作文件讀函數(shù)
用fgetc()函數(shù)可以用來讀寫文件中的一個字符,但是常常要求一次讀入一組數(shù)據(jù)(如,一個實數(shù)或一個結(jié)構(gòu)體變量的值)。
fread()函數(shù)
如果文件以二進(jìn)制形式打開,用fread()函數(shù)就可以讀寫任何類型的信息。如:fread(bf,4,3,fp);
其中bf是一個實型數(shù)組名。一個實型變量占4個字節(jié)。這個函數(shù)從fp所指向的文件讀入3次(每次4個字節(jié))數(shù)據(jù),存儲到數(shù)組bf中。11.3文件的基本操作文件讀函數(shù)
fscanf()函數(shù)fscanf()函數(shù)與scanf()函數(shù)作用相仿,都是格式化讀函數(shù)。只有一點不同:fscanf()函數(shù)的讀出對象不是終端而是磁盤文件。
一般調(diào)用方式為fscanf(文件指針,格式字符串,輸入列表);例如:
fscanf(fp,"%d,%f",&a,&b);11.3文件的基本操作文件讀函數(shù)
fgets()函數(shù)
fgets()函數(shù)的作用是從指定文件讀出(向內(nèi)存輸入)一個字符串。它的調(diào)用方式為:
fgets(接收輸入的字符型指針,輸入字符個數(shù),文件指針名);
如:
fgets(str,m,fp);11.3文件的基本操作文件寫函數(shù)
fputc()函數(shù)其調(diào)用形式為:
fputc(ch,fp);文件型指針變量字符變量
其中ch是要寫入文件的字符,它可以是一個字符常量,也可以是一個字符變量。fp是文件指針變量。fputc(ch,fp)函數(shù)的作用是將字符(ch的值)輸出到fp所指向的文件中去。fputc函數(shù)也帶回一個值:如果輸出成功,則返回值就是輸出的字符;如果輸出失敗,則返回一個EOF(-1)。11.3文件的基本操作文件讀函數(shù)
fwrite()函數(shù)其調(diào)用形式為:
fwrite(buffer,size,count,fp);buffer是一個指針,是要輸出數(shù)據(jù)的地址(以上指的是起始地址)size是要讀寫的字節(jié)數(shù)。count是要進(jìn)行讀寫多少個size字節(jié)的數(shù)據(jù)項。fp是文件型指針。11.3文件的基本操作文件讀函數(shù)
fwrite()函數(shù)
同fread()函數(shù)一樣,當(dāng)文件以二進(jìn)制形式打開,用fwrite()函數(shù)就可以讀寫任何類型的信息,如:fwrite(bf,4,3,fp);
假設(shè)bf是一個實型數(shù)組名。一個實型變量占4個字節(jié)。那么這個fwrite()函數(shù)向fp所指向的文件寫入3次(每次4個字節(jié))數(shù)據(jù),存儲到數(shù)組bf中。11.3文件的基本操作文件讀函數(shù)
fputc()函數(shù)fprintf()函數(shù)與printf()函數(shù)作用相仿,都是格式化讀寫函數(shù)。只有一點不同:fprintf()函數(shù)的寫入對象不是終端而是磁盤文件。它們的一般調(diào)用方式為
fprintf(文件指針,格式字符串,輸出表列);
例如:fprintf(fp,"%d,%f",a,b);
它的作用是把“輸入列表”所列出的變量值如a,b按“格式字符串”里給出的格式說明(“%”開頭)如"%d,%f",寫入到fp所指磁盤文件(已打開)中。在該函數(shù)得到正確執(zhí)行后,返回從文件中寫入的數(shù)值個數(shù),否則返回EOF(-1)。11.3文件的基本操作文件讀函數(shù)
fprintf()函數(shù)fprintf()函數(shù)與printf()函數(shù)作用相仿,都是格式化讀寫函數(shù)。只有一點不同:fprintf()函數(shù)的寫入對象不是終端而是磁盤文件。它們的一般調(diào)用方式為
fprintf(文件指針,格式字符串,輸出表列);
例如:fprintf(fp,"%d,%f",a,b);
它的作用是把“輸入列表”所列出的變量值如a,b按“格式字符串”里給出的格式說明(“%”開頭)如"%d,%f",寫入到fp所指磁盤文件(已打開)中。在該函數(shù)得到正確執(zhí)行后,返回從文件中寫入的數(shù)值個數(shù),否則返回EOF(-1)。11.3文件的基本操作文件讀函數(shù)
fputs()函數(shù)fputs()函數(shù)的作用是向指定的文件寫入(從內(nèi)存輸出)一個字符串。其調(diào)用方式為:fputs(要寫入的字符串,文件名);
如:fputs("Wuhan",fp);
把字符串“Wuhan”寫入到fp指向的文件。fputs()函數(shù)中第一個參數(shù)可以是字符串常量、字符數(shù)組名或字符型指針。字符串末尾的“\0”不輸出。若輸出成功,函數(shù)值為0;失敗時,為EOF。11.4文件的定位的函數(shù)
文件中有一個讀寫位置指針,指向當(dāng)前的讀寫位置。每次讀寫1個(或1組)數(shù)據(jù)后,系統(tǒng)自動將位置指針移動指向下一個讀寫位置上。如果想改變這樣的規(guī)律,強制使位置指針指向其他指定的位置,可以用有關(guān)函數(shù)。相關(guān)概述11.4文件的定位的函數(shù)rewind()函數(shù)rewind函數(shù)的作用是使位置指針重新返回文件的開頭。此函數(shù)沒有返回值。實例分析例11-10有一個磁盤文件,第一次將它的內(nèi)容顯示在屏幕上,第二次把它復(fù)制到另一文件中。#include"stdio.h"main(){FILE*fp1,*fp2;if((fp1=fopen("student0.txt","r"))==NULL){printf("cannotopenfile\n");exit(0); }if((fp2=fopen("student1.txt","w"))==NULL){ printf("cannotopenfile\n");exit(0); }while(!feof(fp1))putchar(getc(fp1));rewind(fp1);while(!feof(fp1))putc(getc(fp1),fp2);fclose(fp1);fclose(fp2);printf("\n");}11.4文件的定位的函數(shù)fseek()函數(shù)
對流式文件可以進(jìn)行順序讀寫,也可以進(jìn)行隨機(jī)讀寫。關(guān)鍵在于控制文件的位置指針,如果位置指針是按字節(jié)位置順序移動的,就是順序讀寫。如果能將位置指針按需要移動到任意位置,就可以實現(xiàn)隨機(jī)讀寫。所謂隨機(jī)讀寫,是指讀寫完上一個字符(字節(jié))后,并不一定要讀寫其后續(xù)的字符(字節(jié)),而可以讀寫文件中任意所需的字符(字節(jié))。11.4文件的定位的函數(shù)fseek()函數(shù)
用fseek函數(shù)可以實現(xiàn)改變文件的位置指針。fseek函數(shù)的調(diào)用形式為:fseek
(文件類型指針,位移量,起始點)如:fseek(fp,100L,0);功能:把位置指針移動到距離文件頭100字節(jié)處。實例分析例11-11在磁盤文件上存有8個學(xué)生的數(shù)據(jù)。要求將第2、4、6、8個學(xué)生的數(shù)據(jù)輸入計算機(jī),并在屏幕上顯示出來。#include"stdio.h"structstudent_data{charname[8];intnumber;intage;charsex;}stu[8];main(){inti;FILE*fp;if((fp=fopen("student.txt","rb"))==NULL){printf("cannotopenfile\n");exit(0);}11.4文件的定位的函數(shù)11.4文件的定位的函數(shù)for(i=1;i<8;+=2){fseek(fp,i*sizeof(structstudent_data),0);fread(&stu[i],sizeof(structstudent_data),1,fp);
printf("%s%d%d%c\n",stu[i].name,stu[i].number,stu[i].age,stu[i].sex);
}fclose(fp);}11.5文件出錯檢測函數(shù)ferror()函數(shù)
在調(diào)用各種輸入輸出函數(shù)(如putc、getc、fread、fwrite等)時,如果出現(xiàn)錯誤,除了函數(shù)返回值有所反映外,還可以用ferror函數(shù)檢查。
它的一般調(diào)用形式為
ferror(fp);
其中參數(shù)文件指針fp為被測試文件,ferror()函數(shù)用來對該文件所做的最近一次操作進(jìn)行正確性測試。如果ferror返回值為0(假),表示未出錯。如果返回一個非0值,表示出錯。在執(zhí)行fopen函數(shù)時,ferror函數(shù)的初始值自動置為0。11.5文件出錯檢測函數(shù)實例分析例11-12編寫一個程序,接收從鍵盤輸入的一個字符串、一個實數(shù)、一個整數(shù),隨即將其存入“d:/turboc2/liu.data”文件中。
程序中文件操作需錯誤碼測試。#include"stdio.h"voiderrp(FILE*fp){if(ferror(fp)!=0){printf("fileoperatebedefeated!\n");exit(0);}elsereturn;}11.5文件出錯檢測函數(shù)main(){FILE*fp;
charstr[8];floatx;inti;fp=fopen("d:/turboc2/liu.data","w");errp(fp);/*調(diào)用函數(shù)errp(),進(jìn)行錯誤測試。*/printf("Pleaseenterastring,float,integer:\n");
fscanf(stdin,"%s%f%d",str,&x,&i);/*從標(biāo)準(zhǔn)輸入文件stdin(鍵盤)輸入3個數(shù)據(jù)。*/errp(fp);/*調(diào)用函數(shù)errp(),進(jìn)行錯誤測試。*/fprintf(fp,"%s%f%d",str,x,i);errp(fp);/*調(diào)用函數(shù)errp(),進(jìn)行錯誤測試。*/fclose(fp;}11.5文件出錯檢測函數(shù)clearerr()函數(shù)
它的作用是使文件錯誤標(biāo)志和文件結(jié)束標(biāo)志置為0。假設(shè)在調(diào)用一個輸入輸出函數(shù)時出現(xiàn)錯誤,ferror函數(shù)值為一個非0值。在調(diào)用clearerr(fp)后,ferror(fp)的值變成0。
只要出現(xiàn)錯誤標(biāo)志,就一直保留,直到對同一文件調(diào)用clearerr函數(shù)或rewind函數(shù),或任何其他一個輸入輸出函數(shù)。11.6小型案例問題
檢查命令行所列出的文件test.txt中每一行的左括號“(”及右括號“)”是否匹配,如有錯誤,將錯誤所在行數(shù)寫入文件result.txt中。
對此問題我們要考慮的第一步,還是遵循文件操作的“三步曲”,首先打開兩文件test.txt及result.txt;再次就是對被測文件test.txt中的左右括號,逐行計數(shù)比較,直到讀完該文件為止,將左右括號不對稱的行數(shù)數(shù)據(jù)寫入文件result.txt中(即對文件讀寫);然后關(guān)閉兩個文件分析11.6小型案例實現(xiàn)#include"stdio.h"main(argc,argv)intargc;char*argv[];{FILE*test,*result;inti,j,line,sign,x;charch;if(argc<2){printf("notice:youshouldenterfilename!\n");/*提示輸入文件名。*/printf("usage:executablefiletestfile\n");/*提示輸入文件名的正確格式。*/exit(0);}11.6小型案例if((test=fopen(argv[1],"r"))==NULL)/*打開文件test.txt并判斷文件打開是否正常。*/{printf("cannotopentestfile\n");/*如果打開文件出錯,顯示打開出錯。*/exit(0);}if((result=fopen("result.txt","w"))==NULL)/*打開文件result.txt并判斷文件打開是否正常。*/{printf("cannotopenresultfile\n");/*如果打開文件出錯,顯示打開出錯。*/exit(0);}line=0;/*預(yù)置行數(shù)值。*/sign=1;/*預(yù)置左右括號對稱標(biāo)注值。*/11.6小型案例while(!feof(test)){line++;i=0;j=0;ch=fgetc(test);while((!feof(test))&&(ch!='\n')) /*計算一行中的左右括號數(shù)。*/{if(ch==40)i++;if(ch==41)j++;ch=fgetc(test);}11.6小型案例if(i!=j)/*判斷一行中的左右括號數(shù)是否相等。*/{sign=0;ch=
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 采購營養(yǎng)土種植合同模板
- 活立木采伐合同模板
- 挖土施工合同模板
- 采購魷魚原料合同模板
- 固體飲料代工合同模板
- 暖氣試水打壓合同模板
- 鋼筋制安工程合同模板
- 雪地靴訂貨合同模板
- 公墓養(yǎng)護(hù)合同模板
- 綠化施工合同模板最近
- 新公共管理理論對我國公務(wù)員制度的影響
- 重大事故隱患治理督辦制度
- 電動車充電樁設(shè)備施工方案
- 綜合病房工程裝飾裝修工程監(jiān)理細(xì)則
- 角膜穿通傷護(hù)理查房
- 2023年國家電力投資集團(tuán)公司招聘筆試題庫及答案解析
- 提高護(hù)士對病人預(yù)見性管理及早期風(fēng)險識別課件
- 西班牙語入門-字母與單詞發(fā)音課件
- 刑事申訴狀成功范文(通用十三篇)
- 建筑工程類專業(yè)答辯可能的問題匯總
- 小學(xué)四年級地方課程安全教育教案泰山出版社
評論
0/150
提交評論