




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第13章文件操作1精選課件ppt第13章文件操作1精選課件ppt內(nèi)容提要
二進(jìn)制文件和文本文件
文件的打開和關(guān)閉文件的順序讀寫與隨機(jī)讀寫2精選課件ppt內(nèi)容提要二進(jìn)制文件和文本文件2精選課件pptVonJ.Neumannarchitecture輸入/輸出設(shè)備存儲器運(yùn)算器控制器程序和輸入數(shù)據(jù)輸出結(jié)果取出數(shù)據(jù)存入數(shù)據(jù)操作命令存取命令取出程序指令輸入輸出命令計算結(jié)果CPU大腦記憶裝置(Memory)眼睛和耳朵(I/Odevices)Wheretoputdataincomputer?
Howtoinputoroutputdata?
3精選課件pptVonJ.Neumannarchitecture存儲器I/O設(shè)備輸入設(shè)備鍵盤、鼠標(biāo)軟盤、硬盤、光驅(qū)(以文件的形式)掃描儀、視頻采集卡、電視卡、游戲桿、話筒……輸出設(shè)備顯示器、打印機(jī)軟盤、硬盤、CD/DVD-RW(以文件的形式)音箱……4精選課件pptI/O設(shè)備輸入設(shè)備4精選課件ppt內(nèi)存:程序運(yùn)行時申請,程序結(jié)束時釋放,無法保存數(shù)據(jù),數(shù)據(jù)會隨著程序的結(jié)束而丟失。#include<stdio.h>structstudent{ intnum; charname[10]; floatscore[3];};voidmain(){structstudentstu[3];inti;printf("請輸入學(xué)生信息\n");for(i=0;i<3;i++)scanf("%d%s%f%f%f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);for(i=0;i<3;i++)printf("%d%s%.2f%.2f%.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]); }5精選課件ppt內(nèi)存:程序運(yùn)行時申請,程序結(jié)束時釋放,無法保存數(shù)據(jù),數(shù)據(jù)會隨如何在程序結(jié)束后依然保留數(shù)據(jù)?
以文件的形式放在外存上文件:存儲在外存上有名字的一組相關(guān)數(shù)據(jù)的集合6精選課件ppt如何在程序結(jié)束后依然保留數(shù)據(jù)?以文件的形式放在外存上文件:存文件的存放(Storage)可以建立若干文件目錄(directory\folder文件夾)在目錄里保存文件同一級目錄里保存的文件不能同名對使用者而言,只要知道文件的路徑(path,全目錄)和文件名,就能使用該文件C:\home\Sunner\main.c這都是托OS的福7精選課件ppt文件的存放(Storage)可以建立若干文件目錄(direc13.1二進(jìn)制文件和文本文件
二進(jìn)制文件是一種字節(jié)序列,沒有字符變換按照數(shù)據(jù)在內(nèi)存中的存儲形式(二進(jìn)制)存儲到文件如短整數(shù)123,在內(nèi)存占2個字節(jié),則文件中也占2個字節(jié)文本文件/ASCII碼文件是一種字符序列,文件中存儲每個字符的ASCII碼如整數(shù)123在文件中占3個字節(jié),分別存放這3個字符的ASCII碼如果存整數(shù)1234呢?8精選課件ppt13.1二進(jìn)制文件和文本文件二進(jìn)制文件如果存整數(shù)1234呢ASCII文件和二進(jìn)制文件的比較:ASCII文件便于對字符進(jìn)行逐個處理,也便于輸出字符。但一般占存儲空間較多,而且要花費轉(zhuǎn)換時間。二進(jìn)制文件可以節(jié)省外存空間和轉(zhuǎn)換時間,但一個字節(jié)并不對應(yīng)一個字符,不能直接輸出字符形式。一般中間結(jié)果數(shù)據(jù)需要暫時保存在外存上,以后又需要輸入內(nèi)存的,常用二進(jìn)制文件保存。9精選課件pptASCII文件和二進(jìn)制文件的比較:9精選課件ppt文件的格式(FormatofFiles)數(shù)據(jù)必須按照存入的類型讀出,才能恢復(fù)其本來面貌公開的標(biāo)準(zhǔn)格式如bmp、tif、gif、jpg和mp3等類型的文件,有大量軟件能生成和使用這些類型的文件不公開或加密的文件格式如MicrosoftWord的doc格式就不公開,所以至今沒有Word以外的其它軟件能完美地讀出doc文件
10精選課件ppt文件的格式(FormatofFiles)數(shù)據(jù)必須按照存入所有有關(guān)文件的操作都離不開文件指針用文件指針代表一個文件,對文件的操作都是通過相應(yīng)文件的文件指針來完成文件指針是C為我們提供的一種文件類型的指針變量,它的具體定義方法是
FILE*fp;有了這樣的定義之后,fp就可以指向一個文件11精選課件ppt所有有關(guān)文件的操作都離不開文件指針11精選課件ppt文件指針()#include<stdio.h>FILE
*fp;typedef
struct{
shortlevel;/*緩沖區(qū)‘滿’或‘空’的程度*/
unsignedflags;/*文件狀態(tài)標(biāo)志*/
charfd;/*文件描述符*/
unsignedcharhold;/*如無緩沖區(qū)不讀字符*/
shortbsize;/*緩沖區(qū)的大小*/
unsignedchar*buffer;/*數(shù)據(jù)緩沖區(qū)的位置*/
unsignedchar*curp;/*指針當(dāng)前的指向*/
unsignedistemp;/*臨時文件指示器*/
shorttoken;/*用于有效性檢查*/}FILE;/*在stdio.h文件中定義*/對文件的操作都是通過各種函數(shù)來實現(xiàn)的12精選課件ppt文件指針()#include<stdio.h>typede13.2文件的打開和關(guān)閉文件的打開(fopen()函數(shù))FILE*fopen(const
char*,const
char*mode);FILE*fp=fopen("C:\\CONFIG.SYS","rw");是文件名包含路徑。如果不含路徑,表示打開當(dāng)前目錄下的文件mode是打開方式常用為"r"、"w"、"rw"和"a",分別表示只讀、只寫、讀寫和添加"rb"表示只讀二進(jìn)制文件返回值為指向此文件的指針,留待以后使用如果打開失敗,返回值為NULL13精選課件ppt13.2文件的打開和關(guān)閉文件的打開(fopen()函數(shù))13文件打開方式(mode):對應(yīng)二進(jìn)制文件對應(yīng)文本文件“r”
只讀必須是已存在的文件?!皐”
只寫不論該文件是否存在,都新建一個文件?!癮”
追加向文本文件尾增加數(shù)據(jù),該文件必須存在“r+”
讀寫打開一個已存在的文件,用于讀寫?!皐+”讀寫建立一個新文件,可讀可寫?!癮+”
讀寫向文件尾追加數(shù)據(jù),也可讀?!皉b”
“wb”“ab”“rb+”“wb+”“ab+”14精選課件ppt文件打開方式(mode):對應(yīng)二進(jìn)制文件對應(yīng)文本文件“r”13.2文件的打開和關(guān)閉文件的關(guān)閉(fclose()函數(shù))intfclose(FILE*fp);使文件指針變量和文件脫鉤,釋放文件所占的緩沖區(qū)fclose函數(shù)的返回值當(dāng)順利地執(zhí)行了關(guān)閉操作,返回值為0;如果返回值為非零值,表示關(guān)閉時有錯誤。一般只有驅(qū)動器中無盤或盤空間不夠時才失敗,關(guān)閉失敗會引起數(shù)據(jù)丟失、文件的破壞和程序中的隨機(jī)錯誤。15精選課件ppt13.2文件的打開和關(guān)閉文件的關(guān)閉(fclose()函數(shù))1例:文件的打開和關(guān)閉#include<stdio.h>voidmain(){ FILE*fp; if((fp=fopen("test.txt","r"))==NULL) { printf("Failuretoopendemo.txt!\n"); exit(0); } fclose(fp);}16精選課件ppt例:文件的打開和關(guān)閉16精選課件ppt13.3按字符讀寫文件字符讀寫intfgetc(FILE*fp);從fp讀出一個字符,將位置指針指向下一個字符若讀成功,則返回該字符,若讀到文件尾,則返回EOF(EOF是一個符號常量,在stdio.h中定義為-1)intfputc(intc,FILE*fp);向fp輸出字符c若寫入錯誤,則返回EOF,否則返回c17精選課件ppt13.3按字符讀寫文件字符讀寫17精選課件ppt13.3按字符讀寫文件【例13.1】從鍵盤鍵入一串字符,轉(zhuǎn)存到磁盤文件上為什么要判斷文件打開是否成功呢?#include<stdio.h>#include<stdlib.h>voidmain(){ FILE*fp; charch; if((fp=fopen("demo.txt","w"))==NULL) { printf("Failuretoopendemo.txt!\n"); exit(0); } ch=getchar(); while(ch!='\n') { fputc(ch,fp); ch=getchar(); } fclose(fp);}18精選課件ppt13.3按字符讀寫文件【例13.1】從鍵盤鍵入一串字符,轉(zhuǎn)#include<stdio.h>#include<stdlib.h>voidmain(){ FILE*fp; charch; inti; if((fp=fopen("demo.bin","wb"))==NULL) { printf("Failuretoopendemo.bin!\n"); exit(0); } for(i=0;i<128;i++) fputc(i,fp); fclose(fp); if((fp=fopen("demo.bin","rb"))==NULL) {printf("Failuretoopendemo.bin!\n"); exit(0); } while((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp);}【例13.2】將0~127之間的ASCII字符寫到文件中,然后從文件中讀出并顯示到屏幕上函數(shù)feof()檢查是否到達(dá)文件尾,當(dāng)文件位置指針指向文件尾時,返回非0值,否則返回0值19精選課件ppt#include<stdio.h>【例13.2】將0~【例13.3】修改例13.2,從文件中讀出字符時,判斷是否為可打印字符,若是則顯示該字符,否則顯示其十進(jìn)制ASCII碼值while((ch=fgetc(fp))!=EOF)if(isprint(ch)) printf("%c\t",ch);else printf("%d\t",ch);20精選課件ppt【例13.3】修改例13.2,從文件中讀出字符時,判斷是例:復(fù)制文件#include<stdlib.h>#include<stdio.h>voidmain(){ FILE*in,*out; charin],out]; printf("Enterthein:\n"); scanf("%s",infile); printf("Entertheout:\n"); scanf("%s",outfile); if((in=fopen(infile,"rb"))==NULL) { printf("cannotopeninfile\n"); exit(0); } if((out=fopen(outfile,"wb"))==NULL) { printf("cannotopenoutfile\n"); exit(0); } while(!feof(in)) fputc(fgetc(in),out); fclose(in); fclose(out);}21精選課件ppt例:復(fù)制文件#include<stdlib.h>21精選課例:復(fù)制文件,利用命令行參數(shù)輸入兩個文件名#include<stdlib.h>#include<stdio.h>main(intargc,char*argv[]){ FILE*in,*out; if(argc!=3) { printf("Youforgottoentera\n"); exit(0); } if((in=fopen(argv[1],"rb"))==NULL) { printf("cannotopeninfile\n"); exit(0); } if((out=fopen(argv[2],"wb"))==NULL) { printf("cannotopenoutfile\n"); exit(0); } while(!feof(in)) fputc(fgetc(in),out); fclose(in); fclose(out);}22精選課件ppt例:復(fù)制文件,利用命令行參數(shù)輸入兩個文件名#include13.5按數(shù)據(jù)塊讀寫文件按數(shù)據(jù)塊讀寫從fp所指的文件中讀取數(shù)據(jù)塊并存儲到buffer指向的內(nèi)存中buffer是待讀入數(shù)塊據(jù)的起始地址size是每個數(shù)據(jù)塊的大小(待讀入的每個數(shù)據(jù)塊的字節(jié)數(shù))count是最多允許讀取的數(shù)據(jù)塊個數(shù)(每個數(shù)據(jù)塊size個字節(jié))返回實際讀到的數(shù)據(jù)塊個數(shù)將buffer指向的內(nèi)存中的數(shù)據(jù)塊寫入fp所指的文件23精選課件ppt13.5按數(shù)據(jù)塊讀寫文件按數(shù)據(jù)塊讀寫23精選課件ppt使用舉例:若文件以二進(jìn)制形式打開:
fread(f,4,2,fp);
此函數(shù)從fp所指向的文件中讀入2個4個字節(jié)的數(shù)據(jù),存儲到指針f所指向的空間中。24精選課件ppt使用舉例:24精選課件ppt使用舉例:若有如下結(jié)構(gòu)類型:structstudent_type{charname[10];intnum;intage;charaddr[30];}stud[40];可以用fread和fwrite來進(jìn)行數(shù)據(jù)的操作:for(i=0;i<40;i++)
fread(&stud[i],sizeof(structstudent_type),1,fp);
for(i=0;i<40,i++)fwrite(&stud[i],sizeof(structstudent_type),1,fp);
fread(stud,sizeof(structstudent_type),40,fp);fwrite(stud,sizeof(structstudent_type),40,fp);25精選課件ppt使用舉例:fread(stud,sizeof(struct例從鍵盤輸入4個學(xué)生的有關(guān)數(shù)據(jù),然后把它們轉(zhuǎn)存到磁盤文件上去。#include<stdio.h>#defineSIZE4typedefstructstudent_type{ charname[10]; intnum; intage; charaddr[15];}STUDENT;voidmain(){ voidsave(STUDENTstud[]); STUDENTstud[SIZE];inti;for(i=0;i<SIZE;i++)scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);save(stud);}26精選課件ppt例從鍵盤輸入4個學(xué)生的有關(guān)數(shù)據(jù),然后把它們轉(zhuǎn)存到磁盤文件上voidsave(STUDENTstud[]){ FILE*fp; inti; if((fp=fopen("stu_list","wb"))==NULL) { printf("cannotopenfile\n");return; } for(i=0;i<SIZE;i++) if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)!=1) printf("error\n"); fclose(fp);}27精選課件pptvoidsave(STUDENTstud[])27精選課例驗證上面程序生成的stu_list文件是否存在,從文件中讀出數(shù)據(jù)并顯示在屏幕上。#include<stdio.h>#defineSIZE4structstudent{ charname[10]; intnum; intage; charaddr[15];};voidmain(){ structstudentstud; inti; FILE*fp; if((fp=fopen("stu_list","rb"))==NULL) { printf("打開文件錯誤!\n");return; } for(i=0;i<SIZE;i++) { fread(&stud,sizeof(structstudent),1,fp); printf("%-10s%4d%4d%15s\n",,stud.num,stud.age,stud.addr); }fclose(fp);}28精選課件ppt例驗證上面程序生成的stu_list文件是否存在,從文件中
【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的平均分,將學(xué)生的各科成績及平均分輸出到文件student.txt中,然后再從文件中讀出數(shù)據(jù)并顯示到屏幕上29精選課件ppt【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的平均分,將學(xué)生的各科成績及平均分輸出到文件student.txt中,然后再從文件中讀出數(shù)據(jù)并顯示到屏幕上30精選課件ppt【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的平均分,將學(xué)生的各科成績及平均分輸出到文件student.txt中,然后再從文件中讀出數(shù)據(jù)并顯示到屏幕上31精選課件ppt【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的平均分,將學(xué)生的各科成績及平均分輸出到文件student.txt中,然后再從文件中讀出數(shù)據(jù)并顯示到屏幕上32精選課件ppt【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的平均分,將學(xué)生的各科成績及平均分輸出到文件student.txt中,然后再從文件中讀出數(shù)據(jù)并顯示到屏幕上33精選課件ppt【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的平均分,將學(xué)生的各科成績及平均分輸出到文件student.txt中,然后再從文件中讀出數(shù)據(jù)并顯示到屏幕上34精選課件ppt【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的13.3按字符讀寫文件字符串讀寫char*fgets(char*s,intn,FILE*fp);從fp所指的文件中讀取字符串并在字符串末尾添加'\0',然后存入s,最多讀n-1個字符當(dāng)讀到回車換行符、文件末尾或讀滿n-1個字符時函數(shù)返回該字符串的首地址intfputs(const
char*s,FILE*fp);將字符串寫入文件中若出現(xiàn)寫入錯誤,則返回EOF,否則返回一個非負(fù)數(shù)35精選課件ppt13.3按字符讀寫文件字符串讀寫35精選課件ppt13.4按格式讀寫文件格式化讀寫intfscanf(FILE*fp,const
char*format,...);fscanf(fp,"%d,%f",&i,&t);第1個參數(shù)為文件指針,第2個參數(shù)為格式控制參數(shù),第3個參數(shù)為地址參數(shù)表列intfprintf(FILE*fp,const
char*format,...);fprintf(fp,"%d,%6.2f",i,t);第1個參數(shù)為文件指針,第2個參數(shù)為格式控制參數(shù),第3個參數(shù)為輸出參數(shù)表列36精選課件ppt13.4按格式讀寫文件格式化讀寫36精選課件ppt文件讀寫函數(shù):分類函數(shù)名功能 打開文件fopen()打開文件關(guān)閉文件fclose()關(guān)閉文件文件讀寫fgetc()從指定文件取得一個字符
fputc()把字符輸出到指定文件
fgets()從指定文件讀取字符串
fputs()把字符串輸出到指定文件
fread()從指定文件中讀取數(shù)據(jù)項
fwrite()把數(shù)據(jù)項寫到指定文件中
fscanf()從指定文件按格式輸入數(shù)據(jù)
fprintf()按指定格式將數(shù)據(jù)寫到指定文件中37精選課件ppt文件讀寫函數(shù):分類函數(shù)名13.6擴(kuò)充內(nèi)容13.6.1文件的隨機(jī)讀寫fseek()
改變文件位置指針的位置rewind()
使文件位置指針重新置于文件開頭ftell()
返回文件位置指針的當(dāng)前值38精選課件ppt13.6擴(kuò)充內(nèi)容13.6.1文件的隨機(jī)讀寫fseek()rewind函數(shù):使位置指針重新返回文件的開頭,無返回值。
例有一個磁盤文件,第一次將它的內(nèi)容顯示在屏幕上,第二次把它復(fù)制到另一文件上。#include<stdio.h>voidmain(){ FILE*fp1,*fp2; fp1=fopen("","r"); fp2=fopen("","w"); while(!feof(fp1))putchar(fgetc(fp1)); rewind(fp1); while(!feof(fp1)) fputc(fgetc(fp1),fp2); fclose(fp1);fclose(fp2);}39精選課件pptrewind函數(shù):例有一個磁盤文件,第一次將它的內(nèi)容顯示在fseek函數(shù)函數(shù)功能:改變文件的位置指針。函數(shù)調(diào)用形式:fseek(文件類型指針,位移量,起始點)起始點:文件開頭SEEK_SET0
文件當(dāng)前位置SEEK_CUR1
文件末尾SEEK_END2位移量:以起始點為基點,向前移動的字節(jié)數(shù)。一般要求為long型。
40精選課件pptfseek函數(shù)40精選課件pptfseek函數(shù)應(yīng)用舉例fseek(fp,100L,0);將位置指針移到離文件頭100個字節(jié)處。fseek(fp,50L,1);將位置指針移到離當(dāng)前位置50個字節(jié)處。fseek(fp,-10L,2);將位置指針從文件末尾處向后退10個字節(jié)。
41精選課件pptfseek函數(shù)應(yīng)用舉例41精選課件ppt#include<stdlib.h>#include<stdio.h>structstudent_type{ charname[10]; intnum; intage; charsex;}stud;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,sizeof(structstudent_type),1,fp);
printf("%s%d%d%c\n",,stud.num,stud.age,stud.sex); } fclose(fp);}例在磁盤文件上存有10個學(xué)生的數(shù)據(jù)。要求將第1、3、5、7、9個學(xué)生數(shù)據(jù)輸入計算機(jī),并在屏幕上顯示出來。
42精選課件ppt#include<stdlib.h>例在磁盤文件上存有1ftell函數(shù)函數(shù)作用:得到流式文件中的當(dāng)前位置,用相對于文件開頭的位移量來表示。返回值:返回當(dāng)前位置,出錯時返回-1L。應(yīng)用舉例:i=ftell(fp);if(i==-1L)printf(“error\n”);
43精選課件ppt43精選課件ppt第13章文件操作44精選課件ppt第13章文件操作1精選課件ppt內(nèi)容提要
二進(jìn)制文件和文本文件
文件的打開和關(guān)閉文件的順序讀寫與隨機(jī)讀寫45精選課件ppt內(nèi)容提要二進(jìn)制文件和文本文件2精選課件pptVonJ.Neumannarchitecture輸入/輸出設(shè)備存儲器運(yùn)算器控制器程序和輸入數(shù)據(jù)輸出結(jié)果取出數(shù)據(jù)存入數(shù)據(jù)操作命令存取命令取出程序指令輸入輸出命令計算結(jié)果CPU大腦記憶裝置(Memory)眼睛和耳朵(I/Odevices)Wheretoputdataincomputer?
Howtoinputoroutputdata?
46精選課件pptVonJ.Neumannarchitecture存儲器I/O設(shè)備輸入設(shè)備鍵盤、鼠標(biāo)軟盤、硬盤、光驅(qū)(以文件的形式)掃描儀、視頻采集卡、電視卡、游戲桿、話筒……輸出設(shè)備顯示器、打印機(jī)軟盤、硬盤、CD/DVD-RW(以文件的形式)音箱……47精選課件pptI/O設(shè)備輸入設(shè)備4精選課件ppt內(nèi)存:程序運(yùn)行時申請,程序結(jié)束時釋放,無法保存數(shù)據(jù),數(shù)據(jù)會隨著程序的結(jié)束而丟失。#include<stdio.h>structstudent{ intnum; charname[10]; floatscore[3];};voidmain(){structstudentstu[3];inti;printf("請輸入學(xué)生信息\n");for(i=0;i<3;i++)scanf("%d%s%f%f%f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);for(i=0;i<3;i++)printf("%d%s%.2f%.2f%.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]); }48精選課件ppt內(nèi)存:程序運(yùn)行時申請,程序結(jié)束時釋放,無法保存數(shù)據(jù),數(shù)據(jù)會隨如何在程序結(jié)束后依然保留數(shù)據(jù)?
以文件的形式放在外存上文件:存儲在外存上有名字的一組相關(guān)數(shù)據(jù)的集合49精選課件ppt如何在程序結(jié)束后依然保留數(shù)據(jù)?以文件的形式放在外存上文件:存文件的存放(Storage)可以建立若干文件目錄(directory\folder文件夾)在目錄里保存文件同一級目錄里保存的文件不能同名對使用者而言,只要知道文件的路徑(path,全目錄)和文件名,就能使用該文件C:\home\Sunner\main.c這都是托OS的福50精選課件ppt文件的存放(Storage)可以建立若干文件目錄(direc13.1二進(jìn)制文件和文本文件
二進(jìn)制文件是一種字節(jié)序列,沒有字符變換按照數(shù)據(jù)在內(nèi)存中的存儲形式(二進(jìn)制)存儲到文件如短整數(shù)123,在內(nèi)存占2個字節(jié),則文件中也占2個字節(jié)文本文件/ASCII碼文件是一種字符序列,文件中存儲每個字符的ASCII碼如整數(shù)123在文件中占3個字節(jié),分別存放這3個字符的ASCII碼如果存整數(shù)1234呢?51精選課件ppt13.1二進(jìn)制文件和文本文件二進(jìn)制文件如果存整數(shù)1234呢ASCII文件和二進(jìn)制文件的比較:ASCII文件便于對字符進(jìn)行逐個處理,也便于輸出字符。但一般占存儲空間較多,而且要花費轉(zhuǎn)換時間。二進(jìn)制文件可以節(jié)省外存空間和轉(zhuǎn)換時間,但一個字節(jié)并不對應(yīng)一個字符,不能直接輸出字符形式。一般中間結(jié)果數(shù)據(jù)需要暫時保存在外存上,以后又需要輸入內(nèi)存的,常用二進(jìn)制文件保存。52精選課件pptASCII文件和二進(jìn)制文件的比較:9精選課件ppt文件的格式(FormatofFiles)數(shù)據(jù)必須按照存入的類型讀出,才能恢復(fù)其本來面貌公開的標(biāo)準(zhǔn)格式如bmp、tif、gif、jpg和mp3等類型的文件,有大量軟件能生成和使用這些類型的文件不公開或加密的文件格式如MicrosoftWord的doc格式就不公開,所以至今沒有Word以外的其它軟件能完美地讀出doc文件
53精選課件ppt文件的格式(FormatofFiles)數(shù)據(jù)必須按照存入所有有關(guān)文件的操作都離不開文件指針用文件指針代表一個文件,對文件的操作都是通過相應(yīng)文件的文件指針來完成文件指針是C為我們提供的一種文件類型的指針變量,它的具體定義方法是
FILE*fp;有了這樣的定義之后,fp就可以指向一個文件54精選課件ppt所有有關(guān)文件的操作都離不開文件指針11精選課件ppt文件指針()#include<stdio.h>FILE
*fp;typedef
struct{
shortlevel;/*緩沖區(qū)‘滿’或‘空’的程度*/
unsignedflags;/*文件狀態(tài)標(biāo)志*/
charfd;/*文件描述符*/
unsignedcharhold;/*如無緩沖區(qū)不讀字符*/
shortbsize;/*緩沖區(qū)的大小*/
unsignedchar*buffer;/*數(shù)據(jù)緩沖區(qū)的位置*/
unsignedchar*curp;/*指針當(dāng)前的指向*/
unsignedistemp;/*臨時文件指示器*/
shorttoken;/*用于有效性檢查*/}FILE;/*在stdio.h文件中定義*/對文件的操作都是通過各種函數(shù)來實現(xiàn)的55精選課件ppt文件指針()#include<stdio.h>typede13.2文件的打開和關(guān)閉文件的打開(fopen()函數(shù))FILE*fopen(const
char*,const
char*mode);FILE*fp=fopen("C:\\CONFIG.SYS","rw");是文件名包含路徑。如果不含路徑,表示打開當(dāng)前目錄下的文件mode是打開方式常用為"r"、"w"、"rw"和"a",分別表示只讀、只寫、讀寫和添加"rb"表示只讀二進(jìn)制文件返回值為指向此文件的指針,留待以后使用如果打開失敗,返回值為NULL56精選課件ppt13.2文件的打開和關(guān)閉文件的打開(fopen()函數(shù))13文件打開方式(mode):對應(yīng)二進(jìn)制文件對應(yīng)文本文件“r”
只讀必須是已存在的文件?!皐”
只寫不論該文件是否存在,都新建一個文件?!癮”
追加向文本文件尾增加數(shù)據(jù),該文件必須存在“r+”
讀寫打開一個已存在的文件,用于讀寫。“w+”讀寫建立一個新文件,可讀可寫?!癮+”
讀寫向文件尾追加數(shù)據(jù),也可讀?!皉b”
“wb”“ab”“rb+”“wb+”“ab+”57精選課件ppt文件打開方式(mode):對應(yīng)二進(jìn)制文件對應(yīng)文本文件“r”13.2文件的打開和關(guān)閉文件的關(guān)閉(fclose()函數(shù))intfclose(FILE*fp);使文件指針變量和文件脫鉤,釋放文件所占的緩沖區(qū)fclose函數(shù)的返回值當(dāng)順利地執(zhí)行了關(guān)閉操作,返回值為0;如果返回值為非零值,表示關(guān)閉時有錯誤。一般只有驅(qū)動器中無盤或盤空間不夠時才失敗,關(guān)閉失敗會引起數(shù)據(jù)丟失、文件的破壞和程序中的隨機(jī)錯誤。58精選課件ppt13.2文件的打開和關(guān)閉文件的關(guān)閉(fclose()函數(shù))1例:文件的打開和關(guān)閉#include<stdio.h>voidmain(){ FILE*fp; if((fp=fopen("test.txt","r"))==NULL) { printf("Failuretoopendemo.txt!\n"); exit(0); } fclose(fp);}59精選課件ppt例:文件的打開和關(guān)閉16精選課件ppt13.3按字符讀寫文件字符讀寫intfgetc(FILE*fp);從fp讀出一個字符,將位置指針指向下一個字符若讀成功,則返回該字符,若讀到文件尾,則返回EOF(EOF是一個符號常量,在stdio.h中定義為-1)intfputc(intc,FILE*fp);向fp輸出字符c若寫入錯誤,則返回EOF,否則返回c60精選課件ppt13.3按字符讀寫文件字符讀寫17精選課件ppt13.3按字符讀寫文件【例13.1】從鍵盤鍵入一串字符,轉(zhuǎn)存到磁盤文件上為什么要判斷文件打開是否成功呢?#include<stdio.h>#include<stdlib.h>voidmain(){ FILE*fp; charch; if((fp=fopen("demo.txt","w"))==NULL) { printf("Failuretoopendemo.txt!\n"); exit(0); } ch=getchar(); while(ch!='\n') { fputc(ch,fp); ch=getchar(); } fclose(fp);}61精選課件ppt13.3按字符讀寫文件【例13.1】從鍵盤鍵入一串字符,轉(zhuǎn)#include<stdio.h>#include<stdlib.h>voidmain(){ FILE*fp; charch; inti; if((fp=fopen("demo.bin","wb"))==NULL) { printf("Failuretoopendemo.bin!\n"); exit(0); } for(i=0;i<128;i++) fputc(i,fp); fclose(fp); if((fp=fopen("demo.bin","rb"))==NULL) {printf("Failuretoopendemo.bin!\n"); exit(0); } while((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp);}【例13.2】將0~127之間的ASCII字符寫到文件中,然后從文件中讀出并顯示到屏幕上函數(shù)feof()檢查是否到達(dá)文件尾,當(dāng)文件位置指針指向文件尾時,返回非0值,否則返回0值62精選課件ppt#include<stdio.h>【例13.2】將0~【例13.3】修改例13.2,從文件中讀出字符時,判斷是否為可打印字符,若是則顯示該字符,否則顯示其十進(jìn)制ASCII碼值while((ch=fgetc(fp))!=EOF)if(isprint(ch)) printf("%c\t",ch);else printf("%d\t",ch);63精選課件ppt【例13.3】修改例13.2,從文件中讀出字符時,判斷是例:復(fù)制文件#include<stdlib.h>#include<stdio.h>voidmain(){ FILE*in,*out; charin],out]; printf("Enterthein:\n"); scanf("%s",infile); printf("Entertheout:\n"); scanf("%s",outfile); if((in=fopen(infile,"rb"))==NULL) { printf("cannotopeninfile\n"); exit(0); } if((out=fopen(outfile,"wb"))==NULL) { printf("cannotopenoutfile\n"); exit(0); } while(!feof(in)) fputc(fgetc(in),out); fclose(in); fclose(out);}64精選課件ppt例:復(fù)制文件#include<stdlib.h>21精選課例:復(fù)制文件,利用命令行參數(shù)輸入兩個文件名#include<stdlib.h>#include<stdio.h>main(intargc,char*argv[]){ FILE*in,*out; if(argc!=3) { printf("Youforgottoentera\n"); exit(0); } if((in=fopen(argv[1],"rb"))==NULL) { printf("cannotopeninfile\n"); exit(0); } if((out=fopen(argv[2],"wb"))==NULL) { printf("cannotopenoutfile\n"); exit(0); } while(!feof(in)) fputc(fgetc(in),out); fclose(in); fclose(out);}65精選課件ppt例:復(fù)制文件,利用命令行參數(shù)輸入兩個文件名#include13.5按數(shù)據(jù)塊讀寫文件按數(shù)據(jù)塊讀寫從fp所指的文件中讀取數(shù)據(jù)塊并存儲到buffer指向的內(nèi)存中buffer是待讀入數(shù)塊據(jù)的起始地址size是每個數(shù)據(jù)塊的大小(待讀入的每個數(shù)據(jù)塊的字節(jié)數(shù))count是最多允許讀取的數(shù)據(jù)塊個數(shù)(每個數(shù)據(jù)塊size個字節(jié))返回實際讀到的數(shù)據(jù)塊個數(shù)將buffer指向的內(nèi)存中的數(shù)據(jù)塊寫入fp所指的文件66精選課件ppt13.5按數(shù)據(jù)塊讀寫文件按數(shù)據(jù)塊讀寫23精選課件ppt使用舉例:若文件以二進(jìn)制形式打開:
fread(f,4,2,fp);
此函數(shù)從fp所指向的文件中讀入2個4個字節(jié)的數(shù)據(jù),存儲到指針f所指向的空間中。67精選課件ppt使用舉例:24精選課件ppt使用舉例:若有如下結(jié)構(gòu)類型:structstudent_type{charname[10];intnum;intage;charaddr[30];}stud[40];可以用fread和fwrite來進(jìn)行數(shù)據(jù)的操作:for(i=0;i<40;i++)
fread(&stud[i],sizeof(structstudent_type),1,fp);
for(i=0;i<40,i++)fwrite(&stud[i],sizeof(structstudent_type),1,fp);
fread(stud,sizeof(structstudent_type),40,fp);fwrite(stud,sizeof(structstudent_type),40,fp);68精選課件ppt使用舉例:fread(stud,sizeof(struct例從鍵盤輸入4個學(xué)生的有關(guān)數(shù)據(jù),然后把它們轉(zhuǎn)存到磁盤文件上去。#include<stdio.h>#defineSIZE4typedefstructstudent_type{ charname[10]; intnum; intage; charaddr[15];}STUDENT;voidmain(){ voidsave(STUDENTstud[]); STUDENTstud[SIZE];inti;for(i=0;i<SIZE;i++)scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);save(stud);}69精選課件ppt例從鍵盤輸入4個學(xué)生的有關(guān)數(shù)據(jù),然后把它們轉(zhuǎn)存到磁盤文件上voidsave(STUDENTstud[]){ FILE*fp; inti; if((fp=fopen("stu_list","wb"))==NULL) { printf("cannotopenfile\n");return; } for(i=0;i<SIZE;i++) if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)!=1) printf("error\n"); fclose(fp);}70精選課件pptvoidsave(STUDENTstud[])27精選課例驗證上面程序生成的stu_list文件是否存在,從文件中讀出數(shù)據(jù)并顯示在屏幕上。#include<stdio.h>#defineSIZE4structstudent{ charname[10]; intnum; intage; charaddr[15];};voidmain(){ structstudentstud; inti; FILE*fp; if((fp=fopen("stu_list","rb"))==NULL) { printf("打開文件錯誤!\n");return; } for(i=0;i<SIZE;i++) { fread(&stud,sizeof(structstudent),1,fp); printf("%-10s%4d%4d%15s\n",,stud.num,stud.age,stud.addr); }fclose(fp);}71精選課件ppt例驗證上面程序生成的stu_list文件是否存在,從文件中
【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的平均分,將學(xué)生的各科成績及平均分輸出到文件student.txt中,然后再從文件中讀出數(shù)據(jù)并顯示到屏幕上72精選課件ppt【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的平均分,將學(xué)生的各科成績及平均分輸出到文件student.txt中,然后再從文件中讀出數(shù)據(jù)并顯示到屏幕上73精選課件ppt【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的平均分,將學(xué)生的各科成績及平均分輸出到文件student.txt中,然后再從文件中讀出數(shù)據(jù)并顯示到屏幕上74精選課件ppt【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的平均分,將學(xué)生的各科成績及平均分輸出到文件student.txt中,然后再從文件中讀出數(shù)據(jù)并顯示到屏幕上75精選課件ppt【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的平均分,將學(xué)生的各科成績及平均分輸出到文件student.txt中,然后再從文件中讀出數(shù)據(jù)并顯示到屏幕上76精選課件ppt【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的平均分,將學(xué)生的各科成績及平均分輸出到文件student.txt中,然后再從文件中讀出數(shù)據(jù)并顯示到屏幕上77精選課件ppt【例13.7】在例12.7基礎(chǔ)上,計算每個學(xué)生的4門課程的13.3按字符讀寫文件字符串讀寫char*fgets(char*s,intn,FILE*fp);從fp所指的文件中讀取字符串并在字符串末尾添加'\0',然后存入s,最多讀n-1個字符當(dāng)讀到回車換行符、文件末尾或讀滿n-1個字符時函數(shù)返回該字符串的首地址intfputs(const
char*s,FILE*fp);將字符串寫入文件中若出現(xiàn)寫入錯誤,則返回EOF,否則返回一個非負(fù)數(shù)78精選課件ppt13.3按字符讀寫文件字符串讀寫35精選課件ppt13.4按格式讀寫文件格式化讀寫intfscanf(FILE*fp,const
char*format,...);fscanf(fp,"%d,%f",&i,&t);第1個參數(shù)為文件指針,第2個參數(shù)為格式控制參數(shù),第3個參數(shù)為地址參數(shù)表列intfprintf(FILE*fp,const
char*format,...);
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 心理軟弱測試題及答案
- 信息科學(xué)導(dǎo)論試題及答案
- 棗莊聯(lián)通筆試題目及答案
- 粉絲生活測試題及答案
- 商業(yè)美術(shù)設(shè)計師的行業(yè)調(diào)研與分析能力試題及答案
- 清潔生產(chǎn)審核試題及答案
- ??凭W(wǎng)絡(luò)營銷試題及答案
- 2024助理廣告師考試全景考察試題及答案
- 入團(tuán)考試題及答案
- 工業(yè)型方形逆流冷卻塔有哪些種類
- 2025屆新高考教學(xué)教研聯(lián)盟高三第二次聯(lián)考政治試題及答案
- 賭博酒駕警示教育
- 產(chǎn)業(yè)園物業(yè)管理實施方案
- 管理學(xué)基礎(chǔ)-形考任務(wù)三-國開-參考資料
- 梁曉聲母親測試題及答案
- 企業(yè)會計人員勞動合同模板2025
- 浙江省腫瘤醫(yī)院醫(yī)療廢物暫存間環(huán)保設(shè)施提升改造項目報告表
- 敬老院安全培訓(xùn)課件
- 《加拉帕戈斯群島》課件
- 社區(qū)老舊小區(qū)外墻翻新腳手架方案
- 2025年醫(yī)院消化內(nèi)科年度工作計劃
評論
0/150
提交評論