版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第九章檔案處理第九章檔案處理19-1檔案處理的概念9-1檔案處理的概念29-1檔案處理的概念檔案處理在電腦裡的概念就是在處理檔案I/O(Input/Output),也就是檔案的輸入與輸出檔案輸入看成為讀取檔案(read),檔案輸出看成為寫入檔案(write)9-1檔案處理的概念檔案處理在電腦裡的概念就是在處理檔案39-1.1資料流的概念資料流的概念是將檔案看做是一連串的位元組(byte)排列起來資料對檔案的寫入或讀出就是對資料流的寫入與讀出9-1.1資料流的概念資料流的概念是將檔案看做是一連串的49-1.1資料流的概念有關(guān)檔案處理方面的標(biāo)準(zhǔn)函式皆宣告在stdio.h中,使用時(shí)必須將它include進(jìn)來才能使用9-1.1資料流的概念有關(guān)檔案處理方面的標(biāo)準(zhǔn)函式皆宣告在s59-1.2檔案自定型態(tài)結(jié)構(gòu)FILE對某個(gè)檔案進(jìn)行I/O處理時(shí),皆須以FILE型態(tài)宣告一個(gè)檔案指標(biāo)來處理typedefstruct_iobuf{ char* _ptr; int _cnt; char* _base; int _flag; int _file; int _charbuf; int _bufsiz; char* _tmpfname;}FILE;FILE的原型宣告9-1.2檔案自定型態(tài)結(jié)構(gòu)FILE對某個(gè)檔案進(jìn)行I/O處69-1.2檔案自定型態(tài)結(jié)構(gòu)FILE檔案被開啟後將以一個(gè)FILE型態(tài)的指標(biāo)作為操作控制者,它就是一個(gè)指向這個(gè)檔案處理的相關(guān)資訊的指標(biāo)宣告舉例:FILE*fhandler;此操作控制者就是該檔案的“代表”9-1.2檔案自定型態(tài)結(jié)構(gòu)FILE檔案被開啟後將以一個(gè)F79-1.3檔案資料緩衝區(qū)檔案一旦被開啟後,系統(tǒng)將配置一塊記憶體當(dāng)作檔案資料存取的緩衝區(qū)緩衝區(qū)(buffer)讓檔案的部分資料先讀取到此區(qū)中,一旦需要存取資料時(shí),先到此區(qū)中尋找或暫時(shí)的寫入如果緩衝區(qū)中找不到要讀取的資料,或者寫入的資料已經(jīng)滿了(超過緩衝區(qū)的大?。?,則系統(tǒng)才會到磁碟機(jī)中的磁碟片尋找或真正的寫入檔案中9-1.3檔案資料緩衝區(qū)檔案一旦被開啟後,系統(tǒng)將配置一塊89-1.3檔案資料緩衝區(qū)9-1.3檔案資料緩衝區(qū)99-2檔案處理函式9-2檔案處理函式109-2檔案處理函式C函式庫中提供的檔案處理函式都宣告在stdio.h檔9-2檔案處理函式C函式庫中提供的檔案處理函式都宣告在st119-2.1檔案的開啟fopen【函式原型】FILE*fopen(constchar*filename,constchar*mode);【表頭檔】<stdio.h>【功能】開啟檔案【傳回值】檔案結(jié)構(gòu)指標(biāo)FILE*,若開啟失敗則傳回NULLmode:檔案開啟的模式字串。這是一個(gè)字串常數(shù),不同的字元代表不同的意義,開啟的檔案模式也不同。9-2.1檔案的開啟fopen【函式原型】FILE*f12mode字元的意義mode字元的意義13mode字元的意義上述三種字元也可以搭配“+”、“b”和“t”三個(gè)字元而有不同的開啟檔案模式:“+”:表示可讓檔案同時(shí)供讀取和寫入,稱為修改模式?!癰”:開啟檔案為二進(jìn)位檔案(binaryfile)。“t”:開啟檔案為文字檔(textfile),可省略不寫。mode字元的意義上述三種字元也可以搭配“+”、“b”和14範(fàn)例09-02-01.C01//Programname:09-02-01.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06FILE*fp=fopen("09-02-01.txt","w");//開啟檔案07chars1[]="HappyBirthdaytoyou!";08chars2[50];09inti=0;10fputs(s1,fp);//將字串寫入檔案11fclose(fp);//關(guān)閉檔案12fp=fopen("09-02-01.txt","r");//開啟檔案13fgets(s2,50,fp);//從檔案讀取字串到s214printf("Thestringinfile09-02-01.txtis:\n%s\n",s2);15fclose(fp);//關(guān)閉檔案16system("PAUSE");17return0;18}範(fàn)例09-02-01.C01//Programname159-2.2檔案的關(guān)閉fclose【函式原型】intfclose(FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲關(guān)閉檔案的資料流指標(biāo)?!竟δ堋筷P(guān)閉檔案?!緜骰刂怠繖n案關(guān)閉成功則傳回0,失敗則傳回EOF。EOF是一個(gè)巨集,其定義值為-1。9-2.2檔案的關(guān)閉fclose【函式原型】intfc169-2.3讀寫檔案單一字元fgetc和fputc【函式原型】intfgetc(FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標(biāo)?!竟δ堋繌臋n案中讀取一個(gè)字元?!緜骰刂怠孔x取成功時(shí)傳回所讀取字元的ASCII碼,以整數(shù)型態(tài)傳回之;若已經(jīng)讀取到檔案結(jié)束標(biāo)記EOF或讀取失敗將傳回EOF(值為-1)。9-2.3讀寫檔案單一字元fgetc和fputc【函式原17範(fàn)例09-02-0301//Programname:09-02-03.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06FILE*f=fopen("testtext.txt","r");07intcount=0;08charc;09while((c=fgetc(f))!=EOF)10{11printf("%c",c);12count++;13}14printf("\nThereare%dcharactersinthisfile.",count);15fclose(f);16system("pause");17return0;18}範(fàn)例09-02-0301//Programname:0918【函式原型】intfputc(intc,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標(biāo)。
c:欲寫入的字元?!竟δ堋繉懭胍粋€(gè)字元到檔案資料流?!緜骰刂怠繉懭氤晒r(shí)傳回所寫入字元的ASCII碼,以整數(shù)型態(tài)傳回之;若寫入失敗則傳回EOF(值為-1)?!竞皆汀縤ntfputc(intc,FILE*19範(fàn)例09-02-03B01//Programname:09-02-03B.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06FILE*fp1=fopen("fputctest.txt","w"),*fp2;07chars[]="Thisisateststringforfputcfunction.";08inti=0;09charc;10/*寫入字元到檔案資料流*/11while(s[i]!='\0')12{13fputc(s[i],fp1);14i++;15}範(fàn)例09-02-03B01//Programname:20範(fàn)例09-02-03B16fclose(fp1);17/*從檔案資料流讀取字元*/18fp2=fopen("fputctest.txt","r");19i=0;20c=fgetc(fp2);21while(c!=EOF)22{23printf("%c",c);24c=fgetc(fp2);25}26system("PAUSE");27return0;28}範(fàn)例09-02-03B16fclose(fp1);21範(fàn)例09-02-03C設(shè)計(jì)一個(gè)可以複製檔案的程式。使用者輸入欲複製的檔案名稱(來源檔案名稱),以及複製後新的檔案名稱(目的檔案名稱),程式便可運(yùn)作。範(fàn)例09-02-03C設(shè)計(jì)一個(gè)可以複製檔案的程式。使用者輸22範(fàn)例09-02-03C01//Programname:09-02-03C.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06FILE*fs,*fd;07charsfilename[20],dfilename[20];08charc;09printf("請輸入來源檔案名稱:");10scanf("%s",sfilename);11printf("請輸入目的檔案名稱:");12scanf("%s",dfilename);13if((fs=fopen(sfilename,"r"))==NULL)14{15printf("來源檔案無法開啟!");16system("pause");17return0;範(fàn)例09-02-03C01//Programname:23範(fàn)例09-02-03C18}19if((fd=fopen(dfilename,"w"))==NULL)20{21printf("目的檔案無法開啟!");22system("pause");23return0;24}25while((c=fgetc(fs))!=EOF)26fputc(c,fd);27fclose(fs);28fclose(fd);29printf("拷貝完成!");30system("PAUSE");31return0;32}範(fàn)例09-02-03C18}249-2.4讀寫檔案字串fgets和fputs【函式原型】char*fgets(char*string,intn,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】string:讀取字串後欲存放的位置,通常是一個(gè)字元陣列變數(shù),或者是字串變數(shù)。
n:最大讀取的字元數(shù)。stream:欲讀取資料的檔案資料流指標(biāo)。【功能】從檔案資料流讀取字串。fgets將從目前檔案資料流指標(biāo)所在位置開始讀取n-1個(gè)字元,因?yàn)橐A糇钺嵋粋€(gè)字元寫入字串結(jié)尾標(biāo)記’\0’。若在過程中讀取到newline字元,也就是換行字元’\n’則將停止讀取。【傳回值】函式將傳回所讀取到的字串指標(biāo),並將字串儲存在string中。若讀到檔尾,則會傳回NULL。9-2.4讀寫檔案字串fgets和fputs【函式原型】25範(fàn)例09-02-03C01//Programname:09-02-03C.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06FILE*fp=fopen("testtext.txt","r");07intn=50,i;08chars[100];09for(i=0;i<3;i++)10{11fgets(s,n,fp);12printf("%s",s);13}14fclose(fp);15system("pause");16return0;17}範(fàn)例09-02-03C01//Programname:26【函式原型】intfputs(constchar*string,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】string:讀取字串後欲存放的位置,通常是一個(gè)字元陣列變數(shù),或者是字串變數(shù)。stream:欲讀取資料的檔案資料流指標(biāo)?!竟δ堋繉懭胍粋€(gè)字串到檔案資料流?!緜骰刂怠繉懭胝_的話會傳回非負(fù)整數(shù),通常是0;若寫入錯(cuò)誤則傳回EOF?!竞皆汀縤ntfputs(constchar*s27範(fàn)例01#include<stdio.h>02#include<stdlib.h>03intmain()04{05FILE*fp=fopen("fputstest.txt","w");06chars[]="Thisistheteststringforfputs.";07fputs(s,fp);08fclose(fp);09system("pause");10return0;11}範(fàn)例01#include<stdio.h>289-2.5依格式讀寫檔案資料fprintf和fscanf【函式原型】intfprintf(FILE*stream,constchar*format[,argument]...);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲輸出資料的檔案資料流指標(biāo)。format:和printf相同的格式字串與相對應(yīng)的資料儲存位址,請參考第六章6-4.4小節(jié)的介紹?!竟δ堋恳勒崭袷捷敵鲑Y料到檔案資料流?!緜骰刂怠繉懭胝_的話會傳輸出(寫入)到檔案資料流的byte數(shù);若寫入錯(cuò)誤則傳回一個(gè)負(fù)數(shù)。9-2.5依格式讀寫檔案資料fprintf和fscanf29範(fàn)例09-02-05A01//Programname:09-02-05A.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06 inti=120;07 floatf=3.14f;08 unsignedui=91001;09 chars[]="HappyBirthday";10 FILE*fp=fopen("fprintftest.txt","w");11 fprintf(fp,"int=%d\n",i); //儲存整數(shù)格式資料12 fprintf(fp,"float=%f\n",f); //儲存浮點(diǎn)數(shù)格式資料13 fprintf(fp,"unsigned=%d\n",ui); //儲存無符整數(shù)格式資料14 fprintf(fp,"string=%s\n",s); //儲存字串資料15 fclose(fp);16 system("pause");17 return0;18}範(fàn)例09-02-05A01//Programname:030【函式原型】intfscanf(FILE*stream,constchar*format[,argument]...);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標(biāo)。format:和scanf相同的格式字串與相對應(yīng)的資料儲存位址,請參考第六章6-4.4小節(jié)的介紹。【功能】依照格式從檔案資料流stream格式化讀取到argument中?!緜骰刂怠咳裟苷_地從檔案資料流中讀取到資料,會傳回有多少argument被指定資料;若傳回值為0則表示沒有任何資料被指定到argument中;若讀取失敗則傳回EOF?!竞皆汀縤ntfscanf(FILE*stream31範(fàn)例09-02-05B01//Programname:09-02-05B.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06 inti;07 floatf;08 unsignedui;09 chars[15];10 FILE*fp=fopen("fprintftest.txt","r");11 fscanf(fp,"int=%d\n",&i); //讀取整數(shù)格式資料12 fscanf(fp,"float=%f\n",&f); //讀取浮點(diǎn)數(shù)格式資料13 fscanf(fp,"unsigned=%d\n",&ui); //讀取無符整數(shù)格式資料14 fscanf(fp,"string=%s\n",s); //讀取字串資料15 fclose(fp);16 printf("int=%d\n",i);17 printf("float=%f\n",f);18 printf("unsigned=%d\n",ui);19 printf("string=%s\n",s);20 system("pause");21 return0;22}範(fàn)例09-02-05B01//Programname:329-3循序檔與隨機(jī)檔9-3循序檔與隨機(jī)檔339-3循序檔與隨機(jī)檔循序檔9-3循序檔與隨機(jī)檔循序檔349-3循序檔與隨機(jī)檔隨機(jī)檔9-3循序檔與隨機(jī)檔隨機(jī)檔359-3.1認(rèn)識循序檔與隨機(jī)檔循序檔的儲存方式是將資料一筆接著一筆存放,每一筆的大小可以不相同讀取時(shí),必須注意當(dāng)時(shí)存放的順序、資料型態(tài)和大小,以便順利將每一筆資料分別取出9-3.1認(rèn)識循序檔與隨機(jī)檔循序檔的儲存方式是將資料一筆369-3.1認(rèn)識循序檔與隨機(jī)檔隨機(jī)檔的每項(xiàng)資料的長度大小都是固定的,若有資料超過這個(gè)長度,則資料有可能會被覆蓋遺失存取資料時(shí),可以直接透過運(yùn)算直接將指標(biāo)移到該處9-3.1認(rèn)識循序檔與隨機(jī)檔隨機(jī)檔的每項(xiàng)資料的長度大小都是379-3.2檔案位置指標(biāo)C語言為了提供隨機(jī)檔的存取機(jī)制,在檔案結(jié)構(gòu)FILE中提供了檔案位置指標(biāo)_ptr記錄目前檔案讀寫的位置移動此指標(biāo)到檔案資料流中適當(dāng)?shù)奈恢?,再透過fputc、fputs、fgetc和fgets從這個(gè)位置開始存取9-3.2檔案位置指標(biāo)C語言為了提供隨機(jī)檔的存取機(jī)制,在38fseek【函式原型】intfseek(FILE*stream,longoffset,intorigin);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標(biāo)。offset:從origin開始偏移的位元數(shù)(bytes)。origin:指標(biāo)位址計(jì)算的起始參考位置。包括下列三個(gè)位置巨集值:SEEK_CUR:目前檔案指標(biāo)所在位置。SEEK_END:檔案結(jié)尾。SEEK_SET:檔案開頭。【功能】移動檔案指標(biāo)至特定的位置。【傳回值】若移動指標(biāo)成功則傳回0,否則傳回一個(gè)非0的值。fseek【函式原型】intfseek(FILE*st39範(fàn)例09-03-0201//Programname:09-03-02.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06 charstr[]="Thisisateststring.";07 charsubstr[10]; //用來儲存讀取到的部分字串08 FILE*fp=fopen("test.txt","w"); //開啟檔案供寫入字串09 fputs(str,fp); //將字串str寫入檔案10 fclose(fp); //關(guān)閉檔案1112 fp=fopen("test.txt","r"); //開啟檔案以供讀取13 fseek(fp,10,SEEK_SET); //將指標(biāo)從檔案開頭往後移動10位元14 fgets(substr,5,fp); //從檔案指標(biāo)現(xiàn)在的位置讀取5個(gè)字元15 printf("Thesub-stringis'%s'\n",substr);16 fclose(fp); //關(guān)閉檔案17 system("pause");18 return0;19}範(fàn)例09-03-0201//Programname:0409-4二進(jìn)位檔9-4二進(jìn)位檔41文字檔被儲存在文字檔中的資料都是可以“看得見”的字元,可透過文字編輯器開啟而看到內(nèi)容文字檔在儲存換行字元’\n’時(shí),儲存兩個(gè)碼,一個(gè)是0x0d,另一個(gè)是0x0a所有文字檔的存取動作在遇到’\n’時(shí)都會自動轉(zhuǎn)換成0x0d和0x0a文字檔被儲存在文字檔中的資料都是可以“看得見”的字元,可透過42二進(jìn)位檔二進(jìn)位檔不會像文字檔一樣做換行字元的轉(zhuǎn)換,而是直接存入或讀取出檔案的內(nèi)容儲存的資料並不完全能“看得見”儲存數(shù)值資料時(shí),在文字檔和二進(jìn)位檔的儲存內(nèi)容就不一樣二進(jìn)位檔二進(jìn)位檔不會像文字檔一樣做換行字元的轉(zhuǎn)換,而是直接存43二進(jìn)位檔二進(jìn)位檔44二進(jìn)位檔二進(jìn)位檔459-4.1二進(jìn)位檔的開啟使用fopen函式來開啟,在開啟模式的字串中,必須加上’b’字元//開啟二進(jìn)位檔test1.bin供寫入FILE*fp1=fopen(“test1.bin”,”wb”);//開啟二進(jìn)位檔test2.bin供讀取FILE*fp2=fopen(“test2.bin”,”rb”);//開啟二進(jìn)位檔test3.bin供增添FILE*fp3=fopen(“test3.bin”,”ab”);
9-4.1二進(jìn)位檔的開啟使用fopen函式來開啟,在開啟469-4.2二進(jìn)位檔的讀寫fread和fwritefwrite【函式原型】size_tfwrite(constvoid*buffer,size_tsize,size_tcount,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】buffer:欲寫入資料的位址。size:寫入資料的大小。count:寫入次數(shù),或?qū)懭氲捻?xiàng)目數(shù)。stream:欲寫入資料的檔案資料流指標(biāo)?!竟δ堋縡write函式可將大小為size(單位是byte)的資料,寫入到檔案資料流stream中count次?!緜骰刂怠總骰貙懭氲捻?xiàng)目次數(shù)。9-4.2二進(jìn)位檔的讀寫fread和fwritefwri47fread【函式原型】size_tfread(void*buffer,size_tsize,size_tcount,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】buffer:讀取後資料存放的位址。size:讀取資料的大小。count:讀取次數(shù),或讀取的項(xiàng)目數(shù)。stream:欲讀取資料的檔案資料流指標(biāo)?!竟δ堋縡read的動作和fwrite相反,fread函式可從檔案資料流stream中讀取將大小為size(單位是byte)的資料count次?!緜骰刂怠總骰刈x取到的項(xiàng)目次數(shù)。fread【函式原型】size_tfread(void*48範(fàn)例09-04-02A01//Programname:09-04-02A.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06charperson1[5][8]={"項(xiàng)少龍","秦清","烏廷芳","嫪?dú)?,"秦始皇"};07charperson2[5][8];08inti;09FILE*fp=fopen("array.bin","wb");10fwrite(person1,8,5,fp);11fclose(fp);1213fp=fopen("array.bin","rb");14fread(person2,8,5,fp);15for(i=0;i<5;i++)16printf("%s\n",person2[i]);17fclose(fp);18system("PAUSE");19return0;20}範(fàn)例09-04-02A01//Programname:49範(fàn)例09-04-02B設(shè)計(jì)一個(gè)可以儲存學(xué)生資料的結(jié)構(gòu),並事先給定3個(gè)學(xué)生的初值,將這些資料以二進(jìn)位檔的方式儲存,檔名為struct.bin。接著再開啟這個(gè)檔案,讀取當(dāng)中的資料,並列印在螢?zāi)簧?。學(xué)生結(jié)構(gòu):structSTUDENT{ longid; //學(xué)號
charname[20]; //姓名
shortage; //年齡
floatheight; //身高
floatweight; //體重};初值設(shè)定可自行決定。範(fàn)例09-04-02B設(shè)計(jì)一個(gè)可以儲存學(xué)生資料的結(jié)構(gòu),並事50範(fàn)例09-04-02B01//Programname:09-04-02B.c02#include<stdio.h>03#include<stdlib.h>04structSTUDENT{05 longid;06 charname[20];07 shortage;08 floatheight;09 floatweight;10};11intmain()12{13 structSTUDENTst1[3]={14 {910001,"項(xiàng)少龍",25,174.5f,73.8f},15 {910002,"秦清",24,168.3f,52.5f},16 {910003,"烏廷芳",24,168.3f,52.5f}};17 intc,i;18 structSTUDENTst2[3];19 FILE*fp;20範(fàn)例09-04-02B01//Programname:51範(fàn)例09-04-02B21 fp=fopen("struct.bin","wb");22 c=fwrite(st1,sizeof(structSTUDENT),3,fp);23 fclose(fp);24 printf("Thereare%drecord(s)tobewritten.\n",c);25 26 fp=fopen("struct.bin","rb");27 c=fread(st2,sizeof(structSTUDENT),3,fp);28 printf("Thereare%drecord(s)toberead.\n",c);29 fclose(fp);30 for(i=0;i<3;i++)31 {32 printf("Record:%d\n",i+1);33 printf("ID:%d\n",st2[i].id);34 printf("Name:%s\n",st2[i].name);35 printf("Age:%d\n",st2[i].age);36 printf("Height:%f\n",st2[i].height);37 printf("Weight:%f\n",st2[i].weight);38 }39 system("pause");40 return0;41}
範(fàn)例09-04-02B21 fp=fopen("struc529-5關(guān)於檔案處理的二三事9-5關(guān)於檔案處理的二三事539-5.1不可不知1:如何觀看檔案內(nèi)容使用文字編輯軟體,包括記事本、Word等使用MS-DOS模式下的type命令來觀看9-5.1不可不知1:如何觀看檔案內(nèi)容使用文字編輯軟體,包54第九章結(jié)束第九章結(jié)束55演講完畢,謝謝觀看!演講完畢,謝謝觀看!56第九章檔案處理第九章檔案處理579-1檔案處理的概念9-1檔案處理的概念589-1檔案處理的概念檔案處理在電腦裡的概念就是在處理檔案I/O(Input/Output),也就是檔案的輸入與輸出檔案輸入看成為讀取檔案(read),檔案輸出看成為寫入檔案(write)9-1檔案處理的概念檔案處理在電腦裡的概念就是在處理檔案599-1.1資料流的概念資料流的概念是將檔案看做是一連串的位元組(byte)排列起來資料對檔案的寫入或讀出就是對資料流的寫入與讀出9-1.1資料流的概念資料流的概念是將檔案看做是一連串的609-1.1資料流的概念有關(guān)檔案處理方面的標(biāo)準(zhǔn)函式皆宣告在stdio.h中,使用時(shí)必須將它include進(jìn)來才能使用9-1.1資料流的概念有關(guān)檔案處理方面的標(biāo)準(zhǔn)函式皆宣告在s619-1.2檔案自定型態(tài)結(jié)構(gòu)FILE對某個(gè)檔案進(jìn)行I/O處理時(shí),皆須以FILE型態(tài)宣告一個(gè)檔案指標(biāo)來處理typedefstruct_iobuf{ char* _ptr; int _cnt; char* _base; int _flag; int _file; int _charbuf; int _bufsiz; char* _tmpfname;}FILE;FILE的原型宣告9-1.2檔案自定型態(tài)結(jié)構(gòu)FILE對某個(gè)檔案進(jìn)行I/O處629-1.2檔案自定型態(tài)結(jié)構(gòu)FILE檔案被開啟後將以一個(gè)FILE型態(tài)的指標(biāo)作為操作控制者,它就是一個(gè)指向這個(gè)檔案處理的相關(guān)資訊的指標(biāo)宣告舉例:FILE*fhandler;此操作控制者就是該檔案的“代表”9-1.2檔案自定型態(tài)結(jié)構(gòu)FILE檔案被開啟後將以一個(gè)F639-1.3檔案資料緩衝區(qū)檔案一旦被開啟後,系統(tǒng)將配置一塊記憶體當(dāng)作檔案資料存取的緩衝區(qū)緩衝區(qū)(buffer)讓檔案的部分資料先讀取到此區(qū)中,一旦需要存取資料時(shí),先到此區(qū)中尋找或暫時(shí)的寫入如果緩衝區(qū)中找不到要讀取的資料,或者寫入的資料已經(jīng)滿了(超過緩衝區(qū)的大小),則系統(tǒng)才會到磁碟機(jī)中的磁碟片尋找或真正的寫入檔案中9-1.3檔案資料緩衝區(qū)檔案一旦被開啟後,系統(tǒng)將配置一塊649-1.3檔案資料緩衝區(qū)9-1.3檔案資料緩衝區(qū)659-2檔案處理函式9-2檔案處理函式669-2檔案處理函式C函式庫中提供的檔案處理函式都宣告在stdio.h檔9-2檔案處理函式C函式庫中提供的檔案處理函式都宣告在st679-2.1檔案的開啟fopen【函式原型】FILE*fopen(constchar*filename,constchar*mode);【表頭檔】<stdio.h>【功能】開啟檔案【傳回值】檔案結(jié)構(gòu)指標(biāo)FILE*,若開啟失敗則傳回NULLmode:檔案開啟的模式字串。這是一個(gè)字串常數(shù),不同的字元代表不同的意義,開啟的檔案模式也不同。9-2.1檔案的開啟fopen【函式原型】FILE*f68mode字元的意義mode字元的意義69mode字元的意義上述三種字元也可以搭配“+”、“b”和“t”三個(gè)字元而有不同的開啟檔案模式:“+”:表示可讓檔案同時(shí)供讀取和寫入,稱為修改模式?!癰”:開啟檔案為二進(jìn)位檔案(binaryfile)?!皌”:開啟檔案為文字檔(textfile),可省略不寫。mode字元的意義上述三種字元也可以搭配“+”、“b”和70範(fàn)例09-02-01.C01//Programname:09-02-01.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06FILE*fp=fopen("09-02-01.txt","w");//開啟檔案07chars1[]="HappyBirthdaytoyou!";08chars2[50];09inti=0;10fputs(s1,fp);//將字串寫入檔案11fclose(fp);//關(guān)閉檔案12fp=fopen("09-02-01.txt","r");//開啟檔案13fgets(s2,50,fp);//從檔案讀取字串到s214printf("Thestringinfile09-02-01.txtis:\n%s\n",s2);15fclose(fp);//關(guān)閉檔案16system("PAUSE");17return0;18}範(fàn)例09-02-01.C01//Programname719-2.2檔案的關(guān)閉fclose【函式原型】intfclose(FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲關(guān)閉檔案的資料流指標(biāo)。【功能】關(guān)閉檔案?!緜骰刂怠繖n案關(guān)閉成功則傳回0,失敗則傳回EOF。EOF是一個(gè)巨集,其定義值為-1。9-2.2檔案的關(guān)閉fclose【函式原型】intfc729-2.3讀寫檔案單一字元fgetc和fputc【函式原型】intfgetc(FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標(biāo)?!竟δ堋繌臋n案中讀取一個(gè)字元?!緜骰刂怠孔x取成功時(shí)傳回所讀取字元的ASCII碼,以整數(shù)型態(tài)傳回之;若已經(jīng)讀取到檔案結(jié)束標(biāo)記EOF或讀取失敗將傳回EOF(值為-1)。9-2.3讀寫檔案單一字元fgetc和fputc【函式原73範(fàn)例09-02-0301//Programname:09-02-03.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06FILE*f=fopen("testtext.txt","r");07intcount=0;08charc;09while((c=fgetc(f))!=EOF)10{11printf("%c",c);12count++;13}14printf("\nThereare%dcharactersinthisfile.",count);15fclose(f);16system("pause");17return0;18}範(fàn)例09-02-0301//Programname:0974【函式原型】intfputc(intc,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標(biāo)。
c:欲寫入的字元?!竟δ堋繉懭胍粋€(gè)字元到檔案資料流?!緜骰刂怠繉懭氤晒r(shí)傳回所寫入字元的ASCII碼,以整數(shù)型態(tài)傳回之;若寫入失敗則傳回EOF(值為-1)?!竞皆汀縤ntfputc(intc,FILE*75範(fàn)例09-02-03B01//Programname:09-02-03B.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06FILE*fp1=fopen("fputctest.txt","w"),*fp2;07chars[]="Thisisateststringforfputcfunction.";08inti=0;09charc;10/*寫入字元到檔案資料流*/11while(s[i]!='\0')12{13fputc(s[i],fp1);14i++;15}範(fàn)例09-02-03B01//Programname:76範(fàn)例09-02-03B16fclose(fp1);17/*從檔案資料流讀取字元*/18fp2=fopen("fputctest.txt","r");19i=0;20c=fgetc(fp2);21while(c!=EOF)22{23printf("%c",c);24c=fgetc(fp2);25}26system("PAUSE");27return0;28}範(fàn)例09-02-03B16fclose(fp1);77範(fàn)例09-02-03C設(shè)計(jì)一個(gè)可以複製檔案的程式。使用者輸入欲複製的檔案名稱(來源檔案名稱),以及複製後新的檔案名稱(目的檔案名稱),程式便可運(yùn)作。範(fàn)例09-02-03C設(shè)計(jì)一個(gè)可以複製檔案的程式。使用者輸78範(fàn)例09-02-03C01//Programname:09-02-03C.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06FILE*fs,*fd;07charsfilename[20],dfilename[20];08charc;09printf("請輸入來源檔案名稱:");10scanf("%s",sfilename);11printf("請輸入目的檔案名稱:");12scanf("%s",dfilename);13if((fs=fopen(sfilename,"r"))==NULL)14{15printf("來源檔案無法開啟!");16system("pause");17return0;範(fàn)例09-02-03C01//Programname:79範(fàn)例09-02-03C18}19if((fd=fopen(dfilename,"w"))==NULL)20{21printf("目的檔案無法開啟!");22system("pause");23return0;24}25while((c=fgetc(fs))!=EOF)26fputc(c,fd);27fclose(fs);28fclose(fd);29printf("拷貝完成!");30system("PAUSE");31return0;32}範(fàn)例09-02-03C18}809-2.4讀寫檔案字串fgets和fputs【函式原型】char*fgets(char*string,intn,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】string:讀取字串後欲存放的位置,通常是一個(gè)字元陣列變數(shù),或者是字串變數(shù)。
n:最大讀取的字元數(shù)。stream:欲讀取資料的檔案資料流指標(biāo)?!竟δ堋繌臋n案資料流讀取字串。fgets將從目前檔案資料流指標(biāo)所在位置開始讀取n-1個(gè)字元,因?yàn)橐A糇钺嵋粋€(gè)字元寫入字串結(jié)尾標(biāo)記’\0’。若在過程中讀取到newline字元,也就是換行字元’\n’則將停止讀取?!緜骰刂怠亢綄骰厮x取到的字串指標(biāo),並將字串儲存在string中。若讀到檔尾,則會傳回NULL。9-2.4讀寫檔案字串fgets和fputs【函式原型】81範(fàn)例09-02-03C01//Programname:09-02-03C.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06FILE*fp=fopen("testtext.txt","r");07intn=50,i;08chars[100];09for(i=0;i<3;i++)10{11fgets(s,n,fp);12printf("%s",s);13}14fclose(fp);15system("pause");16return0;17}範(fàn)例09-02-03C01//Programname:82【函式原型】intfputs(constchar*string,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】string:讀取字串後欲存放的位置,通常是一個(gè)字元陣列變數(shù),或者是字串變數(shù)。stream:欲讀取資料的檔案資料流指標(biāo)?!竟δ堋繉懭胍粋€(gè)字串到檔案資料流?!緜骰刂怠繉懭胝_的話會傳回非負(fù)整數(shù),通常是0;若寫入錯(cuò)誤則傳回EOF。【函式原型】intfputs(constchar*s83範(fàn)例01#include<stdio.h>02#include<stdlib.h>03intmain()04{05FILE*fp=fopen("fputstest.txt","w");06chars[]="Thisistheteststringforfputs.";07fputs(s,fp);08fclose(fp);09system("pause");10return0;11}範(fàn)例01#include<stdio.h>849-2.5依格式讀寫檔案資料fprintf和fscanf【函式原型】intfprintf(FILE*stream,constchar*format[,argument]...);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲輸出資料的檔案資料流指標(biāo)。format:和printf相同的格式字串與相對應(yīng)的資料儲存位址,請參考第六章6-4.4小節(jié)的介紹?!竟δ堋恳勒崭袷捷敵鲑Y料到檔案資料流?!緜骰刂怠繉懭胝_的話會傳輸出(寫入)到檔案資料流的byte數(shù);若寫入錯(cuò)誤則傳回一個(gè)負(fù)數(shù)。9-2.5依格式讀寫檔案資料fprintf和fscanf85範(fàn)例09-02-05A01//Programname:09-02-05A.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06 inti=120;07 floatf=3.14f;08 unsignedui=91001;09 chars[]="HappyBirthday";10 FILE*fp=fopen("fprintftest.txt","w");11 fprintf(fp,"int=%d\n",i); //儲存整數(shù)格式資料12 fprintf(fp,"float=%f\n",f); //儲存浮點(diǎn)數(shù)格式資料13 fprintf(fp,"unsigned=%d\n",ui); //儲存無符整數(shù)格式資料14 fprintf(fp,"string=%s\n",s); //儲存字串資料15 fclose(fp);16 system("pause");17 return0;18}範(fàn)例09-02-05A01//Programname:086【函式原型】intfscanf(FILE*stream,constchar*format[,argument]...);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標(biāo)。format:和scanf相同的格式字串與相對應(yīng)的資料儲存位址,請參考第六章6-4.4小節(jié)的介紹?!竟δ堋恳勒崭袷綇臋n案資料流stream格式化讀取到argument中?!緜骰刂怠咳裟苷_地從檔案資料流中讀取到資料,會傳回有多少argument被指定資料;若傳回值為0則表示沒有任何資料被指定到argument中;若讀取失敗則傳回EOF?!竞皆汀縤ntfscanf(FILE*stream87範(fàn)例09-02-05B01//Programname:09-02-05B.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06 inti;07 floatf;08 unsignedui;09 chars[15];10 FILE*fp=fopen("fprintftest.txt","r");11 fscanf(fp,"int=%d\n",&i); //讀取整數(shù)格式資料12 fscanf(fp,"float=%f\n",&f); //讀取浮點(diǎn)數(shù)格式資料13 fscanf(fp,"unsigned=%d\n",&ui); //讀取無符整數(shù)格式資料14 fscanf(fp,"string=%s\n",s); //讀取字串資料15 fclose(fp);16 printf("int=%d\n",i);17 printf("float=%f\n",f);18 printf("unsigned=%d\n",ui);19 printf("string=%s\n",s);20 system("pause");21 return0;22}範(fàn)例09-02-05B01//Programname:889-3循序檔與隨機(jī)檔9-3循序檔與隨機(jī)檔899-3循序檔與隨機(jī)檔循序檔9-3循序檔與隨機(jī)檔循序檔909-3循序檔與隨機(jī)檔隨機(jī)檔9-3循序檔與隨機(jī)檔隨機(jī)檔919-3.1認(rèn)識循序檔與隨機(jī)檔循序檔的儲存方式是將資料一筆接著一筆存放,每一筆的大小可以不相同讀取時(shí),必須注意當(dāng)時(shí)存放的順序、資料型態(tài)和大小,以便順利將每一筆資料分別取出9-3.1認(rèn)識循序檔與隨機(jī)檔循序檔的儲存方式是將資料一筆929-3.1認(rèn)識循序檔與隨機(jī)檔隨機(jī)檔的每項(xiàng)資料的長度大小都是固定的,若有資料超過這個(gè)長度,則資料有可能會被覆蓋遺失存取資料時(shí),可以直接透過運(yùn)算直接將指標(biāo)移到該處9-3.1認(rèn)識循序檔與隨機(jī)檔隨機(jī)檔的每項(xiàng)資料的長度大小都是939-3.2檔案位置指標(biāo)C語言為了提供隨機(jī)檔的存取機(jī)制,在檔案結(jié)構(gòu)FILE中提供了檔案位置指標(biāo)_ptr記錄目前檔案讀寫的位置移動此指標(biāo)到檔案資料流中適當(dāng)?shù)奈恢茫偻高^fputc、fputs、fgetc和fgets從這個(gè)位置開始存取9-3.2檔案位置指標(biāo)C語言為了提供隨機(jī)檔的存取機(jī)制,在94fseek【函式原型】intfseek(FILE*stream,longoffset,intorigin);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標(biāo)。offset:從origin開始偏移的位元數(shù)(bytes)。origin:指標(biāo)位址計(jì)算的起始參考位置。包括下列三個(gè)位置巨集值:SEEK_CUR:目前檔案指標(biāo)所在位置。SEEK_END:檔案結(jié)尾。SEEK_SET:檔案開頭?!竟δ堋恳苿訖n案指標(biāo)至特定的位置。【傳回值】若移動指標(biāo)成功則傳回0,否則傳回一個(gè)非0的值。fseek【函式原型】intfseek(FILE*st95範(fàn)例09-03-0201//Programname:09-03-02.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06 charstr[]="Thisisateststring.";07 charsubstr[10]; //用來儲存讀取到的部分字串08 FILE*fp=fopen("test.txt","w"); //開啟檔案供寫入字串09 fputs(str,fp); //將字串str寫入檔案10 fclose(fp); //關(guān)閉檔案1112 fp=fopen("test.txt","r"); //開啟檔案以供讀取13 fseek(fp,10,SEEK_SET); //將指標(biāo)從檔案開頭往後移動10位元14 fgets(substr,5,fp); //從檔案指標(biāo)現(xiàn)在的位置讀取5個(gè)字元15 printf("Thesub-stringis'%s'\n",substr);16 fclose(fp); //關(guān)閉檔案17 system("pause");18 return0;19}範(fàn)例09-03-0201//Programname:0969-4二進(jìn)位檔9-4二進(jìn)位檔97文字檔被儲存在文字檔中的資料都是可以“看得見”的字元,可透過文字編輯器開啟而看到內(nèi)容文字檔在儲存換行字元’\n’時(shí),儲存兩個(gè)碼,一個(gè)是0x0d,另一個(gè)是0x0a所有文字檔的存取動作在遇到’\n’時(shí)都會自動轉(zhuǎn)換成0x0d和0x0a文字檔被儲存在文字檔中的資料都是可以“看得見”的字元,可透過98二進(jìn)位檔二進(jìn)位檔不會像文字檔一樣做換行字元的轉(zhuǎn)換,而是直接存入或讀取出檔案的內(nèi)容儲存的資料並不完全能“看得見”儲存數(shù)值資料時(shí),在文字檔和二進(jìn)位檔的儲存內(nèi)容就不一樣二進(jìn)位檔二進(jìn)位檔不會像文字檔一樣做換行字元的轉(zhuǎn)換,而是直接存99二進(jìn)位檔二進(jìn)位檔100二進(jìn)位檔二進(jìn)位檔1019-4.1二進(jìn)位檔的開啟使用fopen函式來開啟,在開啟模式的字串中,必須加上’b’字元//開啟二進(jìn)位檔test1.bin供寫入FILE*fp1=fopen(“test1.bin”,”wb”);//開啟二進(jìn)位檔test2.bin供讀取FILE*fp2=fopen(“test2.bin”,”rb”);//開啟二進(jìn)位檔test3.bin供增添FILE*fp3=fopen(“test3.bin”,”ab”);
9-4.1二進(jìn)位檔的開啟使用fopen函式來開啟,在開啟1029-4.2二進(jìn)位檔的讀寫fread和fwritefwrite【函式原型】size_tfwrite(constvoid*buffer,size_tsize,size_tcount,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】buffer:欲寫入資料的位址。size:寫入資料的大小。count:寫入次數(shù),或?qū)懭氲捻?xiàng)目數(shù)。strea
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度公司股東內(nèi)部關(guān)于企業(yè)社會責(zé)任履行共識協(xié)議3篇
- 二零二五農(nóng)村合作建房工程招投標(biāo)及合同管理協(xié)議
- 二零二五年度環(huán)保設(shè)施項(xiàng)目公司轉(zhuǎn)讓合同3篇
- 2025年度農(nóng)村公路養(yǎng)護(hù)與社區(qū)文化活動合同2篇
- 2025年度外賣配送公司送餐服務(wù)優(yōu)化合同3篇
- 2025年度公司與公司簽訂的智慧城市建設(shè)合作協(xié)議3篇
- 2025年度綠色養(yǎng)殖產(chǎn)業(yè)鏈合作協(xié)議書-養(yǎng)羊篇3篇
- 2025年度公司車輛充電設(shè)施建設(shè)及使用協(xié)議3篇
- 二零二五年度特色水果種植基地果園土地承包合同3篇
- 2025年度農(nóng)村土地流轉(zhuǎn)承包合同(農(nóng)產(chǎn)品品牌推廣)
- 遼寧省撫順市撫順縣2023-2024學(xué)年八年級上學(xué)期期末考試數(shù)學(xué)試卷(含解析)
- 《中國武術(shù)的起源》課件
- 期末測試卷(試題)(含答案)2024-2025學(xué)年北師大版數(shù)學(xué)五年級上冊
- 2024年道路運(yùn)輸安全生產(chǎn)管理制度樣本(5篇)
- 2024年度股權(quán)轉(zhuǎn)讓合同標(biāo)的及受讓方條件
- 起重機(jī)司機(jī)-特種設(shè)備操作Q2證考試練習(xí)題(含答案)
- 2024年《瘧疾防治知識》課件
- 礦業(yè)數(shù)字化轉(zhuǎn)型研究
- 《現(xiàn)代控制理論》全套課件(東北大學(xué))
- 2024春季中鐵三局集團(tuán)校園招聘高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 出版社圖書編輯出版流程規(guī)范
評論
0/150
提交評論