C程序設計課件第7章_第1頁
C程序設計課件第7章_第2頁
C程序設計課件第7章_第3頁
C程序設計課件第7章_第4頁
C程序設計課件第7章_第5頁
已閱讀5頁,還剩39頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

重點:文件打開、關(guān)閉、讀寫、定位等系統(tǒng)函數(shù)的運用難點:文件讀寫函數(shù)的運用掌握文件的基本概念掌握文件的打開及關(guān)閉函數(shù)的運用掌握文件字符讀寫函數(shù)的運用掌握文件字符串讀寫函數(shù)的運用掌握文件塊讀寫函數(shù)的運用掌握文件格式讀寫函數(shù)的運用掌握文件讀寫位置定位方法教學目標重點難點文件系統(tǒng)概述與文件類型文本文件(ASCII文件):二進制文件:2字節(jié)0001011000101110000101100010111000110101001101100011011100111000內(nèi)存中存儲形式ASCII碼形式(4字節(jié))二進制形式(2字節(jié))56781.文件操作系統(tǒng)以文件為單位對數(shù)據(jù)進行管理,對文件實行按名存取

例:shortinta=5678;

5678在內(nèi)存中的存儲形式,按ASCII碼及二進制存儲到文件中的形式為:

文件是存儲在外部介質(zhì)上的數(shù)據(jù)的集合2.文件分類

每一個字節(jié)存放一個字符數(shù)據(jù)按其在內(nèi)存中的存儲形式存放3.文件處理系統(tǒng)程序數(shù)據(jù)區(qū)文件緩沖區(qū)文件輸出輸入寫入讀出②非緩沖區(qū)文件系統(tǒng)緩沖區(qū)的大小和位置由程序員根據(jù)程序需要自行設定。系統(tǒng)自動在內(nèi)存為每一個正在使用的文件開辟一個緩沖區(qū)。①緩沖區(qū)文件系統(tǒng)

用戶使用文件時,先將文件調(diào)入內(nèi)存,并通過一個結(jié)構(gòu)體類型的指針與文件建立聯(lián)系,從而對文件進行操作控制,這個結(jié)構(gòu)體類型的指針稱為文件類型指針。4.文件類型指針文件類型指針定義的一般形式

FILE*變量名;文件類型指針如:FILE*fp1,*fp2;含義:定義了兩個文件類型的指針變量,可以打開兩個文件。文件的打開與關(guān)閉3.文件打開函數(shù)(fopen())1.打開文件將文件指針與文件脫離,并將文件從內(nèi)存寫入外存。將文件調(diào)入內(nèi)存,并與文件指針建立聯(lián)系。2.關(guān)閉文件函數(shù)調(diào)用格式

fp=fopen(文件名,"打開方式")返回值:成功,返回文件結(jié)構(gòu)體信息在緩沖區(qū)中的起始地址;

失敗,返回空指針(NULL)。功能:按使用方式打開指定文件,并與文件指針建立聯(lián)系。例:FILE*fp;fp=fopen("file1.dat","r");函數(shù)參數(shù)打開方式含義打開方式含義r(只讀文本)為讀打開一個文本文件r+(讀寫文本)為讀/寫打開一個文本文件w(只寫文本)為寫打開一個文本文件w+(讀寫文本)為讀/寫建立一個新的文本文件a(追加文本)向文本文件尾部追加數(shù)據(jù)a+(讀寫文本)為讀/寫打開一個文本文件rb(只讀二進制)為讀打開一個二進制文件rb+(讀寫二進制)為讀/寫打開一個二進制文件wb(只寫二進制)為寫打開一個二進制文件wb+(讀寫二進制)為讀/寫建立一個新的二進制文件ab(追加二進制)向二進制文件尾部追加數(shù)據(jù)ab+(讀寫二進制)為讀/寫打開一個二進制文件(2)文件打開方式例:打開一個已存在的非空文件file1.dat。①

fp=fopen("file1.dat","r");②charname[10]="file1.dat";fp=fopen(name,"r");③charname[10]="file1.dat",*p=name;fp=fopen(p,"r");(1)文件名打開的文件,可用字符串常量、字符數(shù)組名、字符指針變量表示。文件名中可以包含文件所在的盤符和路徑

①r表示只讀(readonly)w表示只寫

(writeonly)a表示追加(append)b表示二進制(binary)+表示可讀可寫說明②用r方式打開的文件必須存在。用w方式打開的文件無論是否存在,都重新建立,若存在,

則先刪除再新建。用a方式打開文件時,如果文件不存在,則建立;否則,文件中的位置指針移到文件末尾,準備追加數(shù)據(jù)。③如果不能實現(xiàn)打開操作,程序中應做處理,返回一個出錯信息,常用如下方式打開文件并測試返回值。

if((fp=fopen(文件名,"打開方式"

))==NULL){printf("Cannotopenthisfile!\n");exit(0);}④寫入文本文件時,系統(tǒng)自動將回車換行符轉(zhuǎn)換為一個換行符讀出文本文件時,又將換行符轉(zhuǎn)換成回車和換行兩個字符。⑤程序開始運行時,系統(tǒng)自動打開三個標準文件:標準輸入文件(鍵盤)(stdin指向)

標準輸出文件(顯示器或打印機)(stdout指向)

標準出錯處理文件(stderr指向)stdin、stdout和stderr是C系統(tǒng)定義的文件指針常量4.文件關(guān)閉函數(shù)(fclose())EOF是文本文件結(jié)束標志,其值為-1,在stdio.h中定義函數(shù)調(diào)用格式

fclose(fp)/*fp是文件指針*/返回值成功,返回0;失敗,返回EOF(-1)。功能關(guān)閉fp所指向的文件。即將文件指針與文件“脫鉤”,同時將內(nèi)存文件寫入外存。文件的讀寫操作A調(diào)用格式

fgetc(fp)/*fp是文件指針*/返回值:成功,返回讀出字符;失敗,返回EOF(-1)。1.讀寫一個字符函數(shù)功能從fp所指向文件中讀出一個字符。在stdio.h中有宏定義:#definegetc(fp)fgetc(fp)在stdio.h中有宏定義:#definegetchar()fgetc(stdin)……A位置指針說明①讀字符函數(shù)(fgetc())fgetc(fp)getc(fp)getchar()fgetc(stdin)#include"stdlib.h"#include"stdio.h"voidmain(){FILE*fp;charch,filename[10];printf("Inputfilename:");scanf("%s",filename);if((fp=fopen(filename,"r"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}while()putchar(ch);fclose(fp);}【例】從文本文件中順序?qū)⒆址x出并在屏幕顯示。調(diào)用格式:feof(fp)功能:測試二進制文件或文本文件是否結(jié)束。返回值:結(jié)束,返回1;否則,返回0。(ch=fgetc(fp))!=EOF!feof(fp)程序1?/*輸入文件名*//*打開文件*//*從文件讀字符并顯示*//*關(guān)閉文件*/②測試文件結(jié)束函數(shù)(feof(fp))putchar(fgetc(fp));

③寫字符函數(shù)(fputc())功能把ch的值寫入fp所指向的文件。返回值:成功,返回寫入字符;失敗,返回EOF(-1)。

在stdio.h中有宏定義:

#defineputc(ch,fp)fputc(ch,fp)

在stdio.h中有宏定義:

#defineputchar(ch)fputc(ch,stdout)調(diào)用格式

fputc(ch,fp)/*fp是文件指針*/AA位置指針ch說明fputc(ch,fp)putc(ch,fp)putchar(ch)fputc(ch,stdout)【例】將從鍵盤輸入的一組字符(“#”結(jié)束)寫入到磁盤文件。#include"stdio.h"#include"stdlib.h"voidmain(){FILE*fp;charch,filename[10];printf("Inputfilename:");scanf("%s",filename);if((fp=fopen(filename,"w"))==NULL){printf("Cannotcreatethisfile!\n");exit(0);}printf("Pleaseinputtext(#==End):\n");while((ch=getchar())!='#')fputc(ch,fp);fclose(fp);}程序2?/*輸入文件名*//*打開文件*//*從鍵盤讀字符并寫入文件*//*關(guān)閉文件*/2.讀寫一個字符串函數(shù)①str是地址表達式(一般為字符數(shù)組名或字符型指針變量名)③從文件中讀出字符串后,自動在字符串的尾部加'\0'②若在讀完n-1個字符之前遇到換行符或EOF,讀入操作結(jié)束位置指針n-1個字符str\0①讀字符串函數(shù)(fgets())調(diào)用格式

fgets(str,n,fp)/*fp是文件指針*/返回值:成功,返回str的值;失敗,返回空指針(NULL)。功能

從fp指向文件中讀出n-1個字符,存儲到str開始的內(nèi)存單元。說明②寫字符串函數(shù)(fputs())①str可以地址表達式,也可以是字符串常量②

寫入時,遇'\0'自動結(jié)束操作,'\0'不寫入位置指針str\0調(diào)用格式

fputs(str,fp)/*fp是文件指針*/功能將從str開始的字符串寫入到fp所指向的文件。返回值:成功,返回0;失敗,返回EOF(-1)。說明【例】先將鍵盤輸入的4行字符串寫入到磁盤文件,再將寫入文件的字符串輸出到屏幕上。#defineN4#include"stdio.h"#include"stdlib.h"voidmain(){FILE*fp;charch[81],filename[12];inti;printf("Inputfilename:");gets(filename);if((fp=fopen(filename,"w"))==NULL){printf("Cannotcreatethisfile!\n");exit(0);}printf("Input%dlinestrings:\n",N);for(i=1;i<=N;i++){gets(ch);fputs(ch,fp);fputc('\n',fp);/*寫入回車換行*/}fclose(fp);if((fp=fopen(filename,"r"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}printf("Fromfile:%s\n",filename);for(i=1;i<=N;i++){fgets(ch,81,fp);/*將字符串從文件中讀出存儲到內(nèi)存中*/printf("%s",ch);/*將內(nèi)存中的字符串輸出到屏幕上*/}fclose(fp);}程序3?/*輸入文件名*//*按寫方式打開文件*//*從鍵盤讀取字符串并寫入文件*//*關(guān)閉文件*//*按讀方式打開文件*//*從文件讀取字符串并在屏幕顯示*//*關(guān)閉文件*/3.讀寫一個數(shù)據(jù)字塊函數(shù)①讀數(shù)據(jù)字塊函數(shù)(fread())調(diào)用格式

fread(buffer,size,count,fp)/*fp是文件指針*/功能從fp所指向文件中讀出count*size字節(jié)數(shù)據(jù),存放到buffer開始的內(nèi)存單元。返回值:成功,返回count值;失敗,返回非count值。例:floatf[2];fread(f,4,2,fp);從fp所指文件中讀出2個4個字節(jié)的數(shù)據(jù),存儲到數(shù)組f(f[0]、f[1])。位置指針count*size個字節(jié)buffer用fread()和fwrite()時,文件一般應以二進制方式打開,目的是輸入輸出都不發(fā)生字符轉(zhuǎn)換,從而保證原樣讀寫。②寫數(shù)據(jù)字塊函數(shù)(fwrite())調(diào)用格式

fwrite(buffer,size,count,fp)

/*fp是文件指針*/功能將從buffer開始的count*size字節(jié)的數(shù)據(jù)寫入fp所指向的文件。返回值:成功,返回count值;失敗,返回非count值。例:shortinta[10]={1,2,3,4,5,6,7,8,9,10};fwrite(a,2,10,fp);

將數(shù)組a中的10個2個字節(jié)的數(shù)據(jù)寫到fp所指向的文件。位置指針buffercount*size個字節(jié)#include"stdio.h"#include"stdlib.h"voidmain(){inta[5]={10,20,30,40,50},b[5],i;floatf=3.14159,ff;FILE*fp;if((fp=fopen("TEXT.txt","wb"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}fwrite(&f,sizeof(float),1,fp);/*寫實數(shù)*/fwrite(a,sizeof(int),5,fp);/*寫5個整數(shù)*/fclose(fp);if((fp=fopen("TEXT","rb"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}fread(&ff,sizeof(float),1,fp);/*讀實數(shù)*/fread(b,sizeof(a),1,fp);/*讀5個整數(shù)*/printf("ff=%f\nb=\t",ff);for(i=0;i<5;i++)printf("%d\t",b[i]);fclose(fp);}程序4?【例】將一個實數(shù)和5個整數(shù)寫入文件TEXT.txt,然后讀出顯示。/*按只寫二進制方式打開文件*//*向文件寫數(shù)據(jù)*//*關(guān)閉文件*//*按只讀二進制方式打開文件*//*從文件讀數(shù)據(jù)*//*將數(shù)據(jù)輸出到屏幕*//*關(guān)閉文件*/調(diào)用格式

fscanf(fp,"格式控制字符串",地址表列)/*fp是文件指針*/4.格式化讀寫函數(shù)①格式化讀入函數(shù)(fscanf())①"格式控制字符串"的格式一定要與文件中數(shù)據(jù)存放格式相一致②fscanf(stdin,"格式控制字符串",地址表列)

scanf("格式控制字符串",地址表列)功能按格式要求從fp指向文件中讀出數(shù)據(jù)到指定的內(nèi)存單元。例:inta,b;fscanf(fp,"%d%d",&a,&b);

從fp所指向文件讀出兩個整數(shù)分別賦值給變量a和b。返回值:成功,返回1;失敗,返回-1。3434位置指針ab說明調(diào)用格式

fprintf(fp,"格式控制字符串",輸出表列);

/*fp是文件指針*/②格式化輸出函數(shù)(fprintf())fprintf(stdout,"格式控制字符串",輸出表列);printf("格式控制字符串",輸出表列);功能

將輸出表列中的數(shù)據(jù)按指定格式寫入fp所指向的文件。例:inta=3,b=4;fprintf(fp,"%d%d",a,b);

將變量a和b的值按指定格式寫入到fp所指向的文件。返回值:成功則返回輸出的字節(jié)數(shù),錯誤則返回EOF(-1)。3434位置指針ab說明文件定位與隨機讀寫調(diào)用格式

rewind(fp)功能

將fp所指向文件的位置指針重新返回到文件的開頭。#include"stdio.h"voidmain(){FILE*fp1,*fp2;fp1=fopen("file1.c","r");fp2=fopen("file2.c","w");while(!feof(fp1))putchar(fgetc(fp1));/*顯示*/

rewind(fp1);/*位置指針復位*/while(!feof(fp1))fputc(fgetc(fp1),fp2);/*復制*/fclose(fp1);fclose(fp2);}程序5?位置指針1.位置指針復位函數(shù)(rewind())【例】有一個磁盤文件,先把它的內(nèi)容顯示到屏幕上,再把它復制到另一個文件。2.位置指針隨機定位函數(shù)(fseek())起始點常量名標識數(shù)字表示文件開始SEEK_SET0文件當前位置SEEK_CUR1文件末尾SEEK_END2①起始點文件位置描述符調(diào)用格式

fseek(fp,位移量,起始點)功能在fp所指向的文件中,以起始點為基點,將位置指針向前或向后移動“位移量”個字節(jié)的距離。返回值:正確,返回0;錯誤,返回非0值。說明②

位移量(移動的字節(jié)數(shù),一般為long型)fseek(fp,100L,0);fseek(fp,-40L,1);fseek(fp,-50L,SEEK_END);位置指針100個字節(jié)位置指針40個字節(jié)位置指針50個字節(jié)【例】在磁盤文件student.dat中有10個學生記錄,將第1、3、5、

7、9號記錄取出并顯示到屏幕。

#include"stdlib.h"#include"stdio.h"structstudent{charname[10];intnum;intage;charsex;}stud[10];voidmain(){

inti;FILE*fp;

if(

(fp=fopen("student.dat","rb"))==NULL

){

printf("cannotopenfile\n");

exit(0);

}for(i=0;i<10;i+=2)

{

}fclose(fp);

}程序6?fseek(fp,

i*sizeof(structstudent),

0);fread(&stud[i],sizeof(structstudent),1,fp);printf("%s%d%d%c\n",stud[i].name,stud[i].num,stud[i].age,stud[i].sex);/*打開文件*//*從文件讀記錄并顯示*//*關(guān)閉文件*/調(diào)用格式

ftell(fp)功能:檢測當前位置指針距離文件頭的字節(jié)數(shù)。返回值:成功返回實際位移量(長整型);失敗返回-1L。例:測試一個文件所占的字節(jié)數(shù)

fseek(fp,0L,2);/*將位置指針移到文件末尾*/volume=ftell(fp);/*文件尾到文件頭的字節(jié)數(shù)*/位置指針字節(jié)數(shù)3.檢測當前位置指針位置函數(shù)(ftell())

例:i=ftell(fp);/*位置指針距離文件頭的字節(jié)數(shù)*/4.錯誤處理函數(shù)①文件操作出錯測試函數(shù)(ferror())②清除錯誤標志函數(shù)(clearerr())調(diào)用格式

ferror(fp)功能:測試文件操作的一些函數(shù)是否出錯。返回值:出錯,返回非0值;未出錯,返回0。調(diào)用格式

clearerr(fp)功能:將文件出錯標志置為0。返回值:無分類函數(shù)功能

文件打開/關(guān)閉fopen()打開文件fclose()關(guān)閉文件

文件讀寫fgetc()從指定文件讀取一個字符fputc()把字符輸出到指定文件fgets()從指定文件讀取字符串fputs()把字符串輸出到指定文件fread()從指定文件中讀取數(shù)據(jù)字塊fwrite()把數(shù)據(jù)字塊輸出到指定文件fscanf()從指定文件按格式輸入數(shù)據(jù)fprintf()按指定格式將數(shù)據(jù)輸出到指定文件文件位置指針定位rewind()使文件位置指針重新至于文件開頭fseek()改變文件位置指針的位置ftell()返回文件位置指針的當前值文件操作函數(shù)程序設計舉例#include"stdio.h"voidmain(){FILE*fp;inti,m,s=0;fp=fopen("sushu.txt","w+");for(m=2;m<=100;m++){for(i=2;i<=m/2;i++)if(m%i==0)break;if(i>m/2)fprintf(fp,"%4d",m);}rewind(fp);while(fscanf(fp,"%d",&m)!=-1)s+=m;printf("s=%d\n",s);fclose(fp);}程序7?【例1】將100以內(nèi)的所有素數(shù)寫入文件sushu.txt,然后計算文件中的所有素數(shù)之和。/*打開文件*//*找素數(shù)并寫入文件*//*位置指針定位到文件首*//*從文件讀取數(shù)據(jù)并求和*//*輸出素數(shù)和*//*關(guān)閉文件*/#include"stdio.h"#include"stdlib.h"voidmain(){FILE*in,*out;charch,infile[10],outfile[10];printf("Entertheinfilename:\n");scanf("%s",infile);printf("Entertheoutfilename:\n");scanf("%s",outfile);if((in=fopen(infile,"r"))==NULL){printf("cannotopeninfile\n");exit(0);}if((out=fopen(outfile,"w"))==NULL){printf("cannotopenoutfile\n");exit(0);}while(!feof(in))fputc(fgetc(in),out);fclose(in);fclose(out);}【例2】將一個磁盤文件中的信息復制到另一個磁盤文件。程序8?/*輸入原文件名*//*輸入新文件名*//*打開原文件*//*打開新文件*//*復制*//*關(guān)閉文件*/【例3】將一個文本文件每一行內(nèi)容逆置后存入原文件。程序9?#include"stdio.h"#include"stdlib.h"voidrevert(char*s)/*字符串逆置*/{inti,j;chart;for(j=0;s[j]!='\0';j++);j--;i=0;while(i<j){t=s[i];s[i]=s[j];s[j]=t;i++;j--;}}main(){FILE*fp;charstr[81],filename[15];intn;printf("Inputafile’sname:");gets(filename);/*輸入文件名*/if((fp=fopen(filename,"r+"))==NULL)/*打開文件*/{printf("Can'topenthisfile!\n");exit(0);}n=ftell(fp);/*記錄位置指針位置,以便于回寫*/while(fgets(str,81,fp)!=NULL)/*讀取字符串*/{}fclose(fp);/*關(guān)閉文件*/}revert(str);/*逆置*/fseek(fp,n,SEEK_SET);/*定位,相對于文件頭移動的距離*/fputs(str,fp);/*回寫*/fseek(fp,0,SEEK_CUR);/*改變讀寫方式,準備讀*/n=ftell(fp);/*記錄位置指針位置,以便于回寫*/練習題2.標準庫函數(shù)fputs(p1,p2)的功能是()。

①從p1指向的文件中讀取一個字符串存入p2開始的內(nèi)存

②從p2指向的文件中讀取一個字符串存入p1開始的內(nèi)存

③從p2開始的內(nèi)存中讀取一個字符串存入p1指向的文件

④從p1開始的內(nèi)存中讀取一個字符串存入p2指向的文件1.以"w+"方式打開一個文件,下列描述中正確的是()。

①文件打開時,原有文件內(nèi)容不被刪除,位置指針移動至文件末尾,

可進行寫和讀操作

②文件打開時,原有文件內(nèi)容被刪除,可進行寫和讀操作

③文件打開時,原有文件內(nèi)容不被刪除,位置指針移動至文件開頭,

可進行寫和讀操作

④以上說法都不正確②④一、單項選擇題3.設有以下結(jié)構(gòu)體類型數(shù)組的定義,且數(shù)組min的10個元素都已賦值,

若要將這些元素寫到fp所指向文件中,以下不正確的形式是()。

structabc{inta;charb;floatc[4];}min[10];①fwrite(min,10*sizeof(structabc),1,fp);②for(i=0;i<10;i++)fwrite(min,sizeof(structabc),1,fp);③fwrite(min,5*sizeof(structabc),2,fp);④fwrite(min,sizeof(structabc),10,fp);4.函數(shù)調(diào)用語句:fseek(fp,-10L,2);的含義是將文件位置指針()。

①從當前位置向文件頭方向移動10個字節(jié)

②從當前位置向文件尾方向移動10個字節(jié)

③移動到距離文件頭10個字節(jié)處

④移動到距離文件尾10個字節(jié)處②④1.以下程序的功能是將文件e1.txt的內(nèi)容復制到e2.txt中。#include<stdio.h>voidmain(){FILE*fp1,*fp2;charstr[81];;fp1=fopen("e1.txt","r");fp2=fopen("e2.txt","w");

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論