c語言第10章-文件課件_第1頁
c語言第10章-文件課件_第2頁
c語言第10章-文件課件_第3頁
c語言第10章-文件課件_第4頁
c語言第10章-文件課件_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第十章文件

第十章文件

C文件的有關(guān)概念10.1文件是一組存儲在外存儲設(shè)備上的數(shù)據(jù)的集合。1什么是文件操作系統(tǒng)是以文件為單位對數(shù)據(jù)進行管理的。輸入輸出是數(shù)據(jù)傳送的過程,數(shù)據(jù)如流水一樣從一處流向另一處,因此常將輸入輸出形象地稱為流(stream),即輸入輸出流。C語言把文件看作是一個字符(字節(jié))的序列,即文件是由一個一個字符(字節(jié))的數(shù)據(jù)順序組成。一個輸入輸出流就是一個字節(jié)流或二進制流。C文件的有關(guān)概念10.1文件是一組存儲在外存儲設(shè)備上的數(shù)據(jù)的保存和交換數(shù)據(jù)。保存大容量數(shù)據(jù)。3

文件的分類:①數(shù)據(jù)表示方式:二進制文件。文本文件(ASCII)文件。②讀寫方式:順序讀寫文件(流式)。隨機讀寫文件。③處理方法:緩沖文件。非緩沖文件。Device內(nèi)存Buffer匹配主機速度,數(shù)據(jù)轉(zhuǎn)換。2文件的優(yōu)點:保存和交換數(shù)據(jù)。3文件的分類:①數(shù)據(jù)表示方式:二進制文件

⒈文件的操作過程打開文件

建立一個文件和流的對應(yīng)關(guān)系。在內(nèi)存中建立一個保存文件信息的結(jié)構(gòu)變量。讀寫文件關(guān)閉文件釋放文件所占的資源。10.2文件的操作過程與文件指針⒈文件的操作過程打開文件建立一個文件和流的對⒉文件指針(FilePointer)

在緩沖文件系統(tǒng)中,每個被使用的文件的信息(如文件名、位置、類型等)都保存在一個特殊定義的結(jié)構(gòu)體類型的指針變量中。該結(jié)構(gòu)體類型由用戶定義,名為:FILE

可以定義一個指向FILE類型的結(jié)構(gòu)體指針,打開文件是讓該指針指向文件對應(yīng)的結(jié)構(gòu)變量,通過該指針對文件進行操作。FILE*fp;fp是FILE型指針變量fp標識一個特定的磁盤文件⒉文件指針(FilePointer)在緩沖文件系統(tǒng)typedef

struct{ shortlevel;/*緩沖區(qū)‘滿’或‘空’的程度*/

unsignedflags;/*文件狀態(tài)標志*/

charfd;/*文件描述符*/

unsignedcharhold;/*如無緩沖區(qū)不讀字符*/

shortbsize;/*緩沖區(qū)的大小*/

unsignedchar*buffer;/*數(shù)據(jù)緩沖區(qū)的位置*/

unsignedchar*curp;/*指針當前的指向*/

unsignedistemp;/*臨時文件指示器*/

shorttoken;/*用于有效性檢查*/}FILE;在stdio.h文件中定義typedefstruct3文件讀寫的方式

文件按讀寫方式可以分為:順序讀寫隨機讀寫

順序讀寫:順序向后讀寫。隨機讀寫:給定位置讀寫。3文件讀寫的方式文件按讀寫方式可以分為:10.3文件的打開與關(guān)閉⒈文件的打開函數(shù)fopen()

fopen函數(shù)的原型在stdio.h文件中說明,該函數(shù)的作用是打開緩沖文件。使用方法:FILE*fp;fp

=fopen(

filename,

mode);打開文件的文件名或設(shè)備名。文件的讀寫方式。文件信息結(jié)構(gòu)的指針。fp=fopen(“a:\wang.dat”,”w+”);說明:⑴如果fopen失敗,則函數(shù)返回空指針NULL;

⑵當文件打開錯誤時,程序不應(yīng)繼續(xù)執(zhí)行,一般以如下方式打開文件:if((fp=fopen(filename,mode))==NULL){printf(“FileOpenError!\n”);exit(1);}10.3文件的打開與關(guān)閉⒈文件的打開函數(shù)fopen(文件的讀寫方式說明:控制符文件類型讀寫方式“r”文本打開文件只讀“w”建立新文件只寫“a”打開文件在尾部追加“rb”二進制打開文件只讀“wb”建立新文件只寫“ab”打開文件在尾部追加“r+”文本打開文件可讀寫“w+”建立新文件可讀寫“a+”打開文件可讀寫“rb+”二進制打開文件可讀寫“wb+”建立新文件可讀寫“ab+”打開文件可讀寫文件的讀寫方式說明:控制符文件類型讀寫方式“r”打開文件只讀⒉文件的關(guān)閉函數(shù)fclose()文件使用完必須關(guān)閉,關(guān)閉文件的目的是:保證文件的數(shù)據(jù)不丟失,將buffer的數(shù)據(jù)回寫文件。釋放buffer。關(guān)閉文件函數(shù)的使用:fclose(文件指針);FILE*fp;fp=fopen(“a:\d.dat”,”w+”);/*文件的讀寫*/…fclose(fp);說明:如果關(guān)閉正確fclose返回0;關(guān)閉失敗fclose返回非0。⒉文件的關(guān)閉函數(shù)fclose()文件使用完必須關(guān)閉,關(guān)閉文件10.4文件的順序讀寫文件的讀寫是由定義在stdio.h中的一組函數(shù)的集合所實現(xiàn)的。⒈字符輸入和輸出函數(shù)fputc函數(shù)和fgetc函數(shù)⑴fputc函數(shù)使用方法:

fputc(ch,fp);含義:將字符ch寫入文件指針對應(yīng)的文件的當前位置。

返回值:寫入正確返回ch的值;失敗返回EOF(在stdio.h中定義為-1)。⑵fgetc函數(shù)使用方法:

ch=fgetc(fp);/*ch為字符型變量。*/

含義:從文件指針fp對應(yīng)的可讀文件的當前位置讀一個字符返回賦值給ch。⑶feof函數(shù)使用方法:i=feof(fp);含義:判斷文件是否結(jié)束。返回值:1代表文件結(jié)束;

0代表文件未結(jié)束。10.4文件的順序讀寫文件的讀寫是由定義在stdio.h中【例10-1】從鍵盤輸入10個字符,寫入文件f2.txt中。#include<stdio.h>#include<stdlib.h>voidmain(void){inti; charch;FILE*fp;

/*定義文件指針*/if((fp=fopen(“c:\\f2.txt”,“w”))==NULL)

/*以寫方式打開文件*/{

printf("Fileopenerror!\n");

exit(1);

/*無法打開則結(jié)束*/}for(i=1;i<=10;i++)

/*循環(huán)10次*/{

ch=getchar();

/*從鍵盤輸入字符*/

fputc(ch,fp);

/*將字符寫入文件*/}if(fclose(fp))

/*關(guān)閉文件*/{

printf("Filecloseerror!\n");

exit(1);

/*無法關(guān)閉則結(jié)束*/}}【例10-1】從鍵盤輸入10個字符,寫入文件f2.txt中。#include<stdio.h>#include<stdlib.h>voidmain(void){inti; charch;FILE*fp;/*定義文件指針*/if((fp=fopen("f1.txt","w"))==NULL)/*以寫方式打開文件*/{ printf("Fileopenerror!\n"); exit(1);

/*無法打開則結(jié)束*/}for(i=1;i<=10;i++)/*循環(huán)10次*/{ ch=getchar();

/*從鍵盤輸入字符*/ fputc(ch,fp);

/*將字符寫入文件*/}if(fclose(fp))/*關(guān)閉文件*/

{ printf("Filecloseerror!\n"); exit(1);

/*無法關(guān)閉則結(jié)束*/}【例10-2】從鍵盤輸入10個字符,寫入文件f1.txt中,再從此文件中讀出字符顯示在屏幕上。#include<stdio.h>【例10-2】從鍵盤輸入1If

((fp=fopen(“f1.txt”,“r”))==NULL)

/*再次打開文件以讀方式*/{ printf("Fileopenerror!\n"); exit(1);}for(i=1;i<=10;i++){ ch=fgetc(fp);

/*從文件讀入字符*/ putchar(ch);

/*將字符輸出到屏幕*/}if(fclose(fp))/*關(guān)閉文件*/{ printf("Filecloseerror!\n"); exit(1);}}If((fp=fopen(“f1.txt”,“r”))=#include<stdio.h>#include<stdlib.h>voidmain(void){charch;FILE*fin,*fout;

/*定義文件指針*/if((fin=fopen(“c:\\f1.txt”,“r”))==NULL)

/*以讀方式打開文件*/{printf("Fileopenerror!\n"); exit(1);}if((fout=fopen("c:\\f4.txt","w"))==NULL)/*以寫方式打開文件*/{printf("Fileopenerror!\n"); exit(1);

/*無法打開則結(jié)束*/}【例10-3】將磁盤文件f1.txt中的內(nèi)容復(fù)制到另一個文件f4.txt中。#include<stdio.h>【例10-3】將磁盤文件f

while((ch=fgetc(fin))!=EOF){

fputc(ch,fout);

/*從文件fin讀出字符寫入文件fout*/}if(fclose(fin))

/*關(guān)閉文件*/{ printf("Filecloseerror!\n"); exit(1);

/*無法關(guān)閉則結(jié)束*/}if(fclose(fout))

/*關(guān)閉文件*/{ printf("Filecloseerror!\n"); exit(1);

/*無法關(guān)閉則結(jié)束*/}}while((ch=fgetc(fin))!=EOF)⒉文件中字符串的輸入和輸出函數(shù)⑴字符串輸入函數(shù)使用方法:

fgets(str,n,fp);

含義:從fp所對應(yīng)的文件的當前位置讀n-1個字符到str所指向的內(nèi)存單元。并在結(jié)束處加‘\0’表示字符串結(jié)束。三種情況可以使輸入結(jié)束:讀完n-1個字符;讀出時遇到‘\n’;讀出時遇到文件結(jié)束標志。⑵字符串輸出函數(shù)使用方法:

fputs(str,fp);

含義:將str指向的字符串,輸出到fp所對應(yīng)的文件中,并忽略輸出字符串結(jié)束標志‘\0’。⒉文件中字符串的輸入和輸出函數(shù)⑴字符串輸入函數(shù)使用方法:#include<stdio.h>#include<stdlib.h>#defineSIZE256voidmain(intargc,char*argc[]){charbuff[SIZE];FILE*fpr,*fpw;

fpw=stdprn;

if((fpr=fopen(argc[1],“r”))==NULL){printf(“Fileopenerror!\n”);exit(0);}while(fgets(buff,SIZE,fpr)!=NULL)

fputs(buff,fpw);fclose(fpr);}打開文件輸入。輸出到打印機。文件指針執(zhí)行設(shè)備:stdprn打印機;stdaux串口;stdin、stdout。舉例:從文件中讀出字符串,并輸出其內(nèi)容到屏幕。#include<stdio.h>打開文件輸入。輸出到打印#include<stdio.h>#include<stdlib.h>voidmain(void){charch[80];FILE*fin,*fout;/*定義文件指針*/if((fin=fopen(“e:\\f5.txt","r"))==NULL)/*以讀方式打開文件*/{ printf("Fileopenerror!\n"); exit(1);}if((fout=fopen("f6.txt","w"))==NULL)/*以寫方式打開文件*/{ printf("Fileopenerror!\n"); exit(1);/*無法打開則結(jié)束*/}【例10-4】利用字符串輸入輸出函數(shù)將一個磁盤文件中的內(nèi)容f5.txt復(fù)制到另一個文件f6.txt中。#include<stdio.h>【例10-4】利用字符串輸while(!feof(fin)){ fgets(ch,80,fin);

/*從文件fin讀出字符*/ fputs(ch,fout);

/*寫入文件fout*/}if(fclose(fin))/*關(guān)閉文件*/{ printf("Filecloseerror!\n"); exit(1);/*無法關(guān)閉則結(jié)束*/}if(fclose(fout))/*關(guān)閉文件*/{ printf("Filecloseerror!\n"); exit(1);

/*無法關(guān)閉則結(jié)束*/}}while(!feof(fin))⒊文件的格式化輸入和輸出函數(shù)fp文件指針format,格式說明字符串,取%d、%x、%f、%c等;說明輸入轉(zhuǎn)化的格式。&arg1…&argn,接收讀出數(shù)據(jù)的變量的地址列表。⑴格式化輸入函數(shù)fscanf使用方法:

fscanf(fp,format,&arg1,&arg2,…&argn);

含義:從fp對應(yīng)的文件的當前位置,順序讀出一個字符序列,按format說明的格式和類型進行轉(zhuǎn)換并存放到對應(yīng)變量單元。⒊文件的格式化輸入和輸出函數(shù)fp文件指針⑴格式化輸入函數(shù)#include<stdio.h>#include<stdlib.h>voidmain(void){chars[80];inta;FILE*fp;

if((fp=fopen(“e:\\text.txt”,“r”))==NULL){printf(“cannotopenfile“);exit(0);}

fscanf(fp,“%s%d“,s,&a);

printf(“%s,%d”,s,a);}打開文件讀出數(shù)據(jù)。例10-5:從text.txt中讀字符串和一個十進制數(shù),輸出到顯示器。#include<stdio.h>打開文件讀出數(shù)據(jù)。例10fp文件指針;format,格式說明字符串,取%d、%x、%f、%c等;說明輸出轉(zhuǎn)化的格式。arg1…argn,輸出量列表。使用方法:

fprintf(fp,format,arg1,……argn);

含義:

以指定的格式(format),將arg1…argn的值,寫入fp文件的當前位置。FILE*fp;fp=fopen(“s.dat”,”w”);…fprint(fp,”%d%c”,123,’c’);fclose(fp);⑵格式化輸出函數(shù)fprintffp文件指針;使用方法:含義:以指定的格式⒋文件的數(shù)據(jù)塊輸入輸出函數(shù)buf(空類型指針)接收數(shù)據(jù)的地址;size(整型)一次讀取數(shù)據(jù)的字節(jié)數(shù);count(整型)讀取次數(shù);fp對應(yīng)輸入文件的文件指針。⑴fread()函數(shù)使用方法:

fread(buf,size,count,fp);

含義:從fp指向的文件的當前位置,每次讀取size個字節(jié),共讀count次數(shù)據(jù),存放到buf指向的內(nèi)存處。返回值:調(diào)用正確,返回輸入的項數(shù);調(diào)用錯誤,返回-1(EOF)。FILE*fp;charstr[80];fp=fopen(“s.dat”,”r”);fread(str,20,3,fp);⒋文件的數(shù)據(jù)塊輸入輸出函數(shù)buf(空類型指針)接收數(shù)據(jù)的地址#include<stdio.h>#include<stdlib.h>voidmain(void){inti;floatscore,aver=0;FILE*fin,*fout;

/*定義文件指針*/if((fin=fopen(“e:\\f7.txt”,“r”))==NULL)

/*以讀方式打開文件*/{ printf("Fileopenerror!\n");exit(1);}if((fout=fopen("f8.txt","w"))==NULL)/*以寫方式打開文件*/{ printf("Fileopenerror!\n");exit(1);}for(i=0;i<10;i++)

/*讀源文件中的數(shù)據(jù)*/【例10-6】讀入磁盤文件f7.txt中存放的10個學(xué)生的數(shù)學(xué)成績,然后求出它們的平均成績,并將平均成績寫入文件f8.txt。#include<stdio.h>【例10-6】讀入磁盤文件{ fscanf(fin,"%f",&score); aver=aver+score;

/*求累加*/}aver=aver/10;

/*求平均*/fprintf(fout,“%f”,aver);

/*寫文件*/if(fclose(fin))

/*關(guān)閉文件*/{ printf("Filecloseerror!\n");exit(1);}if(fclose(fout))/*關(guān)閉文件*/{ printf("Filecloseerror!\n");exit(1);}}{⑵fwrite函數(shù)buf(空類型指針)數(shù)據(jù)的地址;size(整型)一次輸出數(shù)據(jù)的字節(jié)數(shù);count(整型)輸出次數(shù);fp對應(yīng)輸出文件的文件指針。使用方法:

fwrite(buf,size,count,fp);

含義:從buf開始,分count次,每次size個字節(jié),向fp對應(yīng)文件的當前位置寫數(shù)據(jù)。返回值:調(diào)用正確時,返回count。調(diào)用錯誤時,返回-1(EOF)。⑵fwrite函數(shù)buf(空類型指針)數(shù)據(jù)的地址;使用方法舉例:#include<string.h>#include<stdio.h>voidmain(void){FILE*stream;charmsg[]=“Thisisatest“,buf[20];

stream=fopen("TEST1.DAT","w+");

fwrite(msg,strlen(msg)+1,1,stream);

fseek(stream,SEEK_SET,0);

fread(buf,strlen(msg)+1,1,stream);printf("%s\n",buf);fclose(stream);}打開文件。寫數(shù)據(jù)到文件。重新定位到文件頭。舉例:#include<string.h>打開文件。寫數(shù)據(jù)#include<stdio.h>#include<stdlib.h>structstud{ charname[20]; floatscore;}studmes[3];

/*定義結(jié)構(gòu)*/voidmain(void){inti;charstrTemp[20];FILE*fout;

/*定義文件指針*/if((fout=fopen("f9.dat","wb"))==NULL)/*以寫方式打開文件*/{ printf("Fileopenerror!\n");exit(1);}

【例10-7】首先生成磁盤文件f9.dat,在其中存放3個學(xué)生的姓名和數(shù)學(xué)成績,并讀出磁盤文件中的內(nèi)容,顯示在屏幕上。#include<stdio.h>【例10-7】首先生成磁盤for(i=0;i<3;i++){ gets(studmes[i].name);

/*輸入姓名*/ gets(strTemp);

/*輸入成績*/ studmes[i].score=(float)atof(strTemp);/*轉(zhuǎn)換為數(shù)值*/ fwrite(&studmes[i],sizeof(structstud),1,fout);/*寫文件*/}if(fclose(fout))

/*關(guān)閉文件*/{ printf("Filecloseerror!\n");exit(1);}

for(i=0;i<3;i++)if((fout=fopen(“f9.dat”,“rb”))==NULL)

/*以讀方式打開文件*/{ printf("Fileopenerror!\n");exit(1);}for(i=0;i<3;i++){ fread(&studmes[i],sizeof(structstud),1,fout);

/*讀文件*/ printf("%s%f\n",studmes[i].name,studmes[i].score);}if(fclose(fout))

/*關(guān)閉文件*/{ printf("Filecloseerror!\n");exit(1);}}c語言第10章-文件課件5.整數(shù)輸入輸出函數(shù)——getw函數(shù)和putw函數(shù)

(1)整數(shù)輸入函數(shù)getw()使用方法:

inta;a=getw(fp);

功能:從文件指針fp指向的文件中讀取一個整數(shù),該函數(shù)只適合于二進制文件。

(2)整數(shù)輸出函數(shù)putw()使用方法:

putw(a,fp);

功能:將整數(shù)a寫入文件指針fp指向的文件中,該函數(shù)只適合于二進制文件。5.整數(shù)輸入輸出函數(shù)——getw函數(shù)和putw函數(shù)(1)整#include<stdio.h>#include<stdlib.h>voidmain(void){inti,a;FILE*fout;

/*定義文件指針*/if((fout=fopen("f10.dat","wb+"))==NULL)/*以寫方式打開文件*/{ printf("Fileopenerror!\n");exit(1);}for(i=0;i<10;i++){ scanf(“%d”,&a);

/*輸入整數(shù)*/ putw(a,fout);

/*寫入文件*/}if(fclose(fout))/*關(guān)閉文件*/【例10-8】將10個整數(shù)寫入文件f10.dat中,并讀出其內(nèi)容顯示在屏幕上。#include<stdio.h>【例10-8】將10個整數(shù){ printf("Filecloseerror!\n");exit(1);}if((fout=fopen("f10.dat","rb"))==NULL)/*以讀方式打開文件*/{ printf("Fileopenerror!\n");exit(1);}for(i=0;i<10;i++){ a=getw(fout);/*讀出文件*/ printf("%d,",a);/*顯示在屏幕上*/}if(fclose(fout))/*關(guān)閉文件*/{ printf("Filecloseerror!\n");exit(1);}}{10.4文件的隨機讀寫與定位

以上的所有文件的讀寫都是順序的,完成一次讀寫操作后,文件的記錄位置自動指向下一位置,因而稱為順序的流式文件。用戶想使用任意位置的讀寫,可以通過定位函數(shù)實現(xiàn)。⒈獲取文件當前位置

ftell函數(shù)longn;…n=ftell(fp);含義:獲取文件當前的讀寫位置(從文件頭到當前的字節(jié)數(shù))。返回值(long):調(diào)用正確,返回當前位置相對于文件開頭的字節(jié)數(shù);調(diào)用錯誤,返回-1L。10.4文件的隨機讀寫與定位以上的所有文件的讀寫都⑵改變文件指針的當前位置fseek函數(shù)fp文件指針;offset(longint),以from為起點移動的偏移量(字節(jié)數(shù));from為移動的起始位置。使用方法:

fseek(

fp

,offset

,from);from在stdio.h中定義了如下常量:值常量符號位置0SEEK_SET文件頭1SEEK_CUR

當前位置2SEEK_END

文件尾fseek(

fp

,50L,SEEK_SET)移到距fp對應(yīng)文件開始50字節(jié)處。⑶置文件指針于開頭位置rewind()函數(shù)使用方法:

rewind(fp);⑵改變文件指針的當前位置fseek函數(shù)fp文件指針#include<stdio.h>#include<stdlib.h>voidmain(void){inti;intscore;FILE*fin;/*定義文件指針*/if((fin=fopen(“f11.dat","r"))==NULL)/*以讀方式打開文件*/{ printf("Fileopenerror!\n");exit(1);}for(i=0;i<10;i++){ fscanf(fin,“%d”,&score);/*讀源文件中的數(shù)據(jù)*/

printf(“%d,”,score);

/*顯示在屏幕上*/}【例10-9】已知數(shù)據(jù)文件f11.txt中含有10個整型數(shù)據(jù),依次讀出數(shù)據(jù)顯示在屏幕上,再將下標為奇數(shù)的數(shù)據(jù)讀出顯示在屏幕上。#include<stdio.h>【例10-9】已知數(shù)據(jù)文件 rewind(fin);

/*將文件指針定位在首部*/printf("\n");for(i=0;i<5;i++)

/*讀源文件中的數(shù)據(jù)*/{ fseek(fin,sizeof(int),1);

/*將文件指針向后移動*/ fscanf(fin,"%d",&score); printf(“%d,”,score);

/*顯示在屏幕上*/}if(fclose(fin))

/*關(guān)閉文件*/{ printf("Filecloseerror!\n");exit(1);}} rewind(fin);#include<stdio.h>#include<stdlib.h>#defineN30structstudent{charname[10];intno;intscore;}stud[N];voidmain(void){inti;FILE*fp;fp=fopen(“std.lst”,“rb”);

for(i=0;i<N;i++){fseek(fp,i*sizeof(structstudent),0);fread(&stud[i],sizeof(structstudent),1,fp);if(stud[i].no%2)printf(“name:%cno:%dscore:%d\n”,stud[i].name,stud[i].no,stud[i].score);}fclose(fp);}舉例:已知30個學(xué)生的一門課的分數(shù),打印

學(xué)號為單號學(xué)生的分數(shù)。#include<stdio.h>舉例:已知30個學(xué)生的一10.5文件的錯誤檢測

⒈文件讀寫錯誤檢測函數(shù)ferror。使用方法:

ferror(fp);含義:檢測文件讀寫錯誤。如果返回值為0,表示無錯誤。如果返回值非0,表示有錯誤。該標志一旦置位,必須通過清除函數(shù)清除!

⒉清除文件錯誤標志函數(shù)clearerr使用方法:

clearerr(fp);含義:清除文件讀寫錯誤標志。10.5文件的錯誤檢測⒈文件讀寫錯誤檢測舉例:#include<stdio.h>voidmain(void){FILE*stream;stream=fopen("DUMMY.FIL","w");(void)getc(stream);

if(ferror(stream))

{printf("ErrorreadingfromDUMMY.FIL\n");

clearerr(stream);

}fclose(stream);}舉例:#include<stdio.h>/*example9-9文件的錯誤檢測函數(shù)*/#include<stdio.h>#include<stdlib.h>voidmain(void){FILE*fp;

/*定義文件指針*/if((fp=fopen("f2.txt","r"))==NULL)/*以讀方式打開文件*/{ printf("Fileopenerror!\n");exit(1);}fgetc(fp);/*讀文件*/printf(“%d”,ferror(fp));/*顯示錯誤信息*/if(fclose(fp))/*關(guān)閉文件*/【例9-9】文件出錯函數(shù)應(yīng)用。/*example9-9文件的錯誤檢測函數(shù)*/【例9{ printf("Filecloseerror!\n");exit(1);}printf("\n");if((fp=fopen("f2.txt","w"))==NULL)/*以寫方式打開文件*/{ printf("Fileopenerror!\n");exit(1);}fgetc(fp);/*讀文件*/printf("%d",ferror(fp));/*顯示錯誤信息*/if(fclose(fp))/*關(guān)閉文件*/{ printf("Filecloseerror!\n");exit(1);}printf("\n");}{9.6文件程序設(shè)計應(yīng)用/*example9-10查找三角函數(shù)sin(x)的值*/#include<stdio.h>#include<math.h>#include<stdlib.h>#definePI3.1415926voidmain(void){inti;doublefvalue;FILE*fp;

/*定義文件指針*/if((fp=fopen("sin.dat","wb+"))==NULL)/*打開文件*/{ printf("Fileopenerror!\n");exit(1);}for(i=0;i<360;i++)【例9-9】文件出錯函數(shù)應(yīng)用。9.6文件程序設(shè)計應(yīng)用/*example9-10查找{ fvalue=sin(PI*i/180.);

/*計算三角函數(shù)的值*/ fwrite(&fvalue,sizeof(double),1,fp);

/*寫入文件*/}printf("pleaseenterdegree:");scanf(“%d”,&i);

/*輸入度數(shù)*/i%=360;fseek(fp,i*sizeof(double),SEEK_SET);/*將文件指針定位在特定位置*/fread(&fvalue,sizeof(double),1,fp);

/*讀文件中的數(shù)據(jù)*/printf(“%f\n”,fvalue);

/*顯示在屏幕上*/if(fclose(fp)){ printf("Filecloseerror!\n");exit(1);/*關(guān)閉文件*/}}{/*example9-11字符串的處理*/#include<stdio.h>#include<stdlib.h>voidmain(void){charstr[80];inti,m,n;FILE*fp1,*fp2;

/*定義文件指針*/if((fp1=fopen("str.txt","r"))==NULL)/*以讀方式打開文件*/{ printf("Fileopenerror!\n");exit(1);}【例10-11】已知文件str.txt中存放了一串字符,如:abcdefghijklmn,文件val.txt中存放了2個整數(shù)m和n,如:3和4,讀出這2個文件中的數(shù)據(jù),從字符串中的第m個字符開始,取出n個字符,如:cdef,追加在文件str.txt中,得到:abcdefghijklmncdef。/*example9-11字符串的處理*/【例10-

if((fp2=fopen(“val.txt”,“r”))==NULL)

/*以讀方式打開文件*/{ printf("Fileopenerror!\n");exit(1);}fscanf(fp1,“%s”,str);

/*讀字符串*/fscanf(fp2,“%d%d”,&m,&n);

/*讀位置整數(shù)*/if(fclose(fp1))

/*關(guān)閉文件*/{ printf("Filecloseerror!\n");exit(1);}if(fclose(fp2))

/*關(guān)閉文件*/{ printf("Filecloseerror!\n");exit(1);}if((fp2=fopen(“val.txt”,“

if((fp1=fopen("str.txt","a"))==NULL)/*以追加方式打開文件*/{ printf("Fileopenerror!\n");exit(1);}for(i=m;i<m+n;i++){ fputc(str[i-1],fp1);

/*追加數(shù)據(jù)*/}if(fclose(fp1))

/*關(guān)閉文件*/{ printf("Filecloseerror!\n");exit(1);}}if((fp1=fopen("str.txt","ASCII文件又稱為文本文件。在這種文件中,每個字節(jié)存放一個字符的ASCII碼值。存儲形式二進制文件中的數(shù)據(jù)與該數(shù)據(jù)在內(nèi)存中的二進制形式是一致的,其中一個字節(jié)并不代表一個字符。根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件可分為ASCII文件和二進制文件。例:整數(shù)10000在內(nèi)存中的存儲形式以及分別按ASCII碼形式和二進制形式輸出如下圖所示:ASCII文件又稱為文本文件。在這種文件中,每個字節(jié)存放一個第十章文件

第十章文件

C文件的有關(guān)概念10.1文件是一組存儲在外存儲設(shè)備上的數(shù)據(jù)的集合。1什么是文件操作系統(tǒng)是以文件為單位對數(shù)據(jù)進行管理的。輸入輸出是數(shù)據(jù)傳送的過程,數(shù)據(jù)如流水一樣從一處流向另一處,因此常將輸入輸出形象地稱為流(stream),即輸入輸出流。C語言把文件看作是一個字符(字節(jié))的序列,即文件是由一個一個字符(字節(jié))的數(shù)據(jù)順序組成。一個輸入輸出流就是一個字節(jié)流或二進制流。C文件的有關(guān)概念10.1文件是一組存儲在外存儲設(shè)備上的數(shù)據(jù)的保存和交換數(shù)據(jù)。保存大容量數(shù)據(jù)。3

文件的分類:①數(shù)據(jù)表示方式:二進制文件。文本文件(ASCII)文件。②讀寫方式:順序讀寫文件(流式)。隨機讀寫文件。③處理方法:緩沖文件。非緩沖文件。Device內(nèi)存Buffer匹配主機速度,數(shù)據(jù)轉(zhuǎn)換。2文件的優(yōu)點:保存和交換數(shù)據(jù)。3文件的分類:①數(shù)據(jù)表示方式:二進制文件

⒈文件的操作過程打開文件

建立一個文件和流的對應(yīng)關(guān)系。在內(nèi)存中建立一個保存文件信息的結(jié)構(gòu)變量。讀寫文件關(guān)閉文件釋放文件所占的資源。10.2文件的操作過程與文件指針⒈文件的操作過程打開文件建立一個文件和流的對⒉文件指針(FilePointer)

在緩沖文件系統(tǒng)中,每個被使用的文件的信息(如文件名、位置、類型等)都保存在一個特殊定義的結(jié)構(gòu)體類型的指針變量中。該結(jié)構(gòu)體類型由用戶定義,名為:FILE

可以定義一個指向FILE類型的結(jié)構(gòu)體指針,打開文件是讓該指針指向文件對應(yīng)的結(jié)構(gòu)變量,通過該指針對文件進行操作。FILE*fp;fp是FILE型指針變量fp標識一個特定的磁盤文件⒉文件指針(FilePointer)在緩沖文件系統(tǒng)typedef

struct{ shortlevel;/*緩沖區(qū)‘滿’或‘空’的程度*/

unsignedflags;/*文件狀態(tài)標志*/

charfd;/*文件描述符*/

unsignedcharhold;/*如無緩沖區(qū)不讀字符*/

shortbsize;/*緩沖區(qū)的大小*/

unsignedchar*buffer;/*數(shù)據(jù)緩沖區(qū)的位置*/

unsignedchar*curp;/*指針當前的指向*/

unsignedistemp;/*臨時文件指示器*/

shorttoken;/*用于有效性檢查*/}FILE;在stdio.h文件中定義typedefstruct3文件讀寫的方式

文件按讀寫方式可以分為:順序讀寫隨機讀寫

順序讀寫:順序向后讀寫。隨機讀寫:給定位置讀寫。3文件讀寫的方式文件按讀寫方式可以分為:10.3文件的打開與關(guān)閉⒈文件的打開函數(shù)fopen()

fopen函數(shù)的原型在stdio.h文件中說明,該函數(shù)的作用是打開緩沖文件。使用方法:FILE*fp;fp

=fopen(

filename,

mode);打開文件的文件名或設(shè)備名。文件的讀寫方式。文件信息結(jié)構(gòu)的指針。fp=fopen(“a:\wang.dat”,”w+”);說明:⑴如果fopen失敗,則函數(shù)返回空指針NULL;

⑵當文件打開錯誤時,程序不應(yīng)繼續(xù)執(zhí)行,一般以如下方式打開文件:if((fp=fopen(filename,mode))==NULL){printf(“FileOpenError!\n”);exit(1);}10.3文件的打開與關(guān)閉⒈文件的打開函數(shù)fopen(文件的讀寫方式說明:控制符文件類型讀寫方式“r”文本打開文件只讀“w”建立新文件只寫“a”打開文件在尾部追加“rb”二進制打開文件只讀“wb”建立新文件只寫“ab”打開文件在尾部追加“r+”文本打開文件可讀寫“w+”建立新文件可讀寫“a+”打開文件可讀寫“rb+”二進制打開文件可讀寫“wb+”建立新文件可讀寫“ab+”打開文件可讀寫文件的讀寫方式說明:控制符文件類型讀寫方式“r”打開文件只讀⒉文件的關(guān)閉函數(shù)fclose()文件使用完必須關(guān)閉,關(guān)閉文件的目的是:保證文件的數(shù)據(jù)不丟失,將buffer的數(shù)據(jù)回寫文件。釋放buffer。關(guān)閉文件函數(shù)的使用:fclose(文件指針);FILE*fp;fp=fopen(“a:\d.dat”,”w+”);/*文件的讀寫*/…fclose(fp);說明:如果關(guān)閉正確fclose返回0;關(guān)閉失敗fclose返回非0。⒉文件的關(guān)閉函數(shù)fclose()文件使用完必須關(guān)閉,關(guān)閉文件10.4文件的順序讀寫文件的讀寫是由定義在stdio.h中的一組函數(shù)的集合所實現(xiàn)的。⒈字符輸入和輸出函數(shù)fputc函數(shù)和fgetc函數(shù)⑴fputc函數(shù)使用方法:

fputc(ch,fp);含義:將字符ch寫入文件指針對應(yīng)的文件的當前位置。

返回值:寫入正確返回ch的值;失敗返回EOF(在stdio.h中定義為-1)。⑵fgetc函數(shù)使用方法:

ch=fgetc(fp);/*ch為字符型變量。*/

含義:從文件指針fp對應(yīng)的可讀文件的當前位置讀一個字符返回賦值給ch。⑶feof函數(shù)使用方法:i=feof(fp);含義:判斷文件是否結(jié)束。返回值:1代表文件結(jié)束;

0代表文件未結(jié)束。10.4文件的順序讀寫文件的讀寫是由定義在stdio.h中【例10-1】從鍵盤輸入10個字符,寫入文件f2.txt中。#include<stdio.h>#include<stdlib.h>voidmain(void){inti; charch;FILE*fp;

/*定義文件指針*/if((fp=fopen(“c:\\f2.txt”,“w”))==NULL)

/*以寫方式打開文件*/{

printf("Fileopenerror!\n");

exit(1);

/*無法打開則結(jié)束*/}for(i=1;i<=10;i++)

/*循環(huán)10次*/{

ch=getchar();

/*從鍵盤輸入字符*/

fputc(ch,fp);

/*將字符寫入文件*/}if(fclose(fp))

/*關(guān)閉文件*/{

printf("Filecloseerror!\n");

exit(1);

/*無法關(guān)閉則結(jié)束*/}}【例10-1】從鍵盤輸入10個字符,寫入文件f2.txt中。#include<stdio.h>#include<stdlib.h>voidmain(void){inti; charch;FILE*fp;/*定義文件指針*/if((fp=fopen("f1.txt","w"))==NULL)/*以寫方式打開文件*/{ printf("Fileopenerror!\n"); exit(1);

/*無法打開則結(jié)束*/}for(i=1;i<=10;i++)/*循環(huán)10次*/{ ch=getchar();

/*從鍵盤輸入字符*/ fputc(ch,fp);

/*將字符寫入文件*/}if(fclose(fp))/*關(guān)閉文件*/

{ printf("Filecloseerror!\n"); exit(1);

/*無法關(guān)閉則結(jié)束*/}【例10-2】從鍵盤輸入10個字符,寫入文件f1.txt中,再從此文件中讀出字符顯示在屏幕上。#include<stdio.h>【例10-2】從鍵盤輸入1If

((fp=fopen(“f1.txt”,“r”))==NULL)

/*再次打開文件以讀方式*/{ printf("Fileopenerror!\n"); exit(1);}for(i=1;i<=10;i++){ ch=fgetc(fp);

/*從文件讀入字符*/ putchar(ch);

/*將字符輸出到屏幕*/}if(fclose(fp))/*關(guān)閉文件*/{ printf("Filecloseerror!\n"); exit(1);}}If((fp=fopen(“f1.txt”,“r”))=#include<stdio.h>#include<stdlib.h>voidmain(void){charch;FILE*fin,*fout;

/*定義文件指針*/if((fin=fopen(“c:\\f1.txt”,“r”))==NULL)

/*以讀方式打開文件*/{printf("Fileopenerror!\n"); exit(1);}if((fout=fopen("c:\\f4.txt","w"))==NULL)/*以寫方式打開文件*/{printf("Fileopenerror!\n"); exit(1);

/*無法打開則結(jié)束*/}【例10-3】將磁盤文件f1.txt中的內(nèi)容復(fù)制到另一個文件f4.txt中。#include<stdio.h>【例10-3】將磁盤文件f

while((ch=fgetc(fin))!=EOF){

fputc(ch,fout);

/*從文件fin讀出字符寫入文件fout*/}if(fclose(fin))

/*關(guān)閉文件*/{ printf("Filecloseerror!\n"); exit(1);

/*無法關(guān)閉則結(jié)束*/}if(fclose(fout))

/*關(guān)閉文件*/{ printf("Filecloseerror!\n"); exit(1);

/*無法關(guān)閉則結(jié)束*/}}while((ch=fgetc(fin))!=EOF)⒉文件中字符串的輸入和輸出函數(shù)⑴字符串輸入函數(shù)使用方法:

fgets(str,n,fp);

含義:從fp所對應(yīng)的文件的當前位置讀n-1個字符到str所指向的內(nèi)存單元。并在結(jié)束處加‘\0’表示字符串結(jié)束。三種情況可以使輸入結(jié)束:讀完n-1個字符;讀出時遇到‘\n’;讀出時遇到文件結(jié)束標志。⑵字符串輸出函數(shù)使用方法:

fputs(str,fp);

含義:將str指向的字符串,輸出到fp所對應(yīng)的文件中,并忽略輸出字符串結(jié)束標志‘\0’。⒉文件中字符串的輸入和輸出函數(shù)⑴字符串輸入函數(shù)使用方法:#include<stdio.h>#include<stdlib.h>#defineSIZE256voidmain(intargc,char*argc[]){charbuff[SIZE];FILE*fpr,*fpw;

fpw=stdprn;

if((fpr=fopen(argc[1],“r”))==NULL){printf(“Fileopenerror!\n”);exit(0);}while(fgets(buff,SIZE,fpr)!=NULL)

fputs(buff,fpw);fclose(fpr);}打開文件輸入。輸出到打印機。文

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論