lesson20數(shù)據(jù)的組織結(jié)構(gòu)二文件課件_第1頁
lesson20數(shù)據(jù)的組織結(jié)構(gòu)二文件課件_第2頁
lesson20數(shù)據(jù)的組織結(jié)構(gòu)二文件課件_第3頁
lesson20數(shù)據(jù)的組織結(jié)構(gòu)二文件課件_第4頁
lesson20數(shù)據(jù)的組織結(jié)構(gòu)二文件課件_第5頁
已閱讀5頁,還剩85頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Lesson20數(shù)據(jù)文件及其操作1/40Lesson20數(shù)據(jù)文件及其操作1/40輸入/輸出的概念及學(xué)習(xí)目標(biāo)31學(xué)會讀寫數(shù)據(jù)文件操作系統(tǒng)的標(biāo)準(zhǔn)輸入/輸出設(shè)備:鍵盤/顯示器如果需要改變輸入/輸出的流向,需要重定向另一個輸入/輸出的對象就是磁盤數(shù)據(jù)文件使用數(shù)據(jù)文件來建立程序中的數(shù)據(jù)或保存數(shù)據(jù)到文件中,是C程序設(shè)計的習(xí)慣用法。2/40輸入/輸出的概念及學(xué)習(xí)目標(biāo)31學(xué)會讀寫數(shù)據(jù)文件操作系統(tǒng)的標(biāo)準(zhǔn)3文件的概念2文件:是指一組相關(guān)數(shù)據(jù)的有序集合。

這個數(shù)據(jù)集有一個名稱,叫做文件名。操作系統(tǒng)是以文件為單位對數(shù)據(jù)進(jìn)行管理的。

例如:C:\24000101\program.c,其中k:\24000101叫路徑,program.c是文件名。當(dāng)需要使用文件的時候,需要將文件調(diào)入內(nèi)存中。

3/403文件的概念2文件:是指一組相關(guān)數(shù)據(jù)的有序集合。這個數(shù)據(jù)集3C語言中使用的數(shù)據(jù)文件的概念2從文件編碼和數(shù)據(jù)的組織方式來看,數(shù)據(jù)文件可分為ASCII碼文件和二進(jìn)制碼文件。

也叫文本文件文件程序數(shù)據(jù)區(qū)輸出文件緩沖區(qū)輸入文件緩沖區(qū)磁盤上內(nèi)存中操作系統(tǒng)在內(nèi)存中的緩沖區(qū)4/403C語言中使用的數(shù)據(jù)文件的概念2從文件編碼和數(shù)據(jù)的組織方式來3文件的概念2ASCII數(shù)據(jù)文件:文件在磁盤中存放時每個字符占一個字節(jié),每個字節(jié)存放相應(yīng)字符的ASCII碼值。二進(jìn)制數(shù)據(jù)文件:存儲介質(zhì)上保存的數(shù)據(jù)采用與內(nèi)存數(shù)據(jù)一致的表示形式存儲(為二進(jìn)制形式)。例:在文件中存放整數(shù)2147483647ASCII碼32H31H34H37H34H38H33H36H34H37H二進(jìn)制FFHFFHFFH7FHC語言把文件看作是一個字符(字節(jié))的序列,即由一個一個字符(字節(jié))的數(shù)據(jù)順序組成。一個輸入輸出流就是一個字節(jié)流或二進(jìn)制流。

5/403文件的概念2ASCII數(shù)據(jù)文件:文件在磁盤中存放時每個字符文件的位置指針位置指針用來指示當(dāng)前的讀寫位置。

一般情況下,在對字符文件進(jìn)行順序讀寫時,文件的位置指針指向文件開頭,這時如果對文件進(jìn)行讀的操作,就讀第一個字符,然后文件的位置指針順序向后移一個位置,在下一次執(zhí)行讀的操作時,就將指針指向的第二個字符讀入。依此類推,直到遇文件尾.↑↑

↑文件頭讀寫當(dāng)前位置文件尾有時希望在一個文件的原有數(shù)據(jù)之后再添加新的數(shù)據(jù),應(yīng)該把文件位置指針移到文件尾,然后再接著寫入新的數(shù)據(jù),這就是文件的追加。6/40文件的位置指針位置指針用來指示當(dāng)前的讀寫位置?!?文件的操作3文件的基本操作

定義文件指針定義格式為:FILE*文件指針變量;例如FILE*fp;FILE

f[5];文件的打開文件指針=fopen(文件名,操作模式)fp=fopen("c:\\file.dat","r"));if((fp==NUUL){printf(“\nCannotopenthefile”);return1; }7/403文件的操作3文件的基本操作7/403文件的操作3文件使用方式含義"r"只讀,文本以只讀方式打開一個已有的文本文件。"w"只寫,文本以只寫方式建立一個新的文本文件。如果該文件已存在則將它刪去,然后重新建立一個新文件。"a"追加,文本以添加方式打開一個文本文件,在文件末尾添加。如果該文件不存在,則建立一個新文件后再添加。"rb"只讀,二進(jìn)制以只讀方式打開一個已有的二進(jìn)制文件。"wb"只寫,二進(jìn)制以只寫方式打開一個二進(jìn)制文件。"ab"追加,二進(jìn)制以添加方式打開一個二進(jìn)制文件。8/403文件的操作3文件使用方式含義"r"只讀,文3文件的操作3打開文件文件方式文件使用方式含義"r+"讀寫,文本以讀寫方式打開一個已有的文本文件。"w+"讀寫,文本以讀寫方式建立一個新的文本文件。"a+"讀寫,文本以讀寫方式打開一個文本文件,在文件末尾添加和修改,如果文件不存在,則建立一個新文件后再添加和修改。"rb+"讀寫,二進(jìn)制以讀寫方式打開一個已有的二進(jìn)制文件。"wb+"讀寫,二進(jìn)制以讀寫方式建立一個新的二進(jìn)制文件。"ab+"讀寫,二進(jìn)制以讀寫方式打開一個二進(jìn)制文件。9/403文件的操作3打開文件文件方式文件使用方式含3文件的操作3文件的關(guān)閉fclose(文件指針);例如:fclose(fp);文件的讀寫操作字符讀寫函數(shù)

:fgetc()和fputc()字符串讀寫函數(shù):fgets()和fputs()數(shù)據(jù)塊讀寫函數(shù):fread()和fwrite()格式化讀寫函數(shù):fscanf()和fprinf()

返回值:關(guān)閉成功返回值為0;否則返回EOF(-1)10/403文件的操作3文件的關(guān)閉返回值:10/403文件的操作4字符讀寫操作

1、fgetc()的調(diào)用格式:字符型變量=fgetc(文件指針);例如:ch=fgetc(fp);語句功能是:從fp指向的文件中讀取一個字符并將這個字符賦給char型變量ch。遇結(jié)束,返回EOF。2、fputc()的調(diào)用格式:

fputc(字符,文件指針);例如:fputc(ch,fp);語句功能是:將字符型變量ch的內(nèi)容寫入文件指針fp所指的文本文件中。寫入成功,返回字符本身,反之EOF。11/403文件的操作4字符讀寫操作11/40讀文件基本過程

#include"stdio.h"intmain(){ inti,x; FILE*fp; fp=fopen("array.txt","r"); if(fp==NULL){ printf("文件不存在"); exit(0); } printf("從文件中讀取的數(shù)據(jù):\n"); for(i=1;i<10;i++){ fscanf(fp,"%d",&x); if(i%5==0)printf("\n"); printf("%4d",x); }fclose(fp); return0;}1、定義FILE指針2、打開文件3、確保文件有效4、用函數(shù)讀文件5、關(guān)閉文件讀文件基本過程#include"stdio.h"1、定義寫文件基本過程

#include"stdio.h"intmain(){ inti,x; FILE*fp; fp=fopen("array2.txt",“w"); if(fp==NULL){ printf("文件不存在"); exit(0); } printf("從文件中讀取的數(shù)據(jù):\n"); for(i=1;i<10;i++){ scanf("%d",&x); fprintf(fp,"%4d",x); }fclose(fp); return0;}1、定義FILE指針2、打開文件3、確保文件有效4、用函數(shù)往文件寫數(shù)據(jù)5、關(guān)閉文件寫文件基本過程#include"stdio.h"1、定義a和w的區(qū)別

#include"stdio.h"intmain(){ inti,x; FILE*fp; fp=fopen("array.txt",“a"); if(fp==NULL){ printf("文件不存在"); exit(0); } printf("從文件中讀取的數(shù)據(jù):\n"); for(i=1;i<10;i++){ scanf("%d",&x); fprintf(fp,"%4d",x); }fclose(fp); return0;}打開文件方式a和w的區(qū)別#include"stdio.h"打開文件方二進(jìn)制文件和文本文件

#include"stdio.h"intmain(){ inti,x; FILE*fp; fp=fopen("array4.txt","wb"); if(fp==NULL){ printf("文件不存在"); exit(0); } printf("將從鍵盤輸入數(shù)據(jù)寫入文件:\n"); scanf("%d",&x); fwrite(&x,sizeof(x),1,fp); fclose(fp); return0;}二進(jìn)制文件和文本文件#include"stdio.h"#include"stdio.h"intmain(){ inti,x; FILE*fp; fp=fopen("array5.txt","w"); if(fp==NULL){ printf("文件不存在"); exit(0); } printf("將從鍵盤輸入數(shù)據(jù)寫入文件:\n"); scanf("%d",&x); fprintf(fp,"%d",x); fclose(fp); return0;}二進(jìn)制文件和文本文件

20_e.c#include"stdio.h"二進(jìn)制文件和文本文件23文件的操作4例1:讀取一個給定的文本文件,并將文件的內(nèi)容顯示在屏幕上。

問題分析需要讀取文本文件,所以以“r”操作模式將文件打開。

文本文件的結(jié)束標(biāo)志為EOF(-1)。當(dāng)文件讀寫指針指向EOF時,表示文件已經(jīng)讀到了尾部。因此,在讀文件時,需要設(shè)計一個while循環(huán)語句,它的結(jié)束條件是讀取的字符等于EOF。需要讀取的文件名稱通過命令行參數(shù)帶入,這樣可以擴(kuò)展程序的使用范圍,增加程序運(yùn)行的靈活性。17/403文件的操作4例1:讀取一個給定的文本文件,并將文件的內(nèi)容顯算法描述

開始結(jié)束ch!=EOF非空行NNargs!=2輸出提示信息輸出chYYYN打開不成功輸出提示信息fgetc()chfclose()fgetc()ch18/40算法描述開始結(jié)束ch!=EOF非空行NNargs!=2輸#include<stdio.h>intmain(){FILE*fp;intch;charname[100];printf(“請輸入文件名:\n”);

gets(name);

fp=fopen(name,"r");if(fp==NULL){/*打開文件*/printf("Cannotopenfile!");return1;}ch=fgetc(fp); /*以字符方式讀取文件*/while(ch!=EOF){putchar(ch);ch=fgetc(fp);}fclose(fp); /*關(guān)閉文件*/return0;}19/40#include<stdio.h>19/403文件的操作4字符串讀寫操作

1、fgets()的調(diào)用格式:

fgets(字符數(shù)組名,n,文件指針);例如:fgets(str,n,fp);語句功能是:從fp所指的文件中讀出n-1個字符并存入字符數(shù)組str中。2、fputs()的調(diào)用格式:

fputs(字符串,文件指針);例如:fputs(“Cprogram”,fp);語句功能是:將字符串“Cprogram”寫入fp所指的文件中。20/403文件的操作4字符串讀寫操作20/403文件的操作4例2:編程從鍵盤輸入一個源文件的文件名和一個目的文件的文件名,將源文件的內(nèi)容拷貝到目的文件中。21/403文件的操作4例2:編程從鍵盤輸入一個源文件的文件名和一個目#include<stdio.h>intmain(){FILE*fp1,*fp2;charstr[20],srcName[20],desName[20];gets(srcName);gets(desName);if((fp1=fopen(srcName,"r"))==NULL){printf("file1opennederror.\n");exit(0);}if((fp2=fopen(desName,"w"))==NULL){printf("file2createderror.\n");exit(0);}while(fgets(str,20,fp1)!=NULL)fputs(str,fp2);fclose(fp1);fclose(fp2);return0;}22/40#include<stdio.h>22/40#include<stdio.h>#include<string.h>intreadFile(charlines[][80]);voidwriteFile(charlines[][80],intn);main(){intchoice,num;charlines[100][80];do{/*顯示菜單*/ printf("\n==========MENU==========\n"); printf("\nreadfile.................1"); printf("\nwritefile................2"); printf("\nexit......................3"); printf("\nselect:"); scanf(“%d”,&choice);getchar();/*用戶選擇*/ if(choice==1) num=readFile(lines); if(choice==2) writeFile(lines,num); }while(choice!=3);}例3:P214例6-1323/40#include<stdio.h>例3:P214例6-13intreadFile(charlines[][80]) *讀文件*/{inti;FILE*fp;charfilename[30];printf(“\nEnterfilename:”);/*輸入要進(jìn)行寫操作的文件名*/gets(filename);if((fp=fopen(filename,“r”))==NULL){ /*打開文件*/printf("Cannotopenfile!");return0;}for(i=0;!feof(fp);i++){/*讀取并顯示文件*/fgets(&lines[i][0],80,fp);puts(&lines[i][0]);}fclose(fp);returni;}24/40intreadFile(charlines[][80]voidwriteFile(charlines[][80],intn) /*寫文件*/{FILE*fp;charfilename[30];printf(“\nEnterfilename:”);/*輸入要進(jìn)行寫操作的文件名*/gets(filename);if((fp=fopen(filename,“w”))==NULL){ /*打開文件*/printf("Cannotopenfile!");return;}while(n!=0){fputs(&lines[--n][0],fp); /*寫出一行字符串*/ fprintf(fp,"\n"); }fclose(fp);/*關(guān)閉文件*/}25/40voidwriteFile(charlines[][83文件的操作4數(shù)據(jù)塊讀寫操作

1、fread()的調(diào)用格式:

fread(buffer,size,count,fp);

例如:fread(buffer,sizeof(int),5,fp);;語句功能是:從fp所指的文件中讀取5塊數(shù)據(jù)并放在buffer中,每塊數(shù)據(jù)的大小為int類型占用的字節(jié)數(shù)量。2、fwrite()的調(diào)用格式:

fwrite(buffer,size,count,fp);

例如:fwrite(buffer,sizeof(float),5,fp);語句功能是:將buffer中存放的數(shù)據(jù)寫入fp所指的文件中,共寫入5塊數(shù)據(jù),每塊數(shù)據(jù)的大小為float類型占用的字節(jié)數(shù)量。輸入輸出的內(nèi)容都為二進(jìn)制形式26/403文件的操作4數(shù)據(jù)塊讀寫操作輸入輸出的內(nèi)容都為二進(jìn)制形式23文件的操作4例4:從鍵盤輸入學(xué)生基本信息,寫入二進(jìn)制文件;再從該文件中讀取學(xué)生基本信息,并顯示輸出。問題分析假設(shè)學(xué)生基本信息只包含學(xué)號、姓名、所屬院系和專業(yè)幾個數(shù)據(jù)項,為此,需要定義一個結(jié)構(gòu)類型。輸入學(xué)生信息的時候,將所有數(shù)據(jù)項存放在一個結(jié)構(gòu)型變量中,并以二進(jìn)制的形式寫入文件;在讀取文件的時候,每次讀取一個結(jié)構(gòu)類型變量的字節(jié)數(shù)目,這樣可以很輕松地實現(xiàn)將結(jié)構(gòu)型數(shù)據(jù)存儲到磁盤文件中的操作。

27/403文件的操作4例4:從鍵盤輸入學(xué)生基本信息,寫入二進(jìn)制文件;#include<stdio.h>#defineNUM30typedefstructinfo{/*表示學(xué)生基本信息的結(jié)構(gòu)類型*/intNo; /*學(xué)號*/charname[16]; /*姓名*/chardepartment[32]; /*所屬院系*/charmajor[32]; /*所學(xué)專業(yè)*/}INFO;28/40#include<stdio.h>28/40intmain(){INFOs;inti;FILE*fp;charfilename[32];printf("\nEnterfile'name:");/*輸入文件名*/gets(filename);if((fp=fopen(filename,"wb"))==NULL){/*以二進(jìn)制寫方式打開文件*/printf("\Cannotopen%sfile.",filename);return1;}29/40intmain()29/40for(i=0;i<NUM;i++){ /*通過鍵盤輸入學(xué)生信息并寫入文件*/scanf("%d%s%s%s",&s.No,,s.department,s.major);fwrite(&s,sizeof(INFO),1,fp);}fclose(fp); /*關(guān)閉文件*/if((fp=fopen(filename,"rb"))==NULL){/*以二進(jìn)制讀方式打開文件*/printf("\nCannotopen%sfile.",filename);return1;}while(fread(&s,sizeof(INFO),1,fp))/*從文件中讀信息并顯示輸出*/printf("\n%4d%16s%20s%20s",s.No,,s.department,s.major);fclose(fp); /*關(guān)閉文件*/return0;}30/40for(i=0;i<NUM;i++){ 3文件的操作4格式化讀寫操作

1、fscanf()的調(diào)用格式:

fscanf(文件指針,格式字符串,輸入列表);例如:fscanf(fp,"%d%f",&i,&j);語句功能是:從fp所指的文件中按照格式控制的描述讀取一個整型數(shù)值給i,一個單精度數(shù)值給j。2、fprintf()的調(diào)用格式:

fprintf(文件指針,格式字符串,輸出列表);例如:fprintf(fp,"%d%f",i,j);語句功能是:將i、j的內(nèi)容按照格式控制的描述寫入fp所指的文件中。輸入輸出的內(nèi)容都為ASCII碼值制形式注意:用fprintf和fscanf函數(shù)對磁盤文件讀寫,使用方便,容易理解,但由于在輸入時要將ASCII碼轉(zhuǎn)換為二進(jìn)制形式,在輸出時又要將二進(jìn)制形式轉(zhuǎn)換成字符,花費(fèi)時間比較多。因此,在內(nèi)存與磁盤頻繁交換數(shù)據(jù)的情況下,最好不用fprintf和fscanf函數(shù),而用fread和fwrite函數(shù)。31/403文件的操作4格式化讀寫操作輸入輸出的內(nèi)容都為ASCII碼3文件的操作4例5:從鍵盤輸入一個源文件的名稱和一個目的文件的名稱,在源文件中存放了一個計算式(注意沒有空格).

例如1+2

程序的功能是從源文件中讀取該式,并計算其結(jié)果,將式子和結(jié)果以如下樣式輸出

1+2=332/403文件的操作4例5:從鍵盤輸入一個源文件的名稱和一個目的文件#include<stdio.h>intmain(){FILE*fp1,*fp2;charsrcName[20],desName[20],op;floatsrc1,src2,result;printf("請輸入源文件名:\n");gets(srcName);printf("請輸入目的文件名:\n");gets(desName);if((fp1=fopen(srcName,"r"))==NULL){printf("file1opennederror.\n");exit(0);}if((fp2=fopen(desName,"w"))==NULL){printf("file2createderror.\n");exit(0);}fscanf(fp1,"%f%c%f",&src1,&op,&src2);

33/40#include<stdio.h>33/40switch(op){ case'+': result=src1+src2; break; case'-': result=src1-src2; break; case'*': result=src1*src2; break; case'/': result=src1/src2;}fprintf(fp2,"%f%c%f=%f",src1,op,src2,result);fclose(fp1);fclose(fp2);return0;}34/40switch(op){34/40#include<stdio.h>#defineNUM30typedefstructinfo{/*表示學(xué)生基本信息的結(jié)構(gòu)體類型*/ intNo; charname[16]; chardepartment[32]; charmajor[32];}INFO;例6:P219例6-1535/40#include<stdio.h>例6:P219例6-1main(){ INFOs; inti; FILE*fp; charfilename[32];

printf(“\nEnterfilename:”); /*輸入文件名*/ gets(filename); /*以寫方式打開文件*/ if((fp=fopen(filename,"w"))==NULL){ printf("\nCannotopen%sfile.",filename); return1; }

36/40main()36/40/*按照格式控制輸入學(xué)生信息并寫入文件*/for(i=0;i<NUM;i++){printf("\nEnterNo,name,department,major");scanf("%d%s%s%s",&s.No,,s.department,s.major);fprintf(fp,"%d%s%s%s\n",s.No,,s.department,s.major);}fclose(fp);/*關(guān)閉文件*/if((fp=fopen(filename,“r”))==NULL)/*以讀方式打開文件*/{printf("\nCannotopen%sfile.",filename);return1;}while(!feof(fp))/*按格式控制從文件讀取并顯示*/{fscanf(fp,"%d%s%s%s\n",&s.No,,s.department,s.major);printf("\n%4d%16s%20s%20s",s.No,,s.department,s.major);}fclose(fp);/*關(guān)閉文件*/}37/40

3課堂練習(xí)5已知在一個resouce.txt文件中,第一行放了一個n,表示第二行放的數(shù)的個數(shù)

例如:

14785

對該文件的第二行中的所有數(shù)據(jù)求和,保存在文件result.txt#include<stdio.h>intmain(){ inti,n=0,m,sum=0;FILE*fp; if((fp=fopen("k:\\2011-2012-2\\c\\resouce.txt","r"))==NULL) { printf("\nCannotopenfile."); return1; } fscanf(fp,"%d",&n); printf("n=%d\n",n); for(i=0;i<n;i++) { fscanf(fp,"%d",&m); sum+=m; } printf("sum=%d\n",sum); fclose(fp); if((fp=fopen("k:\\2011-2012-2\\c\\result.txt","w"))==NULL) {printf("\nCannotopenfile."); return1; } fprintf(fp,"%d",sum); fclose(fp); return0;}38/403課堂練習(xí)5已知在一個resouce.txt文件中,第一行放順序讀寫:位置指針按字節(jié)位置順序移動。隨機(jī)讀寫:讀寫完上一個字符(字節(jié))后,并不一定要讀寫其后續(xù)的字符(字節(jié)),而可以讀些文件中任意位置上所需要的字符(字節(jié))。1.文件位置指針的定位C語言提供以下有關(guān)函數(shù)使位置指針指向指定的位置:(1)rewind函數(shù)函數(shù)功能:是使位置指針重新返回文件的開頭,此函數(shù)沒有返回值。3數(shù)據(jù)文件的隨機(jī)讀寫539/40順序讀寫:3數(shù)據(jù)文件的隨機(jī)讀寫539/40例:有一個磁盤文件,第一次將它的內(nèi)容顯示在屏幕上,第二次把它復(fù)制到另一文件上。#include<stdio.h>main(){ FILE*fp1,*fp2; fp1=fopen("file1.c","r"); fp2=fopen("file2.c","w");while(!feof(fp1))putchar(getc(fp1));rewind(fp1); while(!feof(fp1))putc(getc(fp1),fp2);fclose(fp1);fclose(fp2);}40/40例:有一個磁盤文件,第一次將它的內(nèi)容顯示在屏幕上,第二次40(2)fseek函數(shù)函數(shù)功能:改變文件的位置指針函數(shù)調(diào)用形式:fseek(文件類型指針,位移量,起始點(diǎn))起始點(diǎn):文件開頭SEEK_SET0

文件當(dāng)前位置SEEK_CUR1

文件末尾SEEK_END2位移量:以起始點(diǎn)為基點(diǎn),向前移動的字節(jié)數(shù)。一般要求為long型

3文件位置指針的定位641/40(2)fseek函數(shù)3文件位置指針的定位641/40fseek函數(shù)應(yīng)用舉例:fseek(fp,100L,0);將位置指針移到離文件頭100個字節(jié)處fseek(fp,50L,1);將位置指針移到離當(dāng)前位置50個字節(jié)處fseek(fp,50L,2);將位置指針從文件末尾處向后退10個字節(jié)

3文件位置指針的定位642/40fseek函數(shù)應(yīng)用舉例:3文件位置指針的定位642/40例:在磁盤文件上存有10個學(xué)生的數(shù)據(jù)。要求將第1、3、5、7、9個學(xué)生數(shù)據(jù)輸入計算機(jī),并在屏幕上顯示出來。

#include<stdlib.h>#include<stdio.h>structstudent_type{charname[10];intnum;intage;charsex;}stud[10];3文件的隨機(jī)讀寫743/40例:在磁盤文件上存有10個學(xué)生的數(shù)據(jù)。要求將第1、3、3文件voidmain(){inti;FILE*fp;if((fp=fopen("stud_dat","rb"))==NULL){printf("cannotopenfile\n");exit(0);}for(i=0;i<10;i+=2){fseek(fp,i*sizeof(structstudent_type),0);fread(&stud[i],sizeof(structstudent_type),1,fp);printf("%s%d%d%c\n",stud[i].name,stud[i].num,stud[i].age,stud[i].sex);}fclose(fp);}44/40voidmain()44/403課后練習(xí)8編程,把文本文件d1.dat復(fù)制到d2.dat(其中大寫英文字母要轉(zhuǎn)換為小寫字母)。設(shè)文件number.dat中存放了10個整數(shù)。請編程統(tǒng)計并輸出文件中正整數(shù)、負(fù)整數(shù)和零的個數(shù)。P22814、15P231二程序填空題245/403課后練習(xí)8編程,把文本文件d1.dat復(fù)制到d2.dat(Lesson20數(shù)據(jù)文件及其操作46/40Lesson20數(shù)據(jù)文件及其操作1/40輸入/輸出的概念及學(xué)習(xí)目標(biāo)31學(xué)會讀寫數(shù)據(jù)文件操作系統(tǒng)的標(biāo)準(zhǔn)輸入/輸出設(shè)備:鍵盤/顯示器如果需要改變輸入/輸出的流向,需要重定向另一個輸入/輸出的對象就是磁盤數(shù)據(jù)文件使用數(shù)據(jù)文件來建立程序中的數(shù)據(jù)或保存數(shù)據(jù)到文件中,是C程序設(shè)計的習(xí)慣用法。47/40輸入/輸出的概念及學(xué)習(xí)目標(biāo)31學(xué)會讀寫數(shù)據(jù)文件操作系統(tǒng)的標(biāo)準(zhǔn)3文件的概念2文件:是指一組相關(guān)數(shù)據(jù)的有序集合。

這個數(shù)據(jù)集有一個名稱,叫做文件名。操作系統(tǒng)是以文件為單位對數(shù)據(jù)進(jìn)行管理的。

例如:C:\24000101\program.c,其中k:\24000101叫路徑,program.c是文件名。當(dāng)需要使用文件的時候,需要將文件調(diào)入內(nèi)存中。

48/403文件的概念2文件:是指一組相關(guān)數(shù)據(jù)的有序集合。這個數(shù)據(jù)集3C語言中使用的數(shù)據(jù)文件的概念2從文件編碼和數(shù)據(jù)的組織方式來看,數(shù)據(jù)文件可分為ASCII碼文件和二進(jìn)制碼文件。

也叫文本文件文件程序數(shù)據(jù)區(qū)輸出文件緩沖區(qū)輸入文件緩沖區(qū)磁盤上內(nèi)存中操作系統(tǒng)在內(nèi)存中的緩沖區(qū)49/403C語言中使用的數(shù)據(jù)文件的概念2從文件編碼和數(shù)據(jù)的組織方式來3文件的概念2ASCII數(shù)據(jù)文件:文件在磁盤中存放時每個字符占一個字節(jié),每個字節(jié)存放相應(yīng)字符的ASCII碼值。二進(jìn)制數(shù)據(jù)文件:存儲介質(zhì)上保存的數(shù)據(jù)采用與內(nèi)存數(shù)據(jù)一致的表示形式存儲(為二進(jìn)制形式)。例:在文件中存放整數(shù)2147483647ASCII碼32H31H34H37H34H38H33H36H34H37H二進(jìn)制FFHFFHFFH7FHC語言把文件看作是一個字符(字節(jié))的序列,即由一個一個字符(字節(jié))的數(shù)據(jù)順序組成。一個輸入輸出流就是一個字節(jié)流或二進(jìn)制流。

50/403文件的概念2ASCII數(shù)據(jù)文件:文件在磁盤中存放時每個字符文件的位置指針位置指針用來指示當(dāng)前的讀寫位置。

一般情況下,在對字符文件進(jìn)行順序讀寫時,文件的位置指針指向文件開頭,這時如果對文件進(jìn)行讀的操作,就讀第一個字符,然后文件的位置指針順序向后移一個位置,在下一次執(zhí)行讀的操作時,就將指針指向的第二個字符讀入。依此類推,直到遇文件尾.↑↑

↑文件頭讀寫當(dāng)前位置文件尾有時希望在一個文件的原有數(shù)據(jù)之后再添加新的數(shù)據(jù),應(yīng)該把文件位置指針移到文件尾,然后再接著寫入新的數(shù)據(jù),這就是文件的追加。51/40文件的位置指針位置指針用來指示當(dāng)前的讀寫位置?!?文件的操作3文件的基本操作

定義文件指針定義格式為:FILE*文件指針變量;例如FILE*fp;FILE

f[5];文件的打開文件指針=fopen(文件名,操作模式)fp=fopen("c:\\file.dat","r"));if((fp==NUUL){printf(“\nCannotopenthefile”);return1; }52/403文件的操作3文件的基本操作7/403文件的操作3文件使用方式含義"r"只讀,文本以只讀方式打開一個已有的文本文件。"w"只寫,文本以只寫方式建立一個新的文本文件。如果該文件已存在則將它刪去,然后重新建立一個新文件。"a"追加,文本以添加方式打開一個文本文件,在文件末尾添加。如果該文件不存在,則建立一個新文件后再添加。"rb"只讀,二進(jìn)制以只讀方式打開一個已有的二進(jìn)制文件。"wb"只寫,二進(jìn)制以只寫方式打開一個二進(jìn)制文件。"ab"追加,二進(jìn)制以添加方式打開一個二進(jìn)制文件。53/403文件的操作3文件使用方式含義"r"只讀,文3文件的操作3打開文件文件方式文件使用方式含義"r+"讀寫,文本以讀寫方式打開一個已有的文本文件。"w+"讀寫,文本以讀寫方式建立一個新的文本文件。"a+"讀寫,文本以讀寫方式打開一個文本文件,在文件末尾添加和修改,如果文件不存在,則建立一個新文件后再添加和修改。"rb+"讀寫,二進(jìn)制以讀寫方式打開一個已有的二進(jìn)制文件。"wb+"讀寫,二進(jìn)制以讀寫方式建立一個新的二進(jìn)制文件。"ab+"讀寫,二進(jìn)制以讀寫方式打開一個二進(jìn)制文件。54/403文件的操作3打開文件文件方式文件使用方式含3文件的操作3文件的關(guān)閉fclose(文件指針);例如:fclose(fp);文件的讀寫操作字符讀寫函數(shù)

:fgetc()和fputc()字符串讀寫函數(shù):fgets()和fputs()數(shù)據(jù)塊讀寫函數(shù):fread()和fwrite()格式化讀寫函數(shù):fscanf()和fprinf()

返回值:關(guān)閉成功返回值為0;否則返回EOF(-1)55/403文件的操作3文件的關(guān)閉返回值:10/403文件的操作4字符讀寫操作

1、fgetc()的調(diào)用格式:字符型變量=fgetc(文件指針);例如:ch=fgetc(fp);語句功能是:從fp指向的文件中讀取一個字符并將這個字符賦給char型變量ch。遇結(jié)束,返回EOF。2、fputc()的調(diào)用格式:

fputc(字符,文件指針);例如:fputc(ch,fp);語句功能是:將字符型變量ch的內(nèi)容寫入文件指針fp所指的文本文件中。寫入成功,返回字符本身,反之EOF。56/403文件的操作4字符讀寫操作11/40讀文件基本過程

#include"stdio.h"intmain(){ inti,x; FILE*fp; fp=fopen("array.txt","r"); if(fp==NULL){ printf("文件不存在"); exit(0); } printf("從文件中讀取的數(shù)據(jù):\n"); for(i=1;i<10;i++){ fscanf(fp,"%d",&x); if(i%5==0)printf("\n"); printf("%4d",x); }fclose(fp); return0;}1、定義FILE指針2、打開文件3、確保文件有效4、用函數(shù)讀文件5、關(guān)閉文件讀文件基本過程#include"stdio.h"1、定義寫文件基本過程

#include"stdio.h"intmain(){ inti,x; FILE*fp; fp=fopen("array2.txt",“w"); if(fp==NULL){ printf("文件不存在"); exit(0); } printf("從文件中讀取的數(shù)據(jù):\n"); for(i=1;i<10;i++){ scanf("%d",&x); fprintf(fp,"%4d",x); }fclose(fp); return0;}1、定義FILE指針2、打開文件3、確保文件有效4、用函數(shù)往文件寫數(shù)據(jù)5、關(guān)閉文件寫文件基本過程#include"stdio.h"1、定義a和w的區(qū)別

#include"stdio.h"intmain(){ inti,x; FILE*fp; fp=fopen("array.txt",“a"); if(fp==NULL){ printf("文件不存在"); exit(0); } printf("從文件中讀取的數(shù)據(jù):\n"); for(i=1;i<10;i++){ scanf("%d",&x); fprintf(fp,"%4d",x); }fclose(fp); return0;}打開文件方式a和w的區(qū)別#include"stdio.h"打開文件方二進(jìn)制文件和文本文件

#include"stdio.h"intmain(){ inti,x; FILE*fp; fp=fopen("array4.txt","wb"); if(fp==NULL){ printf("文件不存在"); exit(0); } printf("將從鍵盤輸入數(shù)據(jù)寫入文件:\n"); scanf("%d",&x); fwrite(&x,sizeof(x),1,fp); fclose(fp); return0;}二進(jìn)制文件和文本文件#include"stdio.h"#include"stdio.h"intmain(){ inti,x; FILE*fp; fp=fopen("array5.txt","w"); if(fp==NULL){ printf("文件不存在"); exit(0); } printf("將從鍵盤輸入數(shù)據(jù)寫入文件:\n"); scanf("%d",&x); fprintf(fp,"%d",x); fclose(fp); return0;}二進(jìn)制文件和文本文件

20_e.c#include"stdio.h"二進(jìn)制文件和文本文件23文件的操作4例1:讀取一個給定的文本文件,并將文件的內(nèi)容顯示在屏幕上。

問題分析需要讀取文本文件,所以以“r”操作模式將文件打開。

文本文件的結(jié)束標(biāo)志為EOF(-1)。當(dāng)文件讀寫指針指向EOF時,表示文件已經(jīng)讀到了尾部。因此,在讀文件時,需要設(shè)計一個while循環(huán)語句,它的結(jié)束條件是讀取的字符等于EOF。需要讀取的文件名稱通過命令行參數(shù)帶入,這樣可以擴(kuò)展程序的使用范圍,增加程序運(yùn)行的靈活性。62/403文件的操作4例1:讀取一個給定的文本文件,并將文件的內(nèi)容顯算法描述

開始結(jié)束ch!=EOF非空行NNargs!=2輸出提示信息輸出chYYYN打開不成功輸出提示信息fgetc()chfclose()fgetc()ch63/40算法描述開始結(jié)束ch!=EOF非空行NNargs!=2輸#include<stdio.h>intmain(){FILE*fp;intch;charname[100];printf(“請輸入文件名:\n”);

gets(name);

fp=fopen(name,"r");if(fp==NULL){/*打開文件*/printf("Cannotopenfile!");return1;}ch=fgetc(fp); /*以字符方式讀取文件*/while(ch!=EOF){putchar(ch);ch=fgetc(fp);}fclose(fp); /*關(guān)閉文件*/return0;}64/40#include<stdio.h>19/403文件的操作4字符串讀寫操作

1、fgets()的調(diào)用格式:

fgets(字符數(shù)組名,n,文件指針);例如:fgets(str,n,fp);語句功能是:從fp所指的文件中讀出n-1個字符并存入字符數(shù)組str中。2、fputs()的調(diào)用格式:

fputs(字符串,文件指針);例如:fputs(“Cprogram”,fp);語句功能是:將字符串“Cprogram”寫入fp所指的文件中。65/403文件的操作4字符串讀寫操作20/403文件的操作4例2:編程從鍵盤輸入一個源文件的文件名和一個目的文件的文件名,將源文件的內(nèi)容拷貝到目的文件中。66/403文件的操作4例2:編程從鍵盤輸入一個源文件的文件名和一個目#include<stdio.h>intmain(){FILE*fp1,*fp2;charstr[20],srcName[20],desName[20];gets(srcName);gets(desName);if((fp1=fopen(srcName,"r"))==NULL){printf("file1opennederror.\n");exit(0);}if((fp2=fopen(desName,"w"))==NULL){printf("file2createderror.\n");exit(0);}while(fgets(str,20,fp1)!=NULL)fputs(str,fp2);fclose(fp1);fclose(fp2);return0;}67/40#include<stdio.h>22/40#include<stdio.h>#include<string.h>intreadFile(charlines[][80]);voidwriteFile(charlines[][80],intn);main(){intchoice,num;charlines[100][80];do{/*顯示菜單*/ printf("\n==========MENU==========\n"); printf("\nreadfile.................1"); printf("\nwritefile................2"); printf("\nexit......................3"); printf("\nselect:"); scanf(“%d”,&choice);getchar();/*用戶選擇*/ if(choice==1) num=readFile(lines); if(choice==2) writeFile(lines,num); }while(choice!=3);}例3:P214例6-1368/40#include<stdio.h>例3:P214例6-13intreadFile(charlines[][80]) *讀文件*/{inti;FILE*fp;charfilename[30];printf(“\nEnterfilename:”);/*輸入要進(jìn)行寫操作的文件名*/gets(filename);if((fp=fopen(filename,“r”))==NULL){ /*打開文件*/printf("Cannotopenfile!");return0;}for(i=0;!feof(fp);i++){/*讀取并顯示文件*/fgets(&lines[i][0],80,fp);puts(&lines[i][0]);}fclose(fp);returni;}69/40intreadFile(charlines[][80]voidwriteFile(charlines[][80],intn) /*寫文件*/{FILE*fp;charfilename[30];printf(“\nEnterfilename:”);/*輸入要進(jìn)行寫操作的文件名*/gets(filename);if((fp=fopen(filename,“w”))==NULL){ /*打開文件*/printf("Cannotopenfile!");return;}while(n!=0){fputs(&lines[--n][0],fp); /*寫出一行字符串*/ fprintf(fp,"\n"); }fclose(fp);/*關(guān)閉文件*/}70/40voidwriteFile(charlines[][83文件的操作4數(shù)據(jù)塊讀寫操作

1、fread()的調(diào)用格式:

fread(buffer,size,count,fp);

例如:fread(buffer,sizeof(int),5,fp);;語句功能是:從fp所指的文件中讀取5塊數(shù)據(jù)并放在buffer中,每塊數(shù)據(jù)的大小為int類型占用的字節(jié)數(shù)量。2、fwrite()的調(diào)用格式:

fwrite(buffer,size,count,fp);

例如:fwrite(buffer,sizeof(float),5,fp);語句功能是:將buffer中存放的數(shù)據(jù)寫入fp所指的文件中,共寫入5塊數(shù)據(jù),每塊數(shù)據(jù)的大小為float類型占用的字節(jié)數(shù)量。輸入輸出的內(nèi)容都為二進(jìn)制形式71/403文件的操作4數(shù)據(jù)塊讀寫操作輸入輸出的內(nèi)容都為二進(jìn)制形式23文件的操作4例4:從鍵盤輸入學(xué)生基本信息,寫入二進(jìn)制文件;再從該文件中讀取學(xué)生基本信息,并顯示輸出。問題分析假設(shè)學(xué)生基本信息只包含學(xué)號、姓名、所屬院系和專業(yè)幾個數(shù)據(jù)項,為此,需要定義一個結(jié)構(gòu)類型。輸入學(xué)生信息的時候,將所有數(shù)據(jù)項存放在一個結(jié)構(gòu)型變量中,并以二進(jìn)制的形式寫入文件;在讀取文件的時候,每次讀取一個結(jié)構(gòu)類型變量的字節(jié)數(shù)目,這樣可以很輕松地實現(xiàn)將結(jié)構(gòu)型數(shù)據(jù)存儲到磁盤文件中的操作。

72/403文件的操作4例4:從鍵盤輸入學(xué)生基本信息,寫入二進(jìn)制文件;#include<stdio.h>#defineNUM30typedefstructinfo{/*表示學(xué)生基本信息的結(jié)構(gòu)類型*/intNo; /*學(xué)號*/charname[16]; /*姓名*/chardepartment[32]; /*所屬院系*/charmajor[32]; /*所學(xué)專業(yè)*/}INFO;73/40#include<stdio.h>28/40intmain(){INFOs;inti;FILE*fp;charfilename[32];printf("\nEnterfile'name:");/*輸入文件名*/gets(filename);if((fp=fopen(filename,"wb"))==NULL){/*以二進(jìn)制寫方式打開文件*/printf("\Cannotopen%sfile.",filename);return1;}74/40intmain()29/40for(i=0;i<NUM;i++){ /*通過鍵盤輸入學(xué)生信息并寫入文件*/scanf("%d%s%s%s",&s.No,,s.department,s.major);fwrite(&s,sizeof(INFO),1,fp);}fclose(fp); /*關(guān)閉文件*/if((fp=fopen(filename,"rb"))==NULL){/*以二進(jìn)制讀方式打開文件*/printf("\nCannotopen%sfile.",filename);return1;}while(fread(&s,sizeof(INFO),1,fp))/*從文件中讀信息并顯示輸出*/printf("\n%4d%16s%20s%20s",s.No,,s.department,s.major);fclose(fp); /*關(guān)閉文件*/return0;}75/40for(i=0;i<NUM;i++){ 3文件的操作4格式化讀寫操作

1、fscanf()的調(diào)用格式:

fscanf(文件指針,格式字符串,輸入列表);例如:fscanf(fp,"%d%f",&i,&j);語句功能是:從fp所指的文件中按照格式控制的描述讀取一個整型數(shù)值給i,一個單精度數(shù)值給j。2、fprintf()的調(diào)用格式:

fprintf(文件指針,格式字符串,輸出列表);例如:fprintf(fp,"%d%f",i,j);語句功能是:將i、j的內(nèi)容按照格式控制的描述寫入fp所指的文件中。輸入輸出的內(nèi)容都為ASCII碼值制形式注意:用fprintf和fscanf函數(shù)對磁盤文件讀寫,使用方便,容易理解,但由于在輸入時要將ASCII碼轉(zhuǎn)換為二進(jìn)制形式,在輸出時又要將二進(jìn)制形式轉(zhuǎn)換成字符,花費(fèi)時間比較多。因此,在內(nèi)存與磁盤頻繁交換數(shù)據(jù)的情況下,最好不用fprintf和fscanf函數(shù),而用fread和fwrite函數(shù)。76/403文件的操作4格式化讀寫操作輸入輸出的內(nèi)容都為ASCII碼3文件的操作4例5:從鍵盤輸入一個源文件的名稱和一個目的文件的名稱,在源文件中存放了一個計算式(注意沒有空格).

例如1+2

程序的功能是從源文件中讀取該式,并計算其結(jié)果,將式子和結(jié)果以如下樣式輸出

1+2=377/403文件的操作4例5:從鍵盤輸入一個源文件的名稱和一個目的文件#include<stdio.h>intmain(){FILE*fp1,*fp2;charsrcName[20],desName[20],op;floatsrc1,src2,result;printf("請輸入源文件名:\n");gets(srcName);printf("請輸入目的文件名:\n");gets(desName);if((fp1=fopen(srcName,"r"))==NULL){printf("file1opennederror.\n");exit(0);}if((fp2=fopen(desName,"w"))==NULL){printf("file2createderror.\n");exit(0);}fscanf(fp1,"%f%c%f",&src1,&op,&src2);

78/40#include<stdio.h>33/40switch(op){ case'+': result=src1+src2; break; case'-': result=src1-src2; break; case'*': result=src1*src2; break; case'/': result=src1/src2;}fprintf(fp2,"%f%c%f=%f",src1,op,src2,result);fclose(fp1);fclose(fp2);return0;}79/40switch(op){34/40#include<stdio.h>#defineNUM30typedefstructinfo{/*表示學(xué)生基本信息的結(jié)構(gòu)體類型*/ intNo; charname[16]; chardepartment[32]; charmajor[32];}INFO;例6:P219例6-1580/40#include<stdio.h>例6:P219例6-1main(){ INFOs; inti; FILE*fp; charfilename[32];

printf(“\nEnterfilename:”); /*輸入文件名*/ gets(filename); /*以寫方式打開文件*/ if((fp=fopen(filename,"w"))==NULL){ printf("\nCannotopen%sfile.",filename); return1; }

81/40main()36/40/*按照格式控制輸入學(xué)生信息并寫入文件*/for(i=0;i<NUM;i++){printf("\nEnterNo,name,department,major");scanf("%d%s%s%s",&s.No,,s.department,s.major);fprintf(fp,"%d%s%s%s\n",s.No,,s.department,s.major);}fclose(fp);

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論