檔案處理培訓(xùn)講義課件_第1頁
檔案處理培訓(xùn)講義課件_第2頁
檔案處理培訓(xùn)講義課件_第3頁
檔案處理培訓(xùn)講義課件_第4頁
檔案處理培訓(xùn)講義課件_第5頁
已閱讀5頁,還剩107頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quá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)檔案處理方面的標準函式皆宣告在stdio.h中,使用時必須將它include進來才能使用9-1.1資料流的概念有關(guān)檔案處理方面的標準函式皆宣告在s59-1.2檔案自定型態(tài)結(jié)構(gòu)FILE對某個檔案進行I/O處理時,皆須以FILE型態(tài)宣告一個檔案指標來處理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對某個檔案進行I/O處69-1.2檔案自定型態(tài)結(jié)構(gòu)FILE檔案被開啟後將以一個FILE型態(tài)的指標作為操作控制者,它就是一個指向這個檔案處理的相關(guān)資訊的指標宣告舉例:FILE*fhandler;此操作控制者就是該檔案的“代表”9-1.2檔案自定型態(tài)結(jié)構(gòu)FILE檔案被開啟後將以一個F79-1.3檔案資料緩衝區(qū)檔案一旦被開啟後,系統(tǒng)將配置一塊記憶體當(dāng)作檔案資料存取的緩衝區(qū)緩衝區(qū)(buffer)讓檔案的部分資料先讀取到此區(qū)中,一旦需要存取資料時,先到此區(qū)中尋找或暫時的寫入如果緩衝區(qū)中找不到要讀取的資料,或者寫入的資料已經(jīng)滿了(超過緩衝區(qū)的大?。?,則系統(tǒng)才會到磁碟機中的磁碟片尋找或真正的寫入檔案中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)指標FILE*,若開啟失敗則傳回NULLmode:檔案開啟的模式字串。這是一個字串常數(shù),不同的字元代表不同的意義,開啟的檔案模式也不同。9-2.1檔案的開啟fopen【函式原型】FILE*f12mode字元的意義mode字元的意義13mode字元的意義上述三種字元也可以搭配“+”、“b”和“t”三個字元而有不同的開啟檔案模式:“+”:表示可讓檔案同時供讀取和寫入,稱為修改模式?!癰”:開啟檔案為二進位檔案(binaryfile)?!皌”:開啟檔案為文字檔(textfile),可省略不寫。mode字元的意義上述三種字元也可以搭配“+”、“b”和14範例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}範例09-02-01.C01//Programname159-2.2檔案的關(guān)閉fclose【函式原型】intfclose(FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲關(guān)閉檔案的資料流指標?!竟δ堋筷P(guān)閉檔案。【傳回值】檔案關(guān)閉成功則傳回0,失敗則傳回EOF。EOF是一個巨集,其定義值為-1。9-2.2檔案的關(guān)閉fclose【函式原型】intfc169-2.3讀寫檔案單一字元fgetc和fputc【函式原型】intfgetc(FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標?!竟δ堋繌臋n案中讀取一個字元?!緜骰刂怠孔x取成功時傳回所讀取字元的ASCII碼,以整數(shù)型態(tài)傳回之;若已經(jīng)讀取到檔案結(jié)束標記EOF或讀取失敗將傳回EOF(值為-1)。9-2.3讀寫檔案單一字元fgetc和fputc【函式原17範例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}範例09-02-0301//Programname:0918【函式原型】intfputc(intc,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標。

c:欲寫入的字元。【功能】寫入一個字元到檔案資料流?!緜骰刂怠繉懭氤晒r傳回所寫入字元的ASCII碼,以整數(shù)型態(tài)傳回之;若寫入失敗則傳回EOF(值為-1)?!竞皆汀縤ntfputc(intc,FILE*19範例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}範例09-02-03B01//Programname:20範例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}範例09-02-03B16fclose(fp1);21範例09-02-03C設(shè)計一個可以複製檔案的程式。使用者輸入欲複製的檔案名稱(來源檔案名稱),以及複製後新的檔案名稱(目的檔案名稱),程式便可運作。範例09-02-03C設(shè)計一個可以複製檔案的程式。使用者輸22範例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;範例09-02-03C01//Programname:23範例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}範例09-02-03C18}249-2.4讀寫檔案字串fgets和fputs【函式原型】char*fgets(char*string,intn,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】string:讀取字串後欲存放的位置,通常是一個字元陣列變數(shù),或者是字串變數(shù)。

n:最大讀取的字元數(shù)。stream:欲讀取資料的檔案資料流指標?!竟δ堋繌臋n案資料流讀取字串。fgets將從目前檔案資料流指標所在位置開始讀取n-1個字元,因為要保留最後一個字元寫入字串結(jié)尾標記’\0’。若在過程中讀取到newline字元,也就是換行字元’\n’則將停止讀取?!緜骰刂怠亢綄骰厮x取到的字串指標,並將字串儲存在string中。若讀到檔尾,則會傳回NULL。9-2.4讀寫檔案字串fgets和fputs【函式原型】25範例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}範例09-02-03C01//Programname:26【函式原型】intfputs(constchar*string,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】string:讀取字串後欲存放的位置,通常是一個字元陣列變數(shù),或者是字串變數(shù)。stream:欲讀取資料的檔案資料流指標?!竟δ堋繉懭胍粋€字串到檔案資料流?!緜骰刂怠繉懭胝_的話會傳回非負整數(shù),通常是0;若寫入錯誤則傳回EOF?!竞皆汀縤ntfputs(constchar*s27範例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}範例01#include<stdio.h>289-2.5依格式讀寫檔案資料fprintf和fscanf【函式原型】intfprintf(FILE*stream,constchar*format[,argument]...);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲輸出資料的檔案資料流指標。format:和printf相同的格式字串與相對應(yīng)的資料儲存位址,請參考第六章6-4.4小節(jié)的介紹?!竟δ堋恳勒崭袷捷敵鲑Y料到檔案資料流?!緜骰刂怠繉懭胝_的話會傳輸出(寫入)到檔案資料流的byte數(shù);若寫入錯誤則傳回一個負數(shù)。9-2.5依格式讀寫檔案資料fprintf和fscanf29範例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); //儲存浮點數(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}範例09-02-05A01//Programname:030【函式原型】intfscanf(FILE*stream,constchar*format[,argument]...);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標。format:和scanf相同的格式字串與相對應(yīng)的資料儲存位址,請參考第六章6-4.4小節(jié)的介紹?!竟δ堋恳勒崭袷綇臋n案資料流stream格式化讀取到argument中?!緜骰刂怠咳裟苷_地從檔案資料流中讀取到資料,會傳回有多少argument被指定資料;若傳回值為0則表示沒有任何資料被指定到argument中;若讀取失敗則傳回EOF?!竞皆汀縤ntfscanf(FILE*stream31範例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); //讀取浮點數(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}範例09-02-05B01//Programname:329-3循序檔與隨機檔9-3循序檔與隨機檔339-3循序檔與隨機檔循序檔9-3循序檔與隨機檔循序檔349-3循序檔與隨機檔隨機檔9-3循序檔與隨機檔隨機檔359-3.1認識循序檔與隨機檔循序檔的儲存方式是將資料一筆接著一筆存放,每一筆的大小可以不相同讀取時,必須注意當(dāng)時存放的順序、資料型態(tài)和大小,以便順利將每一筆資料分別取出9-3.1認識循序檔與隨機檔循序檔的儲存方式是將資料一筆369-3.1認識循序檔與隨機檔隨機檔的每項資料的長度大小都是固定的,若有資料超過這個長度,則資料有可能會被覆蓋遺失存取資料時,可以直接透過運算直接將指標移到該處9-3.1認識循序檔與隨機檔隨機檔的每項資料的長度大小都是379-3.2檔案位置指標C語言為了提供隨機檔的存取機制,在檔案結(jié)構(gòu)FILE中提供了檔案位置指標_ptr記錄目前檔案讀寫的位置移動此指標到檔案資料流中適當(dāng)?shù)奈恢?,再透過fputc、fputs、fgetc和fgets從這個位置開始存取9-3.2檔案位置指標C語言為了提供隨機檔的存取機制,在38fseek【函式原型】intfseek(FILE*stream,longoffset,intorigin);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標。offset:從origin開始偏移的位元數(shù)(bytes)。origin:指標位址計算的起始參考位置。包括下列三個位置巨集值:SEEK_CUR:目前檔案指標所在位置。SEEK_END:檔案結(jié)尾。SEEK_SET:檔案開頭?!竟δ堋恳苿訖n案指標至特定的位置?!緜骰刂怠咳粢苿又笜顺晒t傳回0,否則傳回一個非0的值。fseek【函式原型】intfseek(FILE*st39範例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); //將指標從檔案開頭往後移動10位元14 fgets(substr,5,fp); //從檔案指標現(xiàn)在的位置讀取5個字元15 printf("Thesub-stringis'%s'\n",substr);16 fclose(fp); //關(guān)閉檔案17 system("pause");18 return0;19}範例09-03-0201//Programname:0409-4二進位檔9-4二進位檔41文字檔被儲存在文字檔中的資料都是可以“看得見”的字元,可透過文字編輯器開啟而看到內(nèi)容文字檔在儲存換行字元’\n’時,儲存兩個碼,一個是0x0d,另一個是0x0a所有文字檔的存取動作在遇到’\n’時都會自動轉(zhuǎn)換成0x0d和0x0a文字檔被儲存在文字檔中的資料都是可以“看得見”的字元,可透過42二進位檔二進位檔不會像文字檔一樣做換行字元的轉(zhuǎn)換,而是直接存入或讀取出檔案的內(nèi)容儲存的資料並不完全能“看得見”儲存數(shù)值資料時,在文字檔和二進位檔的儲存內(nèi)容就不一樣二進位檔二進位檔不會像文字檔一樣做換行字元的轉(zhuǎn)換,而是直接存43二進位檔二進位檔44二進位檔二進位檔459-4.1二進位檔的開啟使用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.1二進位檔的開啟使用fopen函式來開啟,在開啟469-4.2二進位檔的讀寫fread和fwritefwrite【函式原型】size_tfwrite(constvoid*buffer,size_tsize,size_tcount,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】buffer:欲寫入資料的位址。size:寫入資料的大小。count:寫入次數(shù),或?qū)懭氲捻椖繑?shù)。stream:欲寫入資料的檔案資料流指標?!竟δ堋縡write函式可將大小為size(單位是byte)的資料,寫入到檔案資料流stream中count次?!緜骰刂怠總骰貙懭氲捻椖看螖?shù)。9-4.2二進位檔的讀寫fread和fwritefwri47fread【函式原型】size_tfread(void*buffer,size_tsize,size_tcount,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】buffer:讀取後資料存放的位址。size:讀取資料的大小。count:讀取次數(shù),或讀取的項目數(shù)。stream:欲讀取資料的檔案資料流指標?!竟δ堋縡read的動作和fwrite相反,fread函式可從檔案資料流stream中讀取將大小為size(單位是byte)的資料count次。【傳回值】傳回讀取到的項目次數(shù)。fread【函式原型】size_tfread(void*48範例09-04-02A01//Programname:09-04-02A.c02#include<stdio.h>03#include<stdlib.h>04intmain()05{06charperson1[5][8]={"項少龍","秦清","烏廷芳","嫪毐","秦始皇"};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}範例09-04-02A01//Programname:49範例09-04-02B設(shè)計一個可以儲存學(xué)生資料的結(jié)構(gòu),並事先給定3個學(xué)生的初值,將這些資料以二進位檔的方式儲存,檔名為struct.bin。接著再開啟這個檔案,讀取當(dāng)中的資料,並列印在螢?zāi)簧?。學(xué)生結(jié)構(gòu):structSTUDENT{ longid; //學(xué)號

charname[20]; //姓名

shortage; //年齡

floatheight; //身高

floatweight; //體重};初值設(shè)定可自行決定。範例09-04-02B設(shè)計一個可以儲存學(xué)生資料的結(jié)構(gòu),並事50範例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,"項少龍",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範例09-04-02B01//Programname:51範例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}

範例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)檔案處理方面的標準函式皆宣告在stdio.h中,使用時必須將它include進來才能使用9-1.1資料流的概念有關(guān)檔案處理方面的標準函式皆宣告在s619-1.2檔案自定型態(tài)結(jié)構(gòu)FILE對某個檔案進行I/O處理時,皆須以FILE型態(tài)宣告一個檔案指標來處理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對某個檔案進行I/O處629-1.2檔案自定型態(tài)結(jié)構(gòu)FILE檔案被開啟後將以一個FILE型態(tài)的指標作為操作控制者,它就是一個指向這個檔案處理的相關(guān)資訊的指標宣告舉例:FILE*fhandler;此操作控制者就是該檔案的“代表”9-1.2檔案自定型態(tài)結(jié)構(gòu)FILE檔案被開啟後將以一個F639-1.3檔案資料緩衝區(qū)檔案一旦被開啟後,系統(tǒng)將配置一塊記憶體當(dāng)作檔案資料存取的緩衝區(qū)緩衝區(qū)(buffer)讓檔案的部分資料先讀取到此區(qū)中,一旦需要存取資料時,先到此區(qū)中尋找或暫時的寫入如果緩衝區(qū)中找不到要讀取的資料,或者寫入的資料已經(jīng)滿了(超過緩衝區(qū)的大?。瑒t系統(tǒng)才會到磁碟機中的磁碟片尋找或真正的寫入檔案中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)指標FILE*,若開啟失敗則傳回NULLmode:檔案開啟的模式字串。這是一個字串常數(shù),不同的字元代表不同的意義,開啟的檔案模式也不同。9-2.1檔案的開啟fopen【函式原型】FILE*f68mode字元的意義mode字元的意義69mode字元的意義上述三種字元也可以搭配“+”、“b”和“t”三個字元而有不同的開啟檔案模式:“+”:表示可讓檔案同時供讀取和寫入,稱為修改模式?!癰”:開啟檔案為二進位檔案(binaryfile)?!皌”:開啟檔案為文字檔(textfile),可省略不寫。mode字元的意義上述三種字元也可以搭配“+”、“b”和70範例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}範例09-02-01.C01//Programname719-2.2檔案的關(guān)閉fclose【函式原型】intfclose(FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲關(guān)閉檔案的資料流指標?!竟δ堋筷P(guān)閉檔案?!緜骰刂怠繖n案關(guān)閉成功則傳回0,失敗則傳回EOF。EOF是一個巨集,其定義值為-1。9-2.2檔案的關(guān)閉fclose【函式原型】intfc729-2.3讀寫檔案單一字元fgetc和fputc【函式原型】intfgetc(FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標?!竟δ堋繌臋n案中讀取一個字元?!緜骰刂怠孔x取成功時傳回所讀取字元的ASCII碼,以整數(shù)型態(tài)傳回之;若已經(jīng)讀取到檔案結(jié)束標記EOF或讀取失敗將傳回EOF(值為-1)。9-2.3讀寫檔案單一字元fgetc和fputc【函式原73範例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}範例09-02-0301//Programname:0974【函式原型】intfputc(intc,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標。

c:欲寫入的字元?!竟δ堋繉懭胍粋€字元到檔案資料流。【傳回值】寫入成功時傳回所寫入字元的ASCII碼,以整數(shù)型態(tài)傳回之;若寫入失敗則傳回EOF(值為-1)?!竞皆汀縤ntfputc(intc,FILE*75範例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}範例09-02-03B01//Programname:76範例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}範例09-02-03B16fclose(fp1);77範例09-02-03C設(shè)計一個可以複製檔案的程式。使用者輸入欲複製的檔案名稱(來源檔案名稱),以及複製後新的檔案名稱(目的檔案名稱),程式便可運作。範例09-02-03C設(shè)計一個可以複製檔案的程式。使用者輸78範例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;範例09-02-03C01//Programname:79範例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}範例09-02-03C18}809-2.4讀寫檔案字串fgets和fputs【函式原型】char*fgets(char*string,intn,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】string:讀取字串後欲存放的位置,通常是一個字元陣列變數(shù),或者是字串變數(shù)。

n:最大讀取的字元數(shù)。stream:欲讀取資料的檔案資料流指標?!竟δ堋繌臋n案資料流讀取字串。fgets將從目前檔案資料流指標所在位置開始讀取n-1個字元,因為要保留最後一個字元寫入字串結(jié)尾標記’\0’。若在過程中讀取到newline字元,也就是換行字元’\n’則將停止讀取?!緜骰刂怠亢綄骰厮x取到的字串指標,並將字串儲存在string中。若讀到檔尾,則會傳回NULL。9-2.4讀寫檔案字串fgets和fputs【函式原型】81範例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}範例09-02-03C01//Programname:82【函式原型】intfputs(constchar*string,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】string:讀取字串後欲存放的位置,通常是一個字元陣列變數(shù),或者是字串變數(shù)。stream:欲讀取資料的檔案資料流指標?!竟δ堋繉懭胍粋€字串到檔案資料流?!緜骰刂怠繉懭胝_的話會傳回非負整數(shù),通常是0;若寫入錯誤則傳回EOF?!竞皆汀縤ntfputs(constchar*s83範例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}範例01#include<stdio.h>849-2.5依格式讀寫檔案資料fprintf和fscanf【函式原型】intfprintf(FILE*stream,constchar*format[,argument]...);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲輸出資料的檔案資料流指標。format:和printf相同的格式字串與相對應(yīng)的資料儲存位址,請參考第六章6-4.4小節(jié)的介紹?!竟δ堋恳勒崭袷捷敵鲑Y料到檔案資料流?!緜骰刂怠繉懭胝_的話會傳輸出(寫入)到檔案資料流的byte數(shù);若寫入錯誤則傳回一個負數(shù)。9-2.5依格式讀寫檔案資料fprintf和fscanf85範例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); //儲存浮點數(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}範例09-02-05A01//Programname:086【函式原型】intfscanf(FILE*stream,constchar*format[,argument]...);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標。format:和scanf相同的格式字串與相對應(yīng)的資料儲存位址,請參考第六章6-4.4小節(jié)的介紹?!竟δ堋恳勒崭袷綇臋n案資料流stream格式化讀取到argument中?!緜骰刂怠咳裟苷_地從檔案資料流中讀取到資料,會傳回有多少argument被指定資料;若傳回值為0則表示沒有任何資料被指定到argument中;若讀取失敗則傳回EOF。【函式原型】intfscanf(FILE*stream87範例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); //讀取浮點數(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}範例09-02-05B01//Programname:889-3循序檔與隨機檔9-3循序檔與隨機檔899-3循序檔與隨機檔循序檔9-3循序檔與隨機檔循序檔909-3循序檔與隨機檔隨機檔9-3循序檔與隨機檔隨機檔919-3.1認識循序檔與隨機檔循序檔的儲存方式是將資料一筆接著一筆存放,每一筆的大小可以不相同讀取時,必須注意當(dāng)時存放的順序、資料型態(tài)和大小,以便順利將每一筆資料分別取出9-3.1認識循序檔與隨機檔循序檔的儲存方式是將資料一筆929-3.1認識循序檔與隨機檔隨機檔的每項資料的長度大小都是固定的,若有資料超過這個長度,則資料有可能會被覆蓋遺失存取資料時,可以直接透過運算直接將指標移到該處9-3.1認識循序檔與隨機檔隨機檔的每項資料的長度大小都是939-3.2檔案位置指標C語言為了提供隨機檔的存取機制,在檔案結(jié)構(gòu)FILE中提供了檔案位置指標_ptr記錄目前檔案讀寫的位置移動此指標到檔案資料流中適當(dāng)?shù)奈恢?,再透過fputc、fputs、fgetc和fgets從這個位置開始存取9-3.2檔案位置指標C語言為了提供隨機檔的存取機制,在94fseek【函式原型】intfseek(FILE*stream,longoffset,intorigin);【表頭檔】<stdio.h>【參數(shù)說明】stream:欲讀取資料的檔案資料流指標。offset:從origin開始偏移的位元數(shù)(bytes)。origin:指標位址計算的起始參考位置。包括下列三個位置巨集值:SEEK_CUR:目前檔案指標所在位置。SEEK_END:檔案結(jié)尾。SEEK_SET:檔案開頭?!竟δ堋恳苿訖n案指標至特定的位置。【傳回值】若移動指標成功則傳回0,否則傳回一個非0的值。fseek【函式原型】intfseek(FILE*st95範例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); //將指標從檔案開頭往後移動10位元14 fgets(substr,5,fp); //從檔案指標現(xiàn)在的位置讀取5個字元15 printf("Thesub-stringis'%s'\n",substr);16 fclose(fp); //關(guān)閉檔案17 system("pause");18 return0;19}範例09-03-0201//Programname:0969-4二進位檔9-4二進位檔97文字檔被儲存在文字檔中的資料都是可以“看得見”的字元,可透過文字編輯器開啟而看到內(nèi)容文字檔在儲存換行字元’\n’時,儲存兩個碼,一個是0x0d,另一個是0x0a所有文字檔的存取動作在遇到’\n’時都會自動轉(zhuǎn)換成0x0d和0x0a文字檔被儲存在文字檔中的資料都是可以“看得見”的字元,可透過98二進位檔二進位檔不會像文字檔一樣做換行字元的轉(zhuǎn)換,而是直接存入或讀取出檔案的內(nèi)容儲存的資料並不完全能“看得見”儲存數(shù)值資料時,在文字檔和二進位檔的儲存內(nèi)容就不一樣二進位檔二進位檔不會像文字檔一樣做換行字元的轉(zhuǎn)換,而是直接存99二進位檔二進位檔100二進位檔二進位檔1019-4.1二進位檔的開啟使用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.1二進位檔的開啟使用fopen函式來開啟,在開啟1029-4.2二進位檔的讀寫fread和fwritefwrite【函式原型】size_tfwrite(constvoid*buffer,size_tsize,size_tcount,FILE*stream);【表頭檔】<stdio.h>【參數(shù)說明】buffer:欲寫入資料的位址。size:寫入資料的大小。count:寫入次數(shù),或?qū)懭氲捻椖繑?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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論