




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目十學(xué)生信息的讀取與保存-文件1【項(xiàng)目要求】從文件a.txt讀取某班的期末考試成績(jī),按總分排序后寫(xiě)入另外一個(gè)文件b.txt。
在上一章實(shí)現(xiàn)的項(xiàng)目中發(fā)現(xiàn),每次運(yùn)行程序都要輸入大量的數(shù)據(jù),如果用我們以前學(xué)過(guò)的輸入的方法就很不方便,最常用的方法就是預(yù)先將這些數(shù)據(jù)寫(xiě)到一個(gè)文件里,再將這個(gè)文件存放在磁盤(pán)上,需要時(shí)再將數(shù)據(jù)從該文件中讀取。為實(shí)現(xiàn)本項(xiàng)目需要經(jīng)過(guò)打開(kāi)文件、從文件進(jìn)行數(shù)據(jù)的讀/寫(xiě)、關(guān)閉文件指針三步。
【項(xiàng)目分析】2問(wèn)題情境及實(shí)現(xiàn)
#include<stdio.h>#defineN100typedef
structstudent{charnum[11];charname[9];intscore[3];floatavr;}STU;voidfsort(STU
s[],intn)//對(duì)結(jié)構(gòu)體數(shù)組中的n個(gè)數(shù)據(jù)進(jìn)行簡(jiǎn)單選擇排序{
int
i,j,k; STUt;
for(i=0;i<n-1;i++) {k=i;
for(j=i+1;j<n;j++)
if(s[k].avr<s[j].avr)k=j;
if(i!=k){t=s[i];s[i]=s[k];s[k]=t;}}}3問(wèn)題情境及實(shí)現(xiàn)
voidmain(){FILE*fp1,*fp2;STUs[N];int
i,n,j,sum;if((fp1=fopen("f:\\cresource\\10w2.txt","r"))==NULL){
printf("找不到該文件\n");/*如果打不開(kāi)文件則給出相應(yīng)的提示*/
getch();exit(0);}i=0;while(!feof(fp1))/*從文件中讀取有關(guān)數(shù)據(jù),一直讀到文件末尾*/{ fscanf(fp1,"%s%s",s[i].num,s[i].name);
sum=0;
for(j=0;j<3;j++) { fscanf(fp1,"%d",&s[i].score[j]); sum+=s[i].score[j]; }
s[i].avr=sum/3.0;/*同時(shí)求出平均分*/ i++;}4問(wèn)題情境及實(shí)現(xiàn)
fclose(fp1);/*關(guān)閉文件*/n=i;for(i=0;i<n;i++){
printf("\n第%d個(gè)學(xué)生的信息:%s%s",i+1,s[i].num,s[i].name);
for(j=0;j<3;j++)
printf("%d",s[i].score[j]);}fsort(s,n);fp2=fopen("f:\\cresource\\10w2_2.txt","w");/*打開(kāi)文件進(jìn)行保存數(shù)據(jù)*/for(i=0;i<n;i++){ fprintf(fp2,"%s%s",s[i].num,s[i].name);
for(j=0;j<3;j++) fprintf(fp2,"%d",s[i].score[j]); fprintf(fp2,"%f",s[i].avr); fprintf(fp2,"\n");/*寫(xiě)完一個(gè)學(xué)生的信息換行*/}fclose(fp2);}566相關(guān)知識(shí)2.文件的打開(kāi)與關(guān)閉本講小結(jié)1.文件概述3.文件的讀寫(xiě)操作重點(diǎn):文件的打開(kāi)與關(guān)閉文件的讀寫(xiě)操作4.文件應(yīng)用舉例1文件概述(1)1.1使用文件的目的①程序與數(shù)據(jù)分離:
數(shù)據(jù)文件的改動(dòng)不引起程序的改動(dòng);②數(shù)據(jù)共享:
不同程序可以訪問(wèn)同一數(shù)據(jù)文件中的數(shù)據(jù);③能長(zhǎng)期保存程序運(yùn)行的中間數(shù)據(jù)或結(jié)果數(shù)據(jù)。71文件概述(2)1.2文件的分類(lèi)按文件的邏輯結(jié)構(gòu):記錄文件:由具有一定結(jié)構(gòu)的記錄組成(定長(zhǎng)和不定長(zhǎng))流式文件:由一個(gè)個(gè)字符(字節(jié))數(shù)據(jù)順序組成按存儲(chǔ)介質(zhì):普通文件:存儲(chǔ)介質(zhì)文件(磁盤(pán)、磁帶等)設(shè)備文件:非存儲(chǔ)介質(zhì)(鍵盤(pán)、顯示器、打印機(jī)等)81文件概述(3)1.2文件的分類(lèi)(續(xù))按數(shù)據(jù)的組織形式:文本文件:ASCII文件,每個(gè)字節(jié)存放一個(gè)字符的ASCII碼二進(jìn)制文件:數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣存放9存儲(chǔ)為二進(jìn)制文件形式:00010000001001111文件概述(4)1.2文件的分類(lèi)—文本文件和二進(jìn)制文件0010011100010000存儲(chǔ)為文本文件形式:0011000000110000001100000011000000110001如:int型數(shù)10000內(nèi)存存儲(chǔ)形式文本文件特點(diǎn):存儲(chǔ)量大、速度慢、便于對(duì)字符操作二進(jìn)制文件特點(diǎn):存儲(chǔ)量小、速度快、便于存放中間結(jié)果101文件概述(5)1.3文件處理的方法緩沖文件系統(tǒng):高級(jí)文件系統(tǒng),系統(tǒng)自動(dòng)為正在使用的文件開(kāi)辟內(nèi)存緩沖區(qū),利用緩沖區(qū)完成文件讀寫(xiě)操作。非緩沖文件系統(tǒng):低級(jí)文件系統(tǒng),由用戶在程序中為每個(gè)文件設(shè)定緩沖區(qū)111文件概述(6)1.3文件處理的方法—緩沖文件系統(tǒng)輸出文件緩沖區(qū)輸入文件緩沖區(qū)程序數(shù)據(jù)區(qū)緩沖文件系統(tǒng):磁盤(pán)文件寫(xiě)入文件讀取文件121文件概述(7)1.3文件處理的方法—非緩沖文件系統(tǒng)程序緩沖區(qū)指令區(qū)用戶數(shù)據(jù)區(qū)非緩沖文件系統(tǒng):磁盤(pán)文件讀寫(xiě)文件131文件概述(8)1.4文件類(lèi)型指針—文件結(jié)構(gòu)體typedef
struct{shortlevel;/*fill/emptylevelofbuffer*/unsignedflags;/*Filestatusflags*/charfd;/*Filedescriptor*/unsignedcharhold;/*Ungetccharifnobuffer*/shortbsize;/*Buffersize*/unsignedchar*buffer;/*Datatransferbuffer*/unsignedchar*curp;/*Currentactivepointer*/unsignedistemp;/*Temporaryfileindicator*/shorttoken;/*Usedforvaliditychecking*/}FILE;
教材P294有VC6.0下的結(jié)構(gòu)定義141文件概述(9)1.4文件類(lèi)型指針FILE*fp;文件打開(kāi)時(shí),系統(tǒng)自動(dòng)建立文件結(jié)構(gòu)體,并把指向它的指針?lè)祷貋?lái),程序通過(guò)這個(gè)指針獲得文件信息,訪問(wèn)文件;文件關(guān)閉后,它的文件結(jié)構(gòu)體被釋放。返回主菜單文件使用方式:打開(kāi)文件-->文件讀/寫(xiě)-->關(guān)閉文件152文件的打開(kāi)與關(guān)閉(1)2.1打開(kāi)文件函數(shù)原型:FILE*fopen(char*name,char*mode)stdio.h要打開(kāi)的文件名使用文件方式返回值:正常打開(kāi),返回指向文件結(jié)構(gòu)體的指針;打開(kāi)失敗,為NULLP295頁(yè)162文件的打開(kāi)與關(guān)閉(2)2.1打開(kāi)文件課堂練習(xí):①打開(kāi)當(dāng)前文件夾下的namelist.txt文件,打開(kāi)方式為追加②打開(kāi)d盤(pán)test文件夾下的namelist.txt文件,如果該文件不存在,就創(chuàng)建該文件,然后增加文件內(nèi)容課堂練習(xí)編寫(xiě)172文件的打開(kāi)與關(guān)閉(3)2.2關(guān)閉文件函數(shù)原型:
int
fclose(FILE*fp)文件打開(kāi)時(shí)返回的文件類(lèi)型指針?lè)祷刂担赫jP(guān)閉為0;
出錯(cuò)時(shí),非0課堂練習(xí):關(guān)閉前面課堂練習(xí)中打開(kāi)的文件返回主菜單183文件的讀寫(xiě)(1)3.1文件的順序讀寫(xiě)—文件字符輸入/輸出函數(shù)函數(shù)原型:int
fputc(intc,FILE*fp)功能:把一字節(jié)代碼c寫(xiě)入fp指向的文件中返值:正常,返回c;出錯(cuò),為EOF函數(shù)原型:int
fgetc(FILE*fp)功能:從fp指向的文件中讀取一字節(jié)代碼返值:正常,返回讀到的代碼值;
讀到文件尾(EOF)或出錯(cuò)(NULL)為止193文件的讀寫(xiě)(1)3.1文件的順序讀寫(xiě)—文件字符輸入/輸出函數(shù)例1:從鍵盤(pán)輸入若干字符,逐個(gè)將它們寫(xiě)入文件”file.txt”中,直到輸入一個(gè)”*”為止。例1編寫(xiě)考慮如何編程完成將一個(gè)磁盤(pán)文件203文件的讀寫(xiě)(2)3.1文件的順序讀寫(xiě)—文件字符串輸入/輸出函數(shù)函數(shù)原型:int
fputs(char*string,FILE*fp);
功能:把字符串寫(xiě)入fp指向的文件中返值:正常,返回0;出錯(cuò),為EOF函數(shù)原型:char*fgets(char*s,intn,FILE*fp);
功能:從fp指向的文件中讀取長(zhǎng)度不超過(guò)n-1個(gè)字符返值:正常,返回讀到字符串的首地址;
讀到文件尾(EOF)或出錯(cuò)(NULL)為止P300頁(yè)例11.2213文件的讀寫(xiě)(3)3.1文件的順序讀寫(xiě)—文件的格式化輸入/輸出函數(shù)int
fprintf(FILE*fp,constchar*format[,argument,…])int
fscanf(FILE*fp,constchar*format[,address,…])功能:按格式對(duì)文件進(jìn)行I/O操作返值:成功,返回I/O的個(gè)數(shù);出錯(cuò)或文件尾,返回EOF223文件的讀寫(xiě)(4)3.1文件的順序讀寫(xiě)—文件的格式化輸入/輸出函數(shù)例3:有如下的學(xué)生結(jié)構(gòu)定義,從鍵盤(pán)輸入4個(gè)學(xué)生的信息,保存到文件name-list.txt文件中struct
student_type{charname[10];
intnum;
intage;charaddr[15];}例3編寫(xiě)233文件的讀寫(xiě)(5)3.1文件的順序讀寫(xiě)—文件的數(shù)據(jù)塊輸入/輸出函數(shù)實(shí)現(xiàn)文件操作一次讀取一組數(shù)據(jù)size_tfread(void*buffer,size_tsize,size_tcount,FILE*fp)size_tfwrite(void*buffer,size_tsize,size_tcount,FILE*fp)指向要輸入/輸出數(shù)據(jù)塊的首地址的指針每個(gè)要讀/寫(xiě)的數(shù)據(jù)塊的大小(字節(jié)數(shù))要讀/寫(xiě)的數(shù)據(jù)塊的個(gè)數(shù)要讀/寫(xiě)的文件指針?lè)抵担撼晒Γ祷刈x/寫(xiě)的塊數(shù);出錯(cuò)或文件尾,返回0P304頁(yè)例11.4243文件的讀寫(xiě)(6)2文件的隨機(jī)讀寫(xiě)操作—rewind函數(shù)將文件的指針指向用戶指定的位置,進(jìn)行文件操作rewind函數(shù)函數(shù)原型:voidrewind(FILE*fp)功能:重置文件位置指針到文件開(kāi)頭返值:無(wú)253文件的讀寫(xiě)(7)2文件的隨機(jī)讀寫(xiě)操作—rewind函數(shù)例4:分析下面程序的功能#include<stdio.h>main(){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);}從文件中第一次將它內(nèi)容顯示在屏幕中,第二次讀取將其復(fù)制到另一個(gè)文件中263文件的讀寫(xiě)(7)2文件的隨機(jī)讀寫(xiě)操作—fseek函數(shù)fseek函數(shù)函數(shù)原型:
int
fseek(FILE*fp,longoffset,intwhence)功能:改變文件位置指針的位置返值:成功,返回0;失敗,返回非0值273文件的讀寫(xiě)(8)2文件的隨機(jī)讀寫(xiě)操作—fseek函數(shù)例5:分析下面程序的功能#include"stdio.h"
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- DB31/T 1191-2019綠化土壤肥力質(zhì)量綜合評(píng)價(jià)方法
- DB31/T 1126-2019紅色旅游基地服務(wù)質(zhì)量要求
- DB31/T 1051-2017金瓜生產(chǎn)技術(shù)規(guī)范
- DB31/ 527-2011醫(yī)用電子加速器治療機(jī)房衛(wèi)生防護(hù)與檢測(cè)評(píng)價(jià)規(guī)范
- DB31/ 329.19-2014重點(diǎn)單位重要部位安全技術(shù)防范系統(tǒng)要求第19部分:寄遞單位
- CAB 1029-2014洗車(chē)及花園用自動(dòng)伸縮膨脹軟管
- 生物質(zhì)燃?xì)獾哪茉崔D(zhuǎn)化技術(shù)研究成果評(píng)估報(bào)告考核試卷
- 2025年現(xiàn)代測(cè)試框架的試題及答案
- 網(wǎng)絡(luò)游戲中的防沉迷與安全游戲考核試卷
- 2024年硝基咪唑類(lèi)藥物資金申請(qǐng)報(bào)告代可行性研究報(bào)告
- 游泳館會(huì)員合同協(xié)議書(shū)
- 鐵磁材料漏磁信號(hào)高效計(jì)算與缺陷精準(zhǔn)反演的關(guān)鍵技術(shù)探索
- 產(chǎn)業(yè)園 可行性研究報(bào)告
- 星河季度工作總結(jié)
- 海外不動(dòng)產(chǎn)買(mǎi)賣(mài)中介合同范本
- DB44-T 2605-2025 生活垃圾焚燒發(fā)電設(shè)施能源消耗計(jì)算與限額
- 2025江蘇中考:化學(xué)必背知識(shí)點(diǎn)
- 2024-2025學(xué)年度廣東省廣州市南沙區(qū)中考英語(yǔ)一模試卷(含解析)
- 高標(biāo)準(zhǔn)農(nóng)田項(xiàng)目規(guī)劃設(shè)計(jì)方案
- 混凝土預(yù)制構(gòu)件項(xiàng)目可行性研究報(bào)告
- 2025年公牛插座市場(chǎng)調(diào)研報(bào)告
評(píng)論
0/150
提交評(píng)論