C語(yǔ)言及程序設(shè)計(jì)(第2版)課件第12章 文件_第1頁(yè)
C語(yǔ)言及程序設(shè)計(jì)(第2版)課件第12章 文件_第2頁(yè)
C語(yǔ)言及程序設(shè)計(jì)(第2版)課件第12章 文件_第3頁(yè)
C語(yǔ)言及程序設(shè)計(jì)(第2版)課件第12章 文件_第4頁(yè)
C語(yǔ)言及程序設(shè)計(jì)(第2版)課件第12章 文件_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1第12章文件基本概念文件的打開(kāi)與關(guān)閉文件的讀寫(xiě)操作文件的隨機(jī)讀寫(xiě)及出錯(cuò)檢測(cè)應(yīng)用舉例2

程序中使用的數(shù)據(jù):①常量②從鍵盤(pán)輸入(scanf()、getchar()、gets())解決的方法:

創(chuàng)建數(shù)據(jù)文件特點(diǎn):數(shù)據(jù)與程序沒(méi)有分離,數(shù)據(jù)不能共享。③從數(shù)據(jù)文件中讀入

12.0

文件導(dǎo)入為什么要使用文件?文件的操作順序:

打開(kāi)文件

-->讀寫(xiě)文件

-->關(guān)閉文件對(duì)文件的操作使用庫(kù)函數(shù)實(shí)現(xiàn),包含在stdio.h3一.數(shù)據(jù)文件

存放在磁盤(pán)上的一組相關(guān)數(shù)據(jù)的有序集合。

文本文件:ASCII文件,每個(gè)字節(jié)存放一個(gè)字符的ASCII碼

二進(jìn)制文件:數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣存放例如:shortx=12345;0011000000111001內(nèi)存存儲(chǔ)形式0011000000111001二進(jìn)制形式0011000100110010001100110011010000110101ASCII形式文本文件特點(diǎn):存儲(chǔ)量大、便于閱讀二進(jìn)制文件特點(diǎn):存儲(chǔ)量小、不便于閱讀12.1

基本概念4二.文件的讀寫(xiě)操作1.讀操作:從文件中輸入數(shù)據(jù)給程序里的變量或數(shù)組的操作。2.寫(xiě)操作:把程序中變量的值或數(shù)組元素的值輸出到文件里的操作。

三.輸入輸出緩沖區(qū)1.輸入緩沖區(qū):讀操作2.輸出緩沖區(qū):寫(xiě)操作文件輸入緩沖區(qū)輸出緩沖區(qū)程序數(shù)據(jù)區(qū)(變量、數(shù)組)內(nèi)存文件讀寫(xiě)操作讀操作寫(xiě)操作特點(diǎn):

減少了啟動(dòng)磁盤(pán)的次數(shù),提高了運(yùn)行程序的效率。

四.緩沖文件系統(tǒng)與非緩沖文件系統(tǒng)1.緩沖文件系統(tǒng):由系統(tǒng)自動(dòng)為每個(gè)正在使用的文件開(kāi)辟緩沖區(qū)。2.非緩沖文件系統(tǒng):由程序員為每個(gè)文件設(shè)定緩沖區(qū)12.1

基本概念5緩沖文件系統(tǒng)為每個(gè)正在使用的文件在內(nèi)存開(kāi)辟文件信息區(qū)

在stdio.h中有定義:typedefstruct{…;}

FILE

;1.FILE為文件型文件輸入緩沖區(qū)輸出緩沖區(qū)程序數(shù)據(jù)區(qū)(變量、數(shù)組)內(nèi)存文件讀寫(xiě)操作讀操作寫(xiě)操作緩沖區(qū)地址緩沖區(qū)大小位置指針文件名讀寫(xiě)方式等文件信息區(qū)2.文件型指針是一個(gè)指向文件型的指針變量。

例如:FILE

*fp;五.文件型指針12.1

基本概念6返回值:正常打開(kāi),值為文件信息區(qū)的首地址;打開(kāi)失敗,值為NULL一.打開(kāi)文件---fopen()函數(shù)的使用1.函數(shù)原型:FILE*fopen(char*name,char*mode)2.調(diào)用格式:fp=fopen("文件名","讀寫(xiě)方式");要打開(kāi)的文件名讀寫(xiě)方式例:FILE*fp;fp=fopen("test.txt","w");

r+awrw+a+以只讀方式打開(kāi)一個(gè)文本文件以只寫(xiě)方式打開(kāi)一個(gè)文本文件以先讀后寫(xiě)方式打開(kāi)一個(gè)文本文件以先寫(xiě)后讀方式打開(kāi)一個(gè)文本文件以先追加后讀方式打開(kāi)一個(gè)文本文件以追加寫(xiě)方式打開(kāi)一個(gè)文本文件讀寫(xiě)方式含義12.2

文件的打開(kāi)與關(guān)閉73.打開(kāi)失敗的可能原因例文件的打開(kāi)與測(cè)試

FILE*fp;if((fp=fopen("test.txt","w"))==NULL){printf(“Fileopenerror!\n”);

exit(1);}讀文件時(shí),該文件不存在;寫(xiě)文件時(shí),磁盤(pán)不允許。一.打開(kāi)文件---fopen()函數(shù)的使用12.2

文件的打開(kāi)與關(guān)閉8fp:打開(kāi)文件時(shí)返回的文件型指針2.功能:將fp指向的文件關(guān)閉。注意:

不關(guān)閉文件可能會(huì)丟失數(shù)據(jù)。文件輸入緩沖區(qū)輸出緩沖區(qū)程序數(shù)據(jù)區(qū)(變量、數(shù)組)內(nèi)存文件讀寫(xiě)操作讀操作寫(xiě)操作緩沖區(qū)地址緩沖區(qū)大小位置指針文件名讀寫(xiě)方式等文件信息區(qū)fpfclose關(guān)閉讀方式打開(kāi)的文件:使fp與指向的文件脫離關(guān)系。

關(guān)閉寫(xiě)方式打開(kāi)的文件:先自動(dòng)保存輸出緩沖區(qū)的數(shù)據(jù),再使fp與指向的文件脫離關(guān)系。

二.關(guān)閉文件---fclose()函數(shù)的使用1.

調(diào)用格式:fclose(fp);12.2

文件的打開(kāi)與關(guān)閉9

函數(shù)庫(kù)stdio.h提供了幾組函數(shù)實(shí)現(xiàn)對(duì)文件的讀寫(xiě)操作:1.fread()和fwrite()函數(shù)2.fscanf()和fprintf()函數(shù)3.fgetc()和fputc()函數(shù)4.fgets()和fputs()函數(shù)

12.3文件的讀寫(xiě)操作10一.fwrite與

fread函數(shù)1.函數(shù)原型:typefwrite(void*buffer,typesize,typecount,FILE*fp)typefread(void*buffer,typesize,typecount,FILE*fp)3.說(shuō)明:typedefunsignedtype;buffer:指向要讀/寫(xiě)的數(shù)據(jù)塊size:每個(gè)要讀/寫(xiě)的數(shù)據(jù)塊的大?。ㄗ止?jié)數(shù))count:要讀/寫(xiě)的數(shù)據(jù)塊的個(gè)數(shù)fp:指向要讀/寫(xiě)的文件返回值:成功,返回讀/寫(xiě)的塊數(shù);出錯(cuò)或文件尾,返回0fread與

fwrite只能用于二進(jìn)制文件的輸入/輸出

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

fwrite(&f[i],4,1,fp);

fwrite(f,12,1,fp);2.功能:一次讀/寫(xiě)一個(gè)數(shù)據(jù)塊例1floatf[3]={5.6,78.9,13.4};FILE*fp;fp=fopen("aa.dat","wb");

fwrite(f,4,3,fp);12.3文件的讀寫(xiě)操作11/*ep2.c*/structstu_type{charnum[15];charname[20];intscore[4];ints;}student;例2從鍵盤(pán)輸入一組學(xué)生的信息,包括:學(xué)號(hào)、姓名、4門(mén)課的成績(jī),計(jì)算出總分并一起寫(xiě)入到二進(jìn)制文件“wangluo.dat”中。12.3文件的讀寫(xiě)操作一.fwrite與

fread函數(shù)#include<stdio.h>main(void){inti;charc;FILE*fp;

if((fp=fopen("wangluo1.dat","ab"))==NULL){printf("cannotopenfile!");exit(1);}

do{printf("enternum:");gets(student.num);printf("entername:");gets();printf("enterscore:");student.s=0;

for(i=0;i<4;i++){scanf("%d",&student.score[i]);student.s+=student.score[i];}

getchar();/*跳過(guò)多余的回車鍵*/fwrite(&student,sizeof(student),1,fp);printf("continue?(Y/N)");c=getchar();getchar();/*跳過(guò)多余的回車鍵*/

}while(c=='y'||c=='Y');

fclose(fp);}思考:"ab"與"wb"結(jié)構(gòu)體變量與結(jié)構(gòu)體數(shù)組12/*ep3.c*/structstu_type{charnum[15];charname[20];intscore[4];ints;}student;例3將上例創(chuàng)建的數(shù)據(jù)文件“wangluo.dat”中保存的學(xué)生信息,如:學(xué)號(hào)、姓名、4門(mén)課的成績(jī)以及總分送顯示器輸出。#include<stdio.h>main(void){inti;FILE*fp;if((fp=fopen("wangluo1.dat","rb"))==NULL){printf("cannotopenfile!");exit(1);}

while(fread(&student,sizeof(student),1,fp)==1){printf("%-15s",student.num);printf("%-20s",);for(i=0;i<4;i++)printf("%-5d",student.score[i]);printf("%-5d\n",student.s);}fclose(fp);}體會(huì):“數(shù)據(jù)”與“程序”的分離12.3文件的讀寫(xiě)操作一.fwrite與

fread函數(shù)13/*ep4.c*/structstu_type{charnum[15];charname[20];intscore[4];ints;}student;例4將數(shù)據(jù)文件“wangluo.dat”中總分大于360的學(xué)生信息送顯示器輸出。體會(huì):“數(shù)據(jù)”與“程序”的分離“數(shù)據(jù)”的共享12.3文件的讀寫(xiě)操作一.fwrite與

fread函數(shù)#include<stdio.h>main(void){inti;FILE*fp;if((fp=fopen("wangluo1.dat","rb"))==NULL){printf("cannotopenfile!");exit(1);}

while(fread(&student,sizeof(student),1,fp)==1)

if(student.s>330)

{printf("%-15s",student.num);printf("%-20s",);for(i=0;i<4;i++)printf("%-5d",student.score[i]);printf("%-5d\n",student.s);}

fclose(fp);}14如何判斷數(shù)據(jù)文件是否結(jié)束?方法一:根據(jù)讀函數(shù)的返回值/*ep3.c*/structstu_type{charnum[15];charname[20];intscore[4];ints;}student;12.3文件的讀寫(xiě)操作一.fwrite與

fread函數(shù)#include<stdio.h>main(void){inti;FILE*fp;if((fp=fopen("wangluo1.dat","rb"))==NULL){printf("cannotopenfile!");exit(1);}

while(fread(&student,sizeof(student),1,fp)==1){printf("%-15s",student.num);printf("%-20s",);for(i=0;i<4;i++)printf("%-5d",student.score[i]);printf("%-5d\n",student.s);}

fclose(fp);}15feof函數(shù)的使用函數(shù)原型:intfeof(FILE*fp)功能:判斷fp指向的文件(文本文件或者二進(jìn)制文件)是否結(jié)束返回值:若文件結(jié)束,返回非0;若文件未結(jié)束,返回0/*ep3.c*/structstu_type{charnum[15];charname[20];intscore[4];ints;}student;如何判斷數(shù)據(jù)文件是否結(jié)束?方法二:根據(jù)feof()函數(shù)12.3文件的讀寫(xiě)操作一.fwrite與

fread函數(shù)#include<stdio.h>main(void){inti;FILE*fp;if((fp=fopen("wangluo1.dat","rb"))==NULL){printf("cannotopenfile!");exit(1);}

while(fread(&student,sizeof(student),1,fp))

if(!feof(fp))

{printf("%-15s",student.num);printf("%-20s",);for(i=0;i<4;i++)printf("%-5d",student.score[i]);printf("%-5d\n",student.s);}

elsebreak;

fclose(fp);}16/*ep2.c*/structstu_type{charnum[15];charname[20];intscore[4];ints;}student;調(diào)用格式:fprintf(文件指針,"格式字符串",輸出項(xiàng)表列);

fscanf(文件指針,"格式字符串",地址表列);12.3文件的讀寫(xiě)操作二.fprintf與

fscanf函數(shù)#include<stdio.h>main(void){inti;charc;FILE*fp;if((fp=fopen("wangluo2.dat","a"))==NULL){printf("cannotopenfile!");exit(1);}do{printf("enternum:");gets(student.num);printf("entername:");gets();printf("enterscore:");student.s=0;for(i=0;i<4;i++){scanf("%d",&student.score[i]);student.s+=student.score[i];}getchar();/*跳過(guò)多余的回車鍵*/fwrite(&student,sizeof(student),1,fp);printf("continue?(Y/N)");c=getchar();getchar();/*跳過(guò)多余的回車鍵*/

}while(c=='y'||c=='Y');

fclose(fp);}fprintf(fp,"%-15s%-20s",student.num,);for(i=0;i<4;i++)fprintf(fp,"%d",student.score[i]);fprintf(fp,"%d\n",student.s);17

設(shè)備文件:鍵盤(pán)、顯示器指向顯示器文件的指針:stdout指向鍵盤(pán)文件的指針:stdinfprintf(stdout,"格式字符串",輸出項(xiàng)表列);等價(jià)于printf("格式字符串",輸出項(xiàng)表列);fscanf(stdin,"格式字符串",地址表列);等價(jià)于scanf("格式字符串",地址表列);調(diào)用格式:fprintf(文件指針,"格式字符串",輸出項(xiàng)表列);

fscanf(文件指針,"格式字符串",地址表列);12.3文件的讀寫(xiě)操作二.fprintf與

fscanf函數(shù)1812.4文件的隨機(jī)讀寫(xiě)及出錯(cuò)檢測(cè)隨機(jī)讀寫(xiě):1.順序存取和隨機(jī)存取2.使位置指針指向文件開(kāi)頭——rewind函數(shù)3.使位置指針指向文件的某個(gè)位置——fseek函數(shù)4.得到文件的當(dāng)前位置——ftell函數(shù)出錯(cuò)檢測(cè)函數(shù):

1.文件讀寫(xiě)是否出錯(cuò)——ferror函數(shù)2.將文件錯(cuò)誤標(biāo)志和文件結(jié)束標(biāo)志置為0——clearerr函數(shù)1912.5應(yīng)用舉例編程實(shí)現(xiàn)人員登錄,每當(dāng)從鍵盤(pán)接受一個(gè)姓名,便在文件try.dat中進(jìn)行查找,若此姓名已在該文件中,則顯示姓名已存在,否則,將其存入文件。當(dāng)按【Enter】鍵時(shí)結(jié)束。#include<std

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論