《档案处理培训讲义PPT课件》由会员分享,可在线阅读,更多相关《档案处理培训讲义PPT课件(54页珍藏版)》请在金锄头文库上搜索。
1、档案处理培训讲义9-1檔案處理的概念 9-1檔案處理的概念 n檔案處理在電腦裡的概念就是在處理檔案I/O(Input/Output),也就是檔案的輸入與輸出n檔案輸入看成為讀取檔案(read),檔案輸出看成為寫入檔案(write) 9-1.1資料流的概念 n資料流的概念是將檔案看做是一連串的位元組(byte)排列起來資料 n對檔案的寫入或讀出就是對資料流的寫入與讀出 9-1.1資料流的概念n有關檔案處理方面的標準函式皆宣告在stdio.h中,使用時必須將它include進來才能使用 9-1.2檔案自定型態結構FILE n對某個檔案進行I/O處理時,皆須以FILE型態宣告一個檔案指標來處理 ty
2、pedef struct _iobufchar* _ptr;int_cnt;char* _base;int_flag;int_file;int_charbuf;int_bufsiz;char* _tmpfname; FILE;FILE的原型宣告的原型宣告9-1.2檔案自定型態結構FILE n檔案被開啟後將以一個FILE型態的指標作為操作控制者,它就是一個指向這個檔案處理的相關資訊的指標 n宣告舉例:FILE *fhandler;此操作控制者就是該檔案的此操作控制者就是該檔案的“代表代表” 9-1.3檔案資料緩衝區 n檔案一旦被開啟後,系統將配置一塊記憶體當作檔案資料存取的緩衝區 n緩衝區(bu
3、ffer)讓檔案的部分資料先讀取到此區中,一旦需要存取資料時,先到此區中尋找或暫時的寫入n如果緩衝區中找不到要讀取的資料,或者寫入的資料已經滿了(超過緩衝區的大小),則系統才會到磁碟機中的磁碟片尋找或真正的寫入檔案中 9-1.3檔案資料緩衝區 9-2檔案處理函式 9-2檔案處理函式nC函式庫中提供的檔案處理函式都宣告在stdio.h檔 9-2.1檔案的開啟fopen 【函式原型】FILE *fopen( const char *filename, const char *mode );【表 頭 檔】【功能】開啟檔案【傳 回 值】檔案結構指標FILE *,若開啟失敗則傳回NULLmode:檔案開
4、啟的模式字串。這是一個字串常數,不同的字元代表不同的意義,開啟的檔案模式也不同。mode 字元的意義mode 字元的意義n上述三種字元也可以搭配“+”、 “b”和“t”三個字元而有不同的開啟檔案模式:“+”:表示可讓檔案同時供讀取和寫入,稱為修改模式。“b”:開啟檔案為二進位檔案(binary file)。“t”:開啟檔案為文字檔(text file),可省略不寫。 範例09-02-01.C 01 /Program name:09-02-01.c02 #include 03 #include 04 int main()05 06 FILE *fp=fopen(09-02-01.txt,w);
5、/開啟檔案開啟檔案07 char s1=Happy Birthday to you!;08 char s250;09 int i=0;10 fputs( s1, fp ); /將字串寫入檔案將字串寫入檔案11 fclose(fp); /關閉檔案關閉檔案12 fp=fopen(09-02-01.txt,r); /開啟檔案開啟檔案13 fgets(s2,50,fp); /從檔案讀取字串到從檔案讀取字串到s214 printf(The string in file 09-02-01.txt is:n%sn, s2);15 fclose(fp); /關閉檔案關閉檔案16 system(PAUSE);1
6、7 return 0;18 9-2.2檔案的關閉fclose 【函式原型】int fclose( FILE *stream );【表 頭 檔】【參數說明】stream:欲關閉檔案的資料流指標。【功能】關閉檔案。【傳 回 值】檔案關閉成功則傳回0,失敗則傳回EOF。EOF是一個巨集,其定義值為-1。 9-2.3讀寫檔案單一字元fgetc和fputc 【函式原型】int fgetc( FILE *stream );【表 頭 檔】【參數說明】stream:欲讀取資料的檔案資料流指標。【功能】從檔案中讀取一個字元。【傳 回 值】讀取成功時傳回所讀取字元的ASCII碼,以整數型態傳回之;若已經讀取到檔案
7、結束標記EOF或讀取失敗將傳回EOF(值為-1)。範例09-02-0301 /Program name:09-02-03.c02 #include 03 #include 04 int main()05 06 FILE *f=fopen(testtext.txt,r);07 int count=0;08 char c;09 while (c=fgetc(f)!=EOF)10 11 printf(%c,c);12 count+;13 14 printf(nThere are %d characters in this file., count);15 fclose(f);16 system(pa
8、use);17 return 0;18 【函式原型】int fputc( int c, FILE *stream );【表 頭 檔】【參數說明】stream:欲讀取資料的檔案資料流指標。c:欲寫入的字元。【功能】寫入一個字元到檔案資料流。【傳 回 值】寫入成功時傳回所寫入字元的ASCII碼,以整數型態傳回之;若寫入失敗則傳回EOF(值為-1)。範例09-02-03B 01 /Program name:09-02-03B.c02 #include 03 #include 04 int main()05 06 FILE *fp1=fopen(fputctest.txt,w),*fp2;07 cha
9、r s=This is a test string for fputc function.;08 int i=0;09 char c;10 /*寫入字元到檔案資料流*/11 while(si!=0)12 13 fputc(si,fp1);14 i+;15 範例09-02-03B 16 fclose(fp1);17 /*從檔案資料流讀取字元*/18 fp2=fopen(fputctest.txt,r);19 i=0;20 c=fgetc(fp2);21 while(c!=EOF)22 23 printf(%c,c);24 c=fgetc(fp2);25 26 system(PAUSE);27 r
10、eturn 0;28 範例09-02-03C n設計一個可以複製檔案的程式。使用者輸入欲複製的檔案名稱(來源檔案名稱),以及複製後新的檔案名稱(目的檔案名稱),程式便可運作。 範例09-02-03C 01 /Program name:09-02-03C.c02 #include 03 #include 04 int main()05 06 FILE *fs,*fd;07 char sfilename20,dfilename20;08 char c;09 printf(請輸入來源檔案名稱:);10 scanf(%s,sfilename);11 printf(請輸入目的檔案名稱:);12 scan
11、f(%s,dfilename);13 if(fs=fopen(sfilename,r)=NULL)14 15 printf(來源檔案無法開啟!);16 system(pause);17 return 0;範例09-02-03C 18 19 if(fd=fopen(dfilename,w)=NULL)20 21 printf(目的檔案無法開啟!);22 system(pause);23 return 0;24 25 while(c=fgetc(fs)!=EOF)26 fputc(c,fd);27 fclose(fs);28 fclose(fd);29 printf(拷貝完成!);30 syste
12、m(PAUSE);31 return 0;32 9-2.4讀寫檔案字串fgets和fputs 【函式原型】char *fgets( char *string, int n, FILE *stream );【表 頭 檔】【參數說明】string:讀取字串後欲存放的位置,通常是一個字元陣列變數,或者是字串變數。n:最大讀取的字元數。 stream:欲讀取資料的檔案資料流指標。【功能】從檔案資料流讀取字串。fgets將從目前檔案資料流指標所在位置開始讀取n-1個字元,因為要保留最後一個字元寫入字串結尾標記0。若在過程中讀取到newline字元,也就是換行字元n則將停止讀取。【傳 回 值】函式將傳回所
13、讀取到的字串指標,並將字串儲存在string中。若讀到檔尾,則會傳回NULL。範例09-02-03C 01 /Program name:09-02-03C.c02 #include 03 #include 04 int main()05 06 FILE *fp=fopen(testtext.txt,r);07 int n=50,i;08 char s100;09 for (i=0;i3;i+)10 11 fgets(s,n,fp);12 printf(%s,s);13 14 fclose(fp);15 system(pause);16 return 0;17 【函式原型】int fputs(
14、const char *string, FILE *stream );【表 頭 檔】【參數說明】string:讀取字串後欲存放的位置,通常是一個字元陣列變數,或者是字串變數。 stream:欲讀取資料的檔案資料流指標。【功能】寫入一個字串到檔案資料流。【傳 回 值】寫入正確的話會傳回非負整數,通常是0;若寫入錯誤則傳回EOF。 範例01 #include 02 #include 03 int main()04 05 FILE *fp=fopen(fputstest.txt,w);06 char s=This is the test string for fputs.;07 fputs(s,fp
15、);08 fclose(fp);09 system(pause);10 return 0;11 9-2.5依格式讀寫檔案資料fprintf和fscanf 【函式原型】int fprintf( FILE *stream, const char *format , argument .);【表 頭 檔】【參數說明】stream:欲輸出資料的檔案資料流指標。 format:和printf相同的格式字串與相對應的資料儲存位址,請參考第六章6-4.4小節的介紹。【功能】依照格式輸出資料到檔案資料流。【傳 回 值】寫入正確的話會傳輸出(寫入)到檔案資料流的byte數;若寫入錯誤則傳回一個負數。範例09-0
16、2-05A01 /Program name:09-02-05A.c02 #include 03 #include 04 int main()05 06 int i=120;07 float f=3.14f;08 unsigned ui=91001;09 char s=Happy Birthday;10FILE *fp=fopen(fprintftest.txt,w);11fprintf(fp,int=%dn,i);/儲存整數格式資料儲存整數格式資料12fprintf(fp,float=%fn,f);/儲存浮點數格式資料儲存浮點數格式資料13fprintf(fp,unsigned=%dn,ui)
17、;/儲存無符整數格式資料儲存無符整數格式資料14fprintf(fp,string=%sn,s);/儲存字串資料儲存字串資料15fclose(fp);16system(pause);17return 0;18 【函式原型】int fscanf( FILE *stream, const char *format , argument . );【表 頭 檔】【參數說明】stream:欲讀取資料的檔案資料流指標。 format:和scanf相同的格式字串與相對應的資料儲存位址,請參考第六章6-4.4小節的介紹。【功能】依照格式從檔案資料流stream格式化讀取到argument中。【傳 回 值】若能
18、正確地從檔案資料流中讀取到資料,會傳回有多少argument被指定資料;若傳回值為0則表示沒有任何資料被指定到argument中;若讀取失敗則傳回EOF。範例09-02-05B 01 /Program name:09-02-05B.c02 #include 03 #include 04 int main()05 06 int i;07 float f;08 unsigned ui;09 char s15;10FILE *fp=fopen(fprintftest.txt,r);11fscanf(fp,int=%dn,&i);/讀取整數格式資料讀取整數格式資料12fscanf(fp,float=%
19、fn,&f);/讀取浮點數格式資料讀取浮點數格式資料13fscanf(fp,unsigned=%dn,&ui);/讀取無符整數格式資料讀取無符整數格式資料14fscanf(fp,string=%sn,s);/讀取字串資料讀取字串資料15fclose(fp);16printf(int=%dn,i);17printf(float=%fn,f);18printf(unsigned=%dn,ui);19printf(string=%sn,s);20system(pause);21return 0;22 9-3循序檔與隨機檔 9-3循序檔與隨機檔 n循序檔9-3循序檔與隨機檔n隨機檔9-3.1認識循序檔
20、與隨機檔 n循序檔的儲存方式是將資料一筆接著一筆存放,每一筆的大小可以不相同 n讀取時,必須注意當時存放的順序、資料型態和大小,以便順利將每一筆資料分別取出 9-3.1認識循序檔與隨機檔n隨機檔的每項資料的長度大小都是固定的,若有資料超過這個長度,則資料有可能會被覆蓋遺失 n存取資料時,可以直接透過運算直接將指標移到該處 9-3.2檔案位置指標 nC語言為了提供隨機檔的存取機制,在檔案結構FILE中提供了檔案位置指標_ptr記錄目前檔案讀寫的位置 n移動此指標到檔案資料流中適當的位置,再透過fputc、fputs、fgetc和fgets從這個位置開始存取 fseek【函式原型】int fsee
21、k( FILE *stream, long offset, int origin );【表 頭 檔】 【參數說明】stream:欲讀取資料的檔案資料流指標。 offset:從origin開始偏移的位元數(bytes)。 origin:指標位址計算的起始參考位置。包括下列三個位置巨集值: SEEK_CUR:目前檔案指標所在位置。 SEEK_END:檔案結尾。 SEEK_SET:檔案開頭。【功能】移動檔案指標至特定的位置。【傳 回 值】若移動指標成功則傳回0,否則傳回一個非0的值。範例09-03-02 01 /Program name:09-03-02.c02 #include 03 #inclu
22、de 04 int main()05 06 char str=This is a test string.;07 char substr10;/用來儲存讀取到的部分字串用來儲存讀取到的部分字串08 FILE *fp=fopen(test.txt,w);/開啟檔案供寫入字串開啟檔案供寫入字串09 fputs(str,fp); /將字串將字串str寫入檔案寫入檔案10fclose(fp);/關閉檔案關閉檔案1112fp=fopen(test.txt,r);/開啟檔案以供讀取開啟檔案以供讀取13fseek(fp,10,SEEK_SET); /將指標從檔案開頭往後移動將指標從檔案開頭往後移動10位元位
23、元14fgets(substr,5,fp);/從檔案指標現在的位置讀取從檔案指標現在的位置讀取5個字元個字元15printf(The sub-string is %sn,substr);16fclose(fp);/關閉檔案關閉檔案17system(pause);18return 0;19 9-4二進位檔 文字檔n被儲存在文字檔中的資料都是可以“看得見”的字元,可透過文字編輯器開啟而看到內容n文字檔在儲存換行字元n時,儲存兩個碼,一個是0x0d,另一個是0x0an所有文字檔的存取動作在遇到n時都會自動轉換成0x0d和0x0a 二進位檔n二進位檔不會像文字檔一樣做換行字元的轉換,而是直接存入或讀取
24、出檔案的內容 n儲存的資料並不完全能“看得見” n儲存數值資料時,在文字檔和二進位檔的儲存內容就不一樣二進位檔二進位檔9-4.1二進位檔的開啟 n使用fopen函式來開啟,在開啟模式的字串中,必須加上b字元 /開啟二進位檔test1.bin供寫入FILE *fp1=fopen(“test1.bin”,”wb”);/開啟二進位檔test2.bin供讀取FILE *fp2=fopen(“test2.bin”,”rb”);/開啟二進位檔test3.bin供增添FILE *fp3=fopen(“test3.bin”,”ab”); 9-4.2二進位檔的讀寫fread和fwrite nfwrite【函式原
25、型】size_t fwrite(const void *buffer,size_t size,size_t count,FILE *stream);【表 頭 檔】【參數說明】buffer:欲寫入資料的位址。 size:寫入資料的大小。 count:寫入次數,或寫入的項目數。 stream:欲寫入資料的檔案資料流指標。【功能】fwrite 函式可將大小為size(單位是byte)的資料,寫入到檔案資料流stream中count次。【傳 回 值】傳回寫入的項目次數。nfread【函式原型】size_t fread(void *buffer,size_t size,size_t count,FILE
26、 *stream);【表 頭 檔】【參數說明】buffer:讀取後資料存放的位址。 size:讀取資料的大小。 count:讀取次數,或讀取的項目數。 stream:欲讀取資料的檔案資料流指標。【功能】fread的動作和fwrite相反,fread 函式可從檔案資料流stream中讀取將大小為size(單位是byte)的資料count次。【傳 回 值】傳回讀取到的項目次數。範例09-04-02A 01 /Program name:09-04-02A.c02 #include 03 #include 04 int main()05 06 char person158=項少龍項少龍,秦清秦清,烏廷
27、芳烏廷芳,嫪毐嫪毐,秦始皇秦始皇;07 char person258;08 int i;09 FILE *fp=fopen(array.bin,wb);10 fwrite(person1,8,5,fp);11 fclose(fp);1213 fp=fopen(array.bin,rb);14 fread(person2,8,5,fp);15 for (i=0;i5;i+)16 printf(%sn,person2i);17 fclose(fp);18 system(PAUSE);19 return 0;20 範例09-04-02B n設計一個可以儲存學生資料的結構,並事先給定3個學生的初值,將
28、這些資料以二進位檔的方式儲存,檔名為struct.bin。接著再開啟這個檔案,讀取當中的資料,並列印在螢幕上。學生結構:struct STUDENT long id;/學號char name20;/姓名short age;/年齡float height;/身高float weight;/體重;初值設定可自行決定。 範例09-04-02B 01 /Program name:09-04-02B.c02 #include 03 #include 04 struct STUDENT 05 long id;06 char name20;07 short age;08 float height;09 fl
29、oat weight;10 ;11 int main()12 13struct STUDENT st13=14910001,項少龍項少龍,25,174.5f,73.8f,15910002,秦清秦清,24,168.3f,52.5f,16910003,烏廷芳烏廷芳,24,168.3f,52.5f;17int c,i;18struct STUDENT st23;19FILE *fp;20 範例09-04-02B 21fp=fopen(struct.bin,wb);22c=fwrite(st1,sizeof(struct STUDENT),3,fp);23fclose(fp);24printf(The
30、re are %d record(s) to be written.n,c);2526fp=fopen(struct.bin,rb);27c=fread(st2,sizeof(struct STUDENT),3,fp);28printf(There are %d record(s) to be read.n,c);29fclose(fp);30for (i=0;i3;i+)3132printf(Record:%dn,i+1);33printf( ID:%dn,st2i.id);34printf( Name:%sn,st2i.name);35printf( Age:%dn,st2i.age);36printf( Height:%fn,st2i.height);37printf( Weight:%fn,st2i.weight);3839system(pause);40return 0;41 9-5關於檔案處理的二三事 9-5.1不可不知1:如何觀看檔案內容n使用文字編輯軟體,包括記事本、Word等n使用MS-DOS模式下的type命令來觀看