C語(yǔ)言程序設(shè)計(jì)項(xiàng)目八_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)項(xiàng)目八_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)項(xiàng)目八_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)項(xiàng)目八_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)項(xiàng)目八_第5頁(yè)
已閱讀5頁(yè),還剩12頁(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)介

會(huì)計(jì)學(xué)1C語(yǔ)言程序設(shè)計(jì)項(xiàng)目八三、相關(guān)知識(shí)(一)文件的打開關(guān)閉。1.文件的概念所謂“文件”是指記錄在外部介質(zhì)上的數(shù)據(jù)的有序集合。從文件的編碼方式來(lái)看,文件可分為ASCII碼文件和二進(jìn)制碼文件兩種。2.文件類型指針FILE*指針變量標(biāo)識(shí)符;例如:FILE*p;習(xí)慣上籠統(tǒng)地把p稱為指向一個(gè)文件的指針。在進(jìn)行讀寫操作之前要先打開文件,使用完畢要關(guān)閉文件。3.文件的打開與關(guān)閉(1)文件的打開(fopen()函數(shù))fopen()函數(shù)用來(lái)打開一個(gè)文件,其調(diào)用的一般形式為:FILE*pp=fopen(文件名,使用文件方式)(2)文件的關(guān)閉(fclose函數(shù))fclose(文件指針)

例如:fclose(p);FILE*pp=fopen(“aa.dat”,”r”)FILE*fpfp=fopen(“d:\\a1.dat”,”rb”);FILE*fp;if((fp=fopen(“d:\\aa.dat”,”r”))==NULL){printf(“\ncan’topenfile!”);exit(1)}第1頁(yè)/共17頁(yè)(二)文件的讀寫(二)文件的讀寫fprintf()函數(shù)和fscanf()函數(shù)調(diào)用格式:fscanf(文件指針,格式字符串,輸入表列)fprintf(文件指針,格式字符串,輸出表列)例如:

fscantf(p,”%d,%f”,&a,&b);fprintf(p,”%d,%f”,a,b);#include"stdio.h"main(){inta[10],i,b[10];FILE*p;p=fopen("aaa.txt","w");

for(i=0;i<10;i++)scanf("%d",&a[i]);/*將輸入的成績(jī)以5d的格式保存在文件aaa.txt中*/for(i=0;i<10;i++)fprintf(p,"%5d",a[i]);fclose(p);//關(guān)閉文件p=fopen("aaa.txt","r");

/*將aaa.txt文件中的數(shù)據(jù)讀入到數(shù)組b中*/for(i=0;i<10;i++)fscanf(p,"%d",&b[i]);/*輸出數(shù)組b*/for(i=0;i<10;i++)printf("%3d",b[i]);fclose(p);}分析問題情景中的C程序第2頁(yè)/共17頁(yè)【例8-1】從鍵盤中輸入一個(gè)學(xué)生的姓名及數(shù)學(xué)、英語(yǔ)、語(yǔ)文三門課的成績(jī),計(jì)算這個(gè)同學(xué)的平均分,然后將此同學(xué)的有關(guān)信息寫入到文件cc.txt中;再把cc.txt文件中的數(shù)據(jù)讀入并輸出。分析:(1)需要定義一個(gè)字符數(shù)組存放姓名,三個(gè)整型變量存放三門課的成績(jī),一個(gè)實(shí)型變量用來(lái)存用平均分;(2)在鍵盤上讀入此同學(xué)的姓名、三門課的成績(jī),并計(jì)算平均分;(3)將姓名、三門課的成績(jī)、平均分寫入到以寫入形式打開的文本文件cc.txt中,然后關(guān)閉此文件;(4)將cc.txt文件以只讀的形式打開后,將此文件中的數(shù)據(jù)讀入到指定的變量中;(5)在顯示器上輸出變量;#include"stdio.h"#include“process.h”/*有exit()函數(shù),所有用此庫(kù)函數(shù)*/main(){charname[10],n1[10];intmath,english,chinese,m1,e1,c1;floatavg,a1;FILE*fp;/*以寫入的形式打開文件cc.txt*/if((fp=fopen("cc.txt","w"))==NULL){printf("打不開文件\n");exit(1);}printf("請(qǐng)輸入這個(gè)學(xué)生的數(shù)據(jù)\n");/*輸入該同學(xué)的姓名、成績(jī)并計(jì)算該同學(xué)的平均分*/scanf("%s%d%d%d",name,&math,&english,&chinese);avg=(math+english+chinese)/3.0;/*將此同學(xué)的姓名、三門課成績(jī)、平均分寫入到文件aa.txt中*/fprintf(fp,"%s%d%d%d%.1f\n",name,math,english,chinese,avg);fclose(fp);/*以讀入的形式打開文件cc.txt*/if((fp=fopen("cc.txt","r"))==NULL){printf("打不開文件\n");exit(1);}/*將該同學(xué)的姓名、三門課成績(jī)、平均分讀入到指定的變量中*/fscanf(fp,"%s%d%d%d%f",n1,&m1,&e1,&c1,&a1);fclose(fp);/*在顯示器上輸出數(shù)據(jù)*/printf("從文件中讀出的數(shù)據(jù)為:\n");printf("%s%d%d%d%.1f\n",n1,m1,e1,c1,a1);}第3頁(yè)/共17頁(yè)【例8-2】從鍵盤中輸入10個(gè)學(xué)生的姓名及數(shù)學(xué)、英語(yǔ)、語(yǔ)文三門課的成績(jī),計(jì)算每個(gè)同學(xué)的平均分,然后將此10個(gè)同學(xué)的姓名、三門課的成績(jī)及平均分寫入到文本文件aa.txt中。分析:編寫此題的思路是:(1)需要定義一個(gè)結(jié)構(gòu)體數(shù)組,用于存放10個(gè)同學(xué)的姓名、三門課的成績(jī)及平均分;(2)在鍵盤上讀入10個(gè)同學(xué)的姓名、三門課的成績(jī),然后計(jì)算每個(gè)同學(xué)的平均分;(3)將10個(gè)同學(xué)的姓名、三門課的成績(jī)及平均分寫入到文本文件aa.txt中;程序如下:#include"stdio.h"#include"process.h"/*定義結(jié)構(gòu)體*/structstu{charname[10];intmath,english,chinese;floatavg;}main(){stustudent[10],*pp;FILE*fp;inti;pp=student;/*以寫入的形式打開文件aa.txt*/if((fp=fopen("aa.txt","w"))==NULL){printf("打不開文件\n");exit(1);}printf("請(qǐng)輸入十個(gè)學(xué)生的數(shù)據(jù)\n");/*輸入十個(gè)同學(xué)的姓名、成績(jī)并計(jì)算每個(gè)同學(xué)的平均分*/for(i=0;i<10;i++,pp++){scanf("%s%d%d%d",pp->name,&pp->math,&pp->english,&pp->chinese);pp->avg=(pp->math+pp->englist+pp->chinese)/3.0;}pp=student;/*將十個(gè)同學(xué)的姓名、三門課成績(jī)、平均分寫入到文件aa.txt中*/for(i=0;i<10;i++,pp++)fprintf(fp,"%s%d%d%d%.1f\n",pp->name,pp->math,pp->english,pp->chinese,pp->avg);fclose(fp);//關(guān)閉文件}輸入的數(shù)據(jù)如下:打開件aa.txt第4頁(yè)/共17頁(yè)【例8-3】將上例中的文本文件aa.txt數(shù)據(jù)讀出,并將讀出的數(shù)據(jù)輸出在顯示器上。分析:(1)定義一個(gè)結(jié)構(gòu)體數(shù)組,用以存放讀出的數(shù)據(jù);(2)以只讀的形式打開文件文件aa.txt;(3)將文本文件aa.txt中的數(shù)據(jù)讀入到結(jié)構(gòu)體數(shù)組中;(4)在顯示器上輸出此數(shù)組;#include"stdio.h"#include“process.h”/*有exit()函數(shù),所有用此庫(kù)函數(shù)*//*定義結(jié)構(gòu)體*/structstu{charname[10];intmath,english,chinese;floatavg;}main(){stustudent[10],*pp;inti;FILE*fp;/*以讀入的形式打開文件aa.txt*/if((fp=fopen("aa.txt","r"))==NULL){printf("打不開文件\n");exit(1);}pp=student;/*從文件中將十個(gè)同學(xué)的姓名、三門課成績(jī)、平均分讀入到結(jié)構(gòu)體數(shù)組student中*/for(i=0;i<10;i++,pp++)fscanf(fp,"%s%d%d%d%f",pp->name,&pp->math,&pp->english,&pp->chinese,&pp->avg);fclose(fp);pp=student;/*輸出結(jié)構(gòu)體數(shù)組student*/printf("從文件aa.txt中讀出的數(shù)據(jù)為:\n");for(i=0;i<10;i++,pp++)printf("%s%d%d%d%.1f\n",pp->name,pp->math,pp->english,pp->chinese,pp->avg);fclose(fp);}顯然,輸出的結(jié)果就是上例中的數(shù)據(jù)。第5頁(yè)/共17頁(yè)2.fread()函數(shù)、fwrite()函數(shù)

將一組數(shù)據(jù),如一個(gè)數(shù)組元素,一個(gè)結(jié)構(gòu)變量的值等一次性讀寫,其輸入輸出函數(shù)是二進(jìn)制形式輸入輸出的函數(shù),在輸入輸出中不必進(jìn)行數(shù)據(jù)的轉(zhuǎn)換,輸入輸出速度相對(duì)較快。讀寫數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);說(shuō)明:buffer:對(duì)于fread()來(lái)說(shuō),指的是讀入數(shù)據(jù)的存放地址;對(duì)于fwrite來(lái)說(shuō),是要輸出數(shù)據(jù)的地址。size讀寫數(shù)據(jù)時(shí),每筆數(shù)據(jù)的大小count:讀寫數(shù)據(jù)的筆數(shù)fp:文件指針for(i=0;i<10;i++,pp++)fscanf(fp,"%s%d%d%d%f",pp->name,&pp->math,&pp->englist,&pp->chinese,&pp->avg);fread(yy,sizeof(structstu),10,fp);for(i=0;i<10;i++,p++)fprintf(fp,"%s%d%d%d%.1f\n",pp->name,pp->math,pp->englist,pp->chinese,pp->avg);fwrite(pp,sizeof(structstu),10,fp);第6頁(yè)/共17頁(yè)用fread()、fwrite()函數(shù)將【例8-2】【例8-3】合成后的程序如下

#include"stdio.h"#include"process.h"structstu{charname[10];intmath,englist,chinese;floatavg;}main(){stustudent[10],ss[10],*yy,*pp;FILE*fp;inti;pp=student;if((fp=fopen("aa.dat","wb"))==NULL){printf("打不開文件\n");exit(1);}printf("請(qǐng)輸入十個(gè)學(xué)生的數(shù)據(jù)\n");for(i=0;i<10;i++,pp++){scanf("%s%d%d%d",pp->name,&pp->math,&pp->englist,&pp->chinese);pp->avg=(pp->math+pp->englist+pp->chinese)/3.0;}pp=student;fwrite(pp,sizeof(structstu),10,fp);/*關(guān)閉文件*/fclose(fp);if((fp=fopen("aa.dat","rb"))==NULL){printf("打不開文件\n");exit(1);}yy=ss;/*一次性讀入十個(gè)同學(xué)的數(shù)據(jù)*/fread(yy,sizeof(structstu),10,fp);/*在顯示器上顯示結(jié)果*/printf("文件讀出后的數(shù)據(jù)為:\n");for(i=0;i<10;i++,yy++)printf("%s\t%5d%5d%5d%5.1f\n",yy->name,yy->math,yy->englist,yy->chinese,yy->avg);fclose(fp);}student用來(lái)在鍵盤上讀入,ss用來(lái)在文件中讀入以寫入的形式打開二進(jìn)制文件aa.dat一次性寫入十個(gè)數(shù)據(jù)以讀入的形式打開二進(jìn)制文件aa.dat一次性讀入十個(gè)數(shù)據(jù)第7頁(yè)/共17頁(yè)3.feof()函數(shù)功能是檢測(cè)文件是否到文件尾,若是文件尾,則其值為真,若不是文件尾,則其值為假。調(diào)用的一般形式:feof(文件指針)【例8-4】打開例8-2中建立的文件aa.txt,輸入姓名,在aa.txt文件中查找該學(xué)生,找到以后輸出該學(xué)生的所有數(shù)據(jù),如果文件中沒有輸入的姓名,給出相應(yīng)的提示信息。分析:(1)要打開文件aa.txt(2)輸入要查找的姓名(3)讀一條記錄,檢查此記錄中的姓名是否與要查找的姓名一致,若一致,則輸出此記錄。(4)如果不是文件尾,則一直重復(fù)(3)(5)如果記錄全查遍,無(wú)此記錄,則輸出相應(yīng)信息。第8頁(yè)/共17頁(yè)#include"stdio.h"#include"process.h"#include"string.h"structstu{charname[10];intmath,english,chinese;floatavg;}main(){stustudent[10],*pp,ss[10],*yy;charnn[10];FILE*fp;inti;i=0;fp=fopen("aa.txt","r");printf("請(qǐng)輸入要查找的姓名:");gets(nn);while(!feof(fp)){fscanf(fp,"%s%d%d%d%f",student[i].name,&student[i].math,&student[i].english,&student[i].chinese,&student[i].avg);if(strcmp(nn,student[i].name)==0){printf("%s%d%d%d%.1f\n",student[i].name,student[i].math,student[i].english,student[i].chinese,student[i].avg);break;}i++;}if(i>=10)printf("對(duì)不起,查無(wú)此人!\n");fclose(fp);}第9頁(yè)/共17頁(yè)任務(wù)2將學(xué)生成績(jī)隨機(jī)讀寫到文件中一、問題情景從鍵盤中輸入一個(gè)班40個(gè)學(xué)生的姓名及數(shù)學(xué)、英語(yǔ)、語(yǔ)文三門課的成績(jī),計(jì)算每個(gè)同學(xué)的平均分,然后將此40個(gè)同學(xué)的姓名、三門課的成績(jī)及平均分寫入到文本文件aa.txt中;再?gòu)奈募凶x取第2,4,6,8,10個(gè)學(xué)生的數(shù)據(jù)并輸出在顯示器上。分析:例8-2、例8-3中的文件讀入和寫入都是順序讀寫,而本任務(wù)中的問題是要求隨機(jī)讀寫,即按要求進(jìn)行讀寫。換句話說(shuō),就是人為的控制當(dāng)前文件指針的移動(dòng),讓文件指針隨意指向我們想要指向的位置,而不是像以往那樣按物理順序逐個(gè)移動(dòng),這就是所謂對(duì)文件的定位與隨機(jī)讀寫。第10頁(yè)/共17頁(yè)二、具體實(shí)現(xiàn)(為了程序運(yùn)行方便,所以假設(shè)只有10個(gè)學(xué)生)#include"stdio.h"#include"process.h"structstu{charname[10];intmath,englist,chinese;floatavg;}main(){stustudent[10],*pp,ss[10],*yy;FILE*fp;inti;pp=student;if((fp=fopen("aa.txt","wb+"))==NULL){printf("打不開文件\n");exit(1);}printf("請(qǐng)輸入十個(gè)學(xué)生的數(shù)據(jù)\n");for(i=0;i<10;i++,pp++){scanf("%s%d%d%d",pp->name,&pp->math,&pp->englist,&pp->chinese);pp->avg=(pp->math+pp->englist+pp->chinese)/3.0;}pp=student;fwrite(pp,sizeof(structstu),10,fp);yy=ss;rewind(fp);//定位到文件頭for(i=1;i<10;i=i+2){fseek(fp,i*sizeof(structstu),0);

fread(yy,sizeof(structstu),1,fp);printf("%s\t%5d%5d%5d%5.1f\n",yy->name,yy->math,yy->englist,yy->chinese,yy->avg);}}知識(shí)點(diǎn)是:

1、文件的定位;

2、文件的隨機(jī)讀寫;第11頁(yè)/共17頁(yè)三、相關(guān)知識(shí)所謂隨機(jī)讀寫,是指讀完上一個(gè)字符(字節(jié))后,并不一定要讀寫其后續(xù)的字符(字節(jié)),而可以讀寫文件中任意位置上所需要的字符(字節(jié))。指針指向文件開頭的函數(shù)(rewind()函數(shù))調(diào)用的形式:rewind(文件指針)功能:將文件指針重新移動(dòng)到文件開頭的位置2.fseek()函數(shù)fseek(文件指針,位移量,起始點(diǎn));功能:用來(lái)移動(dòng)文件內(nèi)部位置指針位移量,可以為正數(shù)也可以為負(fù)數(shù),如果為正數(shù),指針向地址高的方向移動(dòng),如果為負(fù)數(shù),指針向地址低的方向移動(dòng),若位移量為常數(shù),要求加后綴L;起始點(diǎn)必須是0,1,2中的一個(gè),分別代表以下三個(gè)符號(hào)常量起始點(diǎn)表示符號(hào)含義

0SEEK_SET文件開始

1SEEK_CUR當(dāng)前文件指針位置

2SEEK_END文件末尾fseek()函數(shù)一般用于二進(jìn)制文件,因?yàn)槲谋疚募l(fā)生字符轉(zhuǎn)換,計(jì)算位置時(shí)往往會(huì)發(fā)生混亂。fseek(fp,100L,0);其意義是把位置指針移到離文件首100個(gè)字節(jié)處。fseek(fp,20L,1);將位置指針移到離當(dāng)前位置20個(gè)字節(jié)的位置(向地址高的方向移動(dòng))。fseek(fp,-20L,1);將位置指針移到離當(dāng)前位置20個(gè)字節(jié)的位置(向地址低的方向移動(dòng))。fseek(fp,-30L,2);將位置指針移到距離文件末尾30個(gè)字節(jié)的位置。第12頁(yè)/共17頁(yè)【例8-5】有5個(gè)學(xué)生,每個(gè)學(xué)生有3門課的成績(jī),從鍵盤上分別輸入每個(gè)學(xué)生的學(xué)號(hào)、姓名、和3門課的成績(jī),保存到一個(gè)名為ddd.dat的二進(jìn)制文件中去,然后在ddd.dat文件中讀出第三個(gè)學(xué)生的數(shù)據(jù)。分析:編寫此題的思路是:(1)需要定義一個(gè)結(jié)構(gòu)體數(shù)組,用于存放5個(gè)同學(xué)的姓名、三門課的成績(jī);(2)在鍵盤上讀入5個(gè)同學(xué)的姓名、三門課的成績(jī)5;(3)以讀寫的形式打開二制文件ddd.dat,將5個(gè)同學(xué)的姓名、三門課的成績(jī)寫入到文件中;(4)將ddd.dat文件位置指針移到文件首,然后移動(dòng)文件位置指針,將它定位在第三條記錄上,將數(shù)據(jù)讀入并顯示在顯示器上;(5)關(guān)閉文件;程序如下:#include"stdio.h"#include“process.h”/*有exit()函數(shù),所有用此庫(kù)函數(shù)*/#defineN5structstu{charname[10];intmath,englist,chinese;}main(){stustudent[N],*pp;FILE*fp;inti;pp=student;if((fp=fopen("ddd.dat","wb+"))==NULL){printf("打不開文件\n");exit(1);}printf("請(qǐng)輸入%d個(gè)學(xué)生的數(shù)據(jù)\n",N);for(i=0;i<N;i++,pp++)scanf("%s%d%d%d",pp->name,&pp->math,&pp->englist,&pp->chinese);pp=student;fwrite(pp,sizeof(structstu),5,fp);rewind(fp);

fseek(fp,2*sizeof(structstu),0);

fread(pp,sizeof(structstu),1,fp);printf("輸出的第三個(gè)同學(xué)的信息為:\n");printf("%s%d%d%d\n",pp->name,pp->math,pp->englist,pp->chinese);fclose(fp);}以讀寫的形式打開文件將文件位置指針移動(dòng)文件首

從文件頭開始,移動(dòng)文件位置指針到第三位第13頁(yè)/共17頁(yè)任務(wù)3舉一反三【例8-6】從鍵盤上輸入10個(gè)整數(shù),分別以文本文件和二進(jìn)制文件方式存入磁盤。分析:要打開二個(gè)文件,一個(gè)文件以文本文件方式存入磁盤,另一個(gè)文件以二進(jìn)制方式存入磁盤,分別用fprintf()函數(shù)和fwrite()函數(shù)寫入程序如下:#include"stdio.h"#defineN10main(){intx[10],i,y[10];FILE*fp1,*fp2;fp1=fopen("d

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論