




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十一章
文件內(nèi)容簡(jiǎn)介⑴文件類型指針。⑵文件的打開(kāi)和關(guān)閉。⑶文件的讀寫(xiě)。(4)文件的定位。11.1文件概述11.1 文件概述所謂“文件”是指一組相關(guān)數(shù)據(jù)的有序集合。這個(gè)數(shù)據(jù)集有一個(gè)名稱,叫做文件名。文件通常是存儲(chǔ)在外部存儲(chǔ)器中(如磁盤(pán)等)上的,在使用時(shí)才調(diào)入內(nèi)存中來(lái),該過(guò)程被稱為打開(kāi)文件操作,用戶也可以通過(guò)程序?qū)?shù)據(jù)輸出到文件中,該過(guò)程稱為文件的保存操作。文件的分類①?gòu)挠脩籼幚砦募牡慕嵌瓤?,文件可分為普通文件和設(shè)備文件兩種。②從文件編碼的方式來(lái)看,文件可分為ASCII碼文件和二進(jìn)制碼文件兩種。文件系統(tǒng)目前C語(yǔ)言所使用的磁盤(pán)文件系統(tǒng)有兩大類:一類稱為緩沖文件系統(tǒng),又稱為標(biāo)準(zhǔn)文件系統(tǒng);另一類稱為非緩沖文件系統(tǒng)。11.2文件類型指針11.2 文件類型指針typedefstruct{shortlevel;/*緩沖區(qū)的滿/空狀態(tài)*/unsignedflags;/*文件狀態(tài)旗標(biāo)*/charfd;/*文件描述*/unsignedcharhold;/*如無(wú)緩沖區(qū)不讀取字符*/shortbsize;/*緩沖區(qū)大小*/unsignedchar*buffer;/*數(shù)據(jù)傳輸緩沖區(qū)*/unsignedchar*curp;/*當(dāng)前激活的指針*/unsignedistemp;/*臨時(shí)文件指示符*/shorttoken;/*有效性檢查*/}FILE;通常使用FILE結(jié)構(gòu)類型定義文件指針變量,例如:FILE*fp;/*fp是一個(gè)指向FILE類型結(jié)構(gòu)體的指針變量*/使用fp指向某一個(gè)文件,從而可以訪問(wèn)文件的信息。11.3文件的打開(kāi)和關(guān)閉文件的打開(kāi)和關(guān)閉文件的打開(kāi)文件打開(kāi)采用fopen()函數(shù)。一般格式:FILE *fp;fp=fopen("文件名","文件打開(kāi)方式");功能:該函數(shù)可以返回一個(gè)指向“文件名”的FILE類型的指針?!拔募笔侵敢蜷_(kāi)(或創(chuàng)建)的文件名;“文件打開(kāi)方式”代表對(duì)文件的訪問(wèn)方式。例如:fp=fopen("data.dat","r");11.3文件的打開(kāi)和關(guān)閉文件使用方式含義“r/rb”(只讀)為讀入打開(kāi)一個(gè)文本/二進(jìn)制文件“w/wb”(只寫(xiě))為寫(xiě)入打開(kāi)或建立一個(gè)文本/二進(jìn)制文件“a/ab”(追加)向文本/二進(jìn)制文件尾追加數(shù)據(jù)“r+/rb+”(讀寫(xiě))為讀/寫(xiě)打開(kāi)一個(gè)文本/二進(jìn)制文件“w+/wb+”(讀寫(xiě))為讀/寫(xiě)建立一個(gè)文本/二進(jìn)制文件“a+/ab+”(讀寫(xiě))為讀/寫(xiě)打開(kāi)或建立一個(gè)文本/二進(jìn)制文件常用的文件打開(kāi)方式及其含義見(jiàn)表11-1所示。表11-1文件打開(kāi)方式及其含義11.3文件的打開(kāi)和關(guān)閉11.3.2 文件的關(guān)閉在C語(yǔ)言中,文件的關(guān)閉是通過(guò)fclose函數(shù)來(lái)實(shí)現(xiàn)。此函數(shù)的聲明在“stdio.h”中。一般格式:intfclose(FILE*fp);功能:關(guān)閉文件指針fp指向的文件。說(shuō)明:FILE*fp——指向要關(guān)閉文件的指針。函數(shù)返回值——int類型,如果為0,則表示文件關(guān)閉成功,否則返回EOF表示失敗。11.4文件的讀寫(xiě)11.4.1 文件單字符的讀寫(xiě)文件單字符的讀寫(xiě)以字符為單位的讀寫(xiě)函數(shù),可以從指定的文件每次讀出或?qū)懭雴蝹€(gè)字符。(1)文件讀一個(gè)字符函數(shù)fgetc一般格式:intfgetc(FILE*fp);功能:從指定的文件中讀一個(gè)字符,函數(shù)返回值為int類型。如果返回值為-1(EOF),表示已經(jīng)讀到文件末尾,否則返回讀到的字符的ASCII碼。例如:charch;ch=fgetc(fp);其意義是從打開(kāi)的文件fp中讀取一個(gè)字符并送入ch中。11.4文件的讀寫(xiě)【例11-1】讀c盤(pán)user1文件夾下的文件data.txt,并在屏幕上輸出其內(nèi)容。#include<stdio.h>main(){FILE*fp;charch;if((fp=fopen("c:\\user1\\data.txt","r"))==NULL){printf("cannotopenthisfile\n");exit(0);}ch=fgetc(fp);/*從文件中先讀取一個(gè)字符,存入變量ch中*/while(ch!=EOF)/*是否已經(jīng)讀到文件末尾*/{putchar(ch);/*將變量ch的內(nèi)容在顯示器上輸出*/ch=fgetc(fp);/*從文件中讀取下一個(gè)字符,并存入變量ch中*/}putchar("\n");fclose(fp); }11.4文件的讀寫(xiě)(2)文件寫(xiě)入一個(gè)字符函數(shù)fputc一般格式:intfputc(intc,FILE*fp);功能:把一個(gè)字符寫(xiě)入指定的文件中,該字符的ASCII值由參數(shù)c指定,待寫(xiě)入的字符也可以是字符常量或變量,例如:fputc("A",fp);其意義是把字符A寫(xiě)入(存入)到fp所指向的文件中。11.4文件的讀寫(xiě)【例11-2】綜合利用文件字符的讀寫(xiě)函數(shù),實(shí)現(xiàn)文件復(fù)制。#include"stdio.h"voidmain() {FILE*fpOrg,*fpDes;charOrgFile[10];charDesFile[10];charch;printf("請(qǐng)輸入原始文件名:\n");scanf("%s",OrgFile);printf("請(qǐng)輸入目標(biāo)文件名:\n");scanf("%s",DesFile);if((fpOrg=fopen(OrgFile,"r"))==NULL)/*以讀方式打開(kāi)文件OrgFile*/{printf("Openfilefailed!\n");exit(0);}if((fpDes=fopen(DesFile,"w"))==NULL)/*以寫(xiě)方式打開(kāi)文件DesFile*/{printf("Openfilefailed!\n");exit(0);}while((ch=fgetc(fpOrg))!=EOF)/*從文件OrgFile中讀一個(gè)字符,存入到變量ch中*/fputc(ch,fpDes);/*將變量ch中的字符寫(xiě)入到文件DesFile中*/fclose(fpOrg);fclose(fpDes); }11.4文件的讀寫(xiě)11.4.2 格式化讀寫(xiě)函數(shù)(1)格式化寫(xiě)入fprintf函數(shù)一般格式:intfprintf(FILE*fp,格式字符串,輸出項(xiàng)表列);功能:將輸出項(xiàng)表列按照指定的格式輸出到fp所指的文件中去。該函數(shù)的返回值為整型,如果成功則返回已經(jīng)寫(xiě)入的字節(jié)數(shù),寫(xiě)入失敗返回負(fù)數(shù)。11.4文件的讀寫(xiě)【例11-3】使用fprintf函數(shù)向指定文件中寫(xiě)入數(shù)據(jù)#include
<stdio.h>main(){FILE
*fp;int
i=1;float
f=3.14;char
s[]="HelloWorld!";char
ch="\n";if((fp=fopen("data.txt","w"))==NULL){printf("can
not
open
this
file\n");exit(0);}fprintf(fp,"%s%c",s,ch);/*以%s%c格式將變量s和ch的內(nèi)容存入fp指向的文件中*/fprintf(fp,"%d\n",i);/*以%d\n格式將變量i的內(nèi)容存入fp指向的文件中*/fprintf(fp,"%f\n",f);
/*以%f\n格式將變量f的內(nèi)容存入fp指向的文件中*/fclose(fp);
}11.4文件的讀寫(xiě)(2)格式化讀入fscanf函數(shù)一般格式:intfscanf(FILE*fp,格式字符串,輸入項(xiàng)地址表列);功能:按照“格式字符串”所指定的輸入格式,從fp指定文件的當(dāng)前讀寫(xiě)位置開(kāi)始讀出數(shù)據(jù),然后把它們按輸入項(xiàng)地址表列的順序存入到指定的存儲(chǔ)單元中。該函數(shù)的返回值為整型,如果成功則返回輸入項(xiàng)表列參數(shù)的個(gè)數(shù);讀入失敗或讀到了文件的末尾返回EOF。11.4文件的讀寫(xiě)【例11-4】使用fscanf函數(shù)從指定文件中讀數(shù)據(jù)#include<stdio.h>main(){FILE*fp;inti;floatf;chars[20];if((fp=fopen("data.txt","r"))==NULL){printf("cannotopenthisfile\n");exit(0);}fscanf(fp,"%s",s);/*以%s格式從fp指向的文件讀字符串,并存入變量s中*/printf("%s\n",s);fscanf(fp,"%d",&i);/*以%d格式從fp指向的文件讀整型數(shù)據(jù),并存入變量i中*/printf("%d\n",i);fscanf(fp,"%f\n",&f);/*以%f格式從fp指向的文件讀實(shí)型數(shù)據(jù),并存入變量f中*/printf("%f\n",f);fclose(fp); }11.4文件的讀寫(xiě)11.4.3 數(shù)據(jù)塊輸入/輸出函數(shù)數(shù)據(jù)塊輸入/輸出函數(shù)屬于二進(jìn)制文件的讀寫(xiě)函數(shù),主要包括:(1)塊輸出函數(shù)fwrite一般格式:intfwrite(數(shù)據(jù)類型名*buffer,unsignedsize,unsignedcount,FILE*fp)功能:將buffer緩沖區(qū)中的數(shù)據(jù)以二進(jìn)制的形式寫(xiě)入到fp所指定的文件中去。執(zhí)行過(guò)程為:從buffer開(kāi)始,每次輸出size個(gè)字節(jié),重復(fù)count次,將輸出的數(shù)據(jù)存放到fp所指向的文件中,并將文件的讀寫(xiě)位置指針移動(dòng)size*count個(gè)字節(jié),其中buffer是要輸出的數(shù)據(jù)在內(nèi)存中的起始地址。11.4文件的讀寫(xiě)【例11-5】使用fwrite函數(shù)向指定文件中輸出數(shù)據(jù)#include<stdio.h>#include<string.h>structStu{charNO[5];charname[10];intscore[3];}main(){FILE*fp;inti;structStustu[3];strcpy(stu[0].NO,"0001");strcpy(stu[0].name,"張三");stu[0].score[0]=65;stu[0].score[1]=95;stu[0].score[2]=75;strcpy(stu[1].NO,"0002");strcpy(stu[1].name,"李四");stu[1].score[0]=56;stu[1].score[1]=78;stu[1].score[2]=89;strcpy(stu[2].NO,"0003");strcpy(stu[2].name,"王五");stu[2].score[0]=61;stu[2].score[1]=66;stu[2].score[2]=93;if((fp=fopen("data.txt","wb"))==NULL){printf("cannotopenthisfile\n");exit(0);}for(i=0;i<3;i++)fwrite(&stu[i],sizeof(structStu),1,fp);/*從stu[i]首地址開(kāi)始,每次讀取結(jié)構(gòu)體Stu所占的個(gè)字節(jié)數(shù),重復(fù)1次,將全部數(shù)據(jù)寫(xiě)入fp指向的文件中*/fclose(fp);}11.4文件的讀寫(xiě)(2)塊輸入函數(shù)fread一般格式:intfread(數(shù)據(jù)類型名*buffer,unsignedsize,unsignedcount,FILE *fp)功能:從fp所指定的文件中以二進(jìn)制形式讀取數(shù)據(jù)塊。執(zhí)行過(guò)程為:從fp所指向文件的當(dāng)前位置開(kāi)始,每次讀入size個(gè)字節(jié),重復(fù)count次,將讀入的數(shù)據(jù)存放到從buffer開(kāi)始的內(nèi)存中,并將文件的讀寫(xiě)位置指針移動(dòng)size*count個(gè)字節(jié),buffer是存放讀入數(shù)據(jù)的起始地址。說(shuō)明:如果調(diào)用fread()成功,則函數(shù)返回值等于count。11.4文件的讀寫(xiě)【例11-6】使用fread函數(shù)從指定文件中讀數(shù)據(jù)#include<stdio.h>#include<string.h>structStu{charNO[5];charname[10];intscore[3];}main(){FILE*fp;inti;structStustu[3];if((fp=fopen("data.txt","rb"))==NULL){printf("cannotopenthisfile\n");exit(0);}for(i=0;i<3;i++){/*從fp指向的文件中讀取結(jié)構(gòu)體Stu所占字節(jié)數(shù),重復(fù)1次,并存入到首地址為&stu[i]的內(nèi)存單元中*/fread(&stu[i],sizeof(structStu),1,fp);printf("學(xué)號(hào):%s姓名:%s成績(jī):%d,%d,%d\n",stu[i].NO,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);}fclose(fp);}11.4文件的讀寫(xiě)11.4.4 字符串文件處理函數(shù)(1)文件字符串輸出函數(shù)fputs一般格式:intfputs(char*str,FILE*fp)功能:向指定文件輸出一個(gè)字符串,同時(shí)將文件讀寫(xiě)位置指針移動(dòng)(字符串長(zhǎng)度)個(gè)字節(jié)。如果輸出成功,則函數(shù)返回值為0;否則返回非0值說(shuō)明:str代表字符型的指針,可以是字符串的內(nèi)存首地址或字符串常量;fp代表存入文件的指針;字符串末尾的串結(jié)尾標(biāo)識(shí)’\0’不會(huì)輸出到文件。11.4文件的讀寫(xiě)【例11-7】使用fputs函數(shù)向指定文件中輸出數(shù)據(jù)#include
<stdio.h>main(){FILE
*fp;if((fp=fopen("data.txt","w"))==NULL){printf("can
not
open
this
file\n");exit(0);}fputs("Hello
World!\n",fp);/*將字符串輸出到文件*/fputs("Hello
World!\n",stdout);/*將字符串輸出顯示器(stdout)*/fclose(fp);}11.4文件的讀寫(xiě)(2)文件字符串輸入函數(shù)fgets一般格式:char*fgets(char*str,intn,FILE*fp)功能:從指定文件中讀入一個(gè)字符串,存入“字符數(shù)組/指針”中,并在尾端自動(dòng)加一個(gè)結(jié)束標(biāo)志"\0";并將文件讀寫(xiě)位置指針移動(dòng)(字符串長(zhǎng)度)+1個(gè)字節(jié)。如果在讀入規(guī)定長(zhǎng)度之前遇到文件尾EOF或換行符,讀入即結(jié)束說(shuō)明:str可以為字符型的指針變量或數(shù)組名;fp代表讀取文件指針;n為讀取的最大字符長(zhǎng)度,包含字符串的最后一個(gè)字符"\0",即從fp指向的文件中讀取n-1個(gè)字符。11.4文件的讀寫(xiě)【例11-8】使用fgets函數(shù)從指定文件中讀取數(shù)據(jù)#include<stdio.h>main(){FILE*fp;charstr[20];if((fp=fopen("data.txt","r"))==NULL){printf("cannotopenthisfile\n");exit(0);}fgets(str,5,fp);/*從fp指向的文件中讀取前4個(gè)字符,并存入到數(shù)組str中*/printf("%s\n",str);fgets(str,9,fp);/*從fp指向的文件中繼續(xù)讀取8個(gè)字符,并存入到數(shù)組str中*/printf("%s\n",str);fclose(fp);}11.5文件的定位文件的定位文件指針重置函數(shù)rewind一般格式:rewind(文件指針);功能:將文件內(nèi)部的位置指針重新移到文件首。該函數(shù)沒(méi)有返回值。11.4文件的讀寫(xiě)【例11-9】rewind函數(shù)的應(yīng)用
#include<stdio.h>
main(){FILE
*fp,*fp1;if((fp=fopen("data.txt","r"))==NULL){printf("can
not
open
this
file\n");exit(0);}if((fp1=fopen("data1.txt","w"))==NULL){printf("can
not
open
this
file\n");exit(0);}while(!feof(fp))putchar(fgetc(fp));rewind(fp);/*從文件的位置指針重新指向文件首*/while(!feof(fp))fputc(fgetc(fp),fp1);fclose(fp);fclose(fp1);}11.5文件的定位11.5.2fseek函數(shù)。fseek函數(shù)用來(lái)移動(dòng)文件內(nèi)部位置指針,以便進(jìn)行隨機(jī)讀寫(xiě)文件的內(nèi)容。一般格式:fseek(文件指針,位移量,起始點(diǎn));其中:① “文件指針”指向被移動(dòng)的文件。② “位移量”為long型數(shù)據(jù),代表移動(dòng)的字節(jié)數(shù),正數(shù)代表向文件尾移動(dòng),負(fù)數(shù)為向文件首移動(dòng);當(dāng)用常量表示位移量時(shí),要求加后綴“L”。③ “起始點(diǎn)”表示從何處開(kāi)始計(jì)算位移量,規(guī)定的起始點(diǎn)有三種:文件首
當(dāng)前位置文件末尾SEEK_SETSEEK_CURSEEK_END012功能:從指定的位置開(kāi)始,將文件的位置指針移動(dòng)若干位移量。例如:fseek(fp,10L,0);/*將位置指針移到離文件首10個(gè)字節(jié)處*/fseek(fp,20L,1);/*將位置指針從當(dāng)前位置向文件尾部移動(dòng)20個(gè)字節(jié)*/fseek(fp,-2L,3);/*將位置指針從文件末尾向文件首部移動(dòng)2個(gè)字節(jié)*/說(shuō)明:fseek函數(shù)一般用于二進(jìn)制文件。在文本文件中由于要進(jìn)行轉(zhuǎn)換,故往往計(jì)算的位置會(huì)出現(xiàn)錯(cuò)誤。11.4文件的讀寫(xiě)【例11-10】磁盤(pán)文件data.txt中存放了5個(gè)學(xué)生的學(xué)號(hào)、姓名和成績(jī)記錄,要求將001、003和005號(hào)學(xué)生的數(shù)據(jù)顯示輸出。#include<stdio.h>#include<string.h>structstu{charID[4];charname[6];intscore;}stu[5],stu1[5];main(){FILE*fp,*fp1;inti;strcpy(stu[0].ID,"001");strcpy(stu[0].name,"李平");stu[0].score=90;strcpy(stu[1].ID,"002");strcpy(stu[1].name,"張青");stu[1].score=65;strcpy(stu[2].ID,"003");strcpy(stu[2].name,"趙虎");stu[2].score=72;strcpy(stu[3].ID,"004");strcpy(stu[3].name,"王值");stu[3].score=46;strcpy(stu[4].ID,"005");strcpy(stu[4].name,"許宏");stu[4].score=78;if((fp=fopen("data.txt","wb"))==NULL){printf("Cannotopenfile!");exit(0); }fwrite(&stu[0],sizeof(struct
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 有機(jī)化學(xué)原料的綠色制備工藝優(yōu)化探索考核試卷
- 單板加工企業(yè)文化建設(shè)與社會(huì)責(zé)任考核試卷
- 壽險(xiǎn)產(chǎn)品種類解析考核試卷
- 氨綸纖維的環(huán)保染整技術(shù)考核試卷
- 兒童玩具的用戶體驗(yàn)評(píng)估考核試卷
- 海洋測(cè)繪與地理信息考核試卷
- 水產(chǎn)罐頭產(chǎn)品營(yíng)銷渠道的拓展與優(yōu)化考核試卷
- 供應(yīng)合同與采購(gòu)合同標(biāo)準(zhǔn)文本
- 農(nóng)用機(jī)器購(gòu)買(mǎi)合同范例
- 共同燒煤取暖合同范例
- 中國(guó)文化概況概要課件
- 體外循環(huán)意外時(shí)麻醉醫(yī)生該做些什么?
- (完整word版)男襯衫的制作工藝
- 意識(shí)障礙的判斷PPT精選文檔
- 家和萬(wàn)事興-善人道
- 信用社(銀行)清產(chǎn)核資實(shí)施方案
- 財(cái)務(wù)用發(fā)票分割單范本
- 風(fēng)電機(jī)組現(xiàn)場(chǎng)吊裝記錄
- 幼兒園大班語(yǔ)言活動(dòng)《熟能生巧》優(yōu)質(zhì)課公開(kāi)課教案比賽講課獲獎(jiǎng)教案
- 九族五服表(九族五服圖)
- 供貨項(xiàng)目實(shí)施方案
評(píng)論
0/150
提交評(píng)論