C語(yǔ)言程序設(shè)計(jì)-提高篇-第3章 文件-3_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)-提高篇-第3章 文件-3_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)-提高篇-第3章 文件-3_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)-提高篇-第3章 文件-3_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)-提高篇-第3章 文件-3_第5頁(yè)
已閱讀5頁(yè),還剩48頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、提高篇C語(yǔ)言程序設(shè)計(jì)提高篇第第3 3章章 文件文件 提高篇 文件分類文件分類 緩沖文件系統(tǒng)緩沖文件系統(tǒng) 文件的指針文件的指針 文件打開(kāi)與關(guān)閉文件打開(kāi)與關(guān)閉 文件應(yīng)用文件應(yīng)用提高篇1.概述文件的概念,非緩沖文件系統(tǒng)和緩沖文件系概述文件的概念,非緩沖文件系統(tǒng)和緩沖文件系統(tǒng);統(tǒng); 2.描述文件類型指針的概念及定義方法;描述文件類型指針的概念及定義方法;3.正確進(jìn)行文件的打開(kāi)和關(guān)閉操作,及對(duì)打開(kāi)和關(guān)正確進(jìn)行文件的打開(kāi)和關(guān)閉操作,及對(duì)打開(kāi)和關(guān)閉操作的錯(cuò)誤處理;閉操作的錯(cuò)誤處理;4.正確使用文件的讀寫操作,包括基于字節(jié),數(shù)據(jù)正確使用文件的讀寫操作,包括基于字節(jié),數(shù)據(jù)項(xiàng)等的讀寫操作;項(xiàng)等的讀寫操作;5.牢記

2、文件的隨機(jī)讀寫方法;牢記文件的隨機(jī)讀寫方法;6.正確使用文件訪問(wèn)的錯(cuò)誤檢測(cè)及處理方法;正確使用文件訪問(wèn)的錯(cuò)誤檢測(cè)及處理方法;提高篇文件是指存儲(chǔ)在外部介文件是指存儲(chǔ)在外部介質(zhì)上,且按文件名訪問(wèn)的質(zhì)上,且按文件名訪問(wèn)的一組信息序列一組信息序列提高篇文本文件文本文件(字符代碼文件或字符代碼文件或ASCII代碼文件代碼文件)由一個(gè)一個(gè)字符組成,每一個(gè)字符用一個(gè)由一個(gè)一個(gè)字符組成,每一個(gè)字符用一個(gè)ASCII代碼表示,如代碼表示,如123.45以以ASCII代碼形式存代碼形式存儲(chǔ)到磁盤需要儲(chǔ)到磁盤需要6個(gè)字節(jié)。個(gè)字節(jié)。特點(diǎn):可通過(guò)顯示器或打印機(jī)顯示,即可讀,特點(diǎn):可通過(guò)顯示器或打印機(jī)顯示,即可讀,比較直觀

3、。比較直觀。提高篇非文本文件非文本文件(二進(jìn)制文件二進(jìn)制文件)是指以數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式原樣輸出存是指以數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式原樣輸出存儲(chǔ)到磁盤上的文件。如儲(chǔ)到磁盤上的文件。如123.45在內(nèi)存中以浮點(diǎn)在內(nèi)存中以浮點(diǎn)數(shù)形式存儲(chǔ)占數(shù)形式存儲(chǔ)占4個(gè)字節(jié),不管一個(gè)實(shí)數(shù)多大都個(gè)字節(jié),不管一個(gè)實(shí)數(shù)多大都占占4個(gè)字節(jié)。個(gè)字節(jié)。特點(diǎn):節(jié)省存儲(chǔ)空間,輸入輸出無(wú)需轉(zhuǎn)換,特點(diǎn):節(jié)省存儲(chǔ)空間,輸入輸出無(wú)需轉(zhuǎn)換,速度快,不便閱讀。速度快,不便閱讀。提高篇00110110001100000011001100111000ASCII形式形式(6)(0)(3)(8)0011011000111000內(nèi)存形式內(nèi)存形式(6038

4、)0001011110010110二進(jìn)制形式二進(jìn)制形式提高篇說(shuō)明:說(shuō)明:一個(gè)一個(gè)C文件是一個(gè)字節(jié)流或二進(jìn)制流,它文件是一個(gè)字節(jié)流或二進(jìn)制流,它把數(shù)據(jù)看作是一連串的字符序列把數(shù)據(jù)看作是一連串的字符序列(字節(jié)字節(jié)),而不,而不考慮記錄的界限,即考慮記錄的界限,即C文件并不是由記錄組成文件并不是由記錄組成的。的。由于對(duì)文件的操作要與各種外部設(shè)備發(fā)生由于對(duì)文件的操作要與各種外部設(shè)備發(fā)生聯(lián)系,因此對(duì)文件的輸入輸出聯(lián)系,因此對(duì)文件的輸入輸出(讀寫讀寫)過(guò)程是通過(guò)程是通過(guò)操作系統(tǒng)來(lái)實(shí)現(xiàn)的。對(duì)文件的讀寫都是通過(guò)過(guò)操作系統(tǒng)來(lái)實(shí)現(xiàn)的。對(duì)文件的讀寫都是通過(guò)標(biāo)準(zhǔn)的標(biāo)準(zhǔn)的I/O函數(shù)進(jìn)行的。函數(shù)進(jìn)行的。提高篇緩沖文件系統(tǒng)

5、緩沖文件系統(tǒng)(又稱標(biāo)準(zhǔn)或高層文件系統(tǒng)又稱標(biāo)準(zhǔn)或高層文件系統(tǒng))特點(diǎn):對(duì)程序中的每一個(gè)文件都在內(nèi)存中開(kāi)特點(diǎn):對(duì)程序中的每一個(gè)文件都在內(nèi)存中開(kāi)辟一個(gè)辟一個(gè)“緩沖區(qū)緩沖區(qū)”。作用:從磁盤文件讀入的數(shù)據(jù)先到作用:從磁盤文件讀入的數(shù)據(jù)先到“輸入緩輸入緩沖區(qū)沖區(qū)”中,然后再?gòu)木彌_區(qū)依次將數(shù)據(jù)送給接中,然后再?gòu)木彌_區(qū)依次將數(shù)據(jù)送給接收變量。收變量。提高篇在向磁盤文件輸出數(shù)據(jù)時(shí),先將程序數(shù)據(jù)區(qū)在向磁盤文件輸出數(shù)據(jù)時(shí),先將程序數(shù)據(jù)區(qū)中變量或表達(dá)式的值送到中變量或表達(dá)式的值送到“輸出文件緩沖區(qū)輸出文件緩沖區(qū)”中,待裝滿后才一起輸出給磁盤文件。目的減中,待裝滿后才一起輸出給磁盤文件。目的減少對(duì)磁盤的讀寫次數(shù),即一次可

6、以讀入一批數(shù)少對(duì)磁盤的讀寫次數(shù),即一次可以讀入一批數(shù)據(jù)或輸出一批數(shù)據(jù)。據(jù)或輸出一批數(shù)據(jù)。變量變量a磁盤文件磁盤文件內(nèi)存內(nèi)存程序數(shù)據(jù)區(qū)程序數(shù)據(jù)區(qū)輸入文件緩輸入文件緩沖區(qū)沖區(qū)(512k)輸出文件緩輸出文件緩沖區(qū)沖區(qū)(512k)讀讀寫寫提高篇非緩沖文件系統(tǒng):不由系統(tǒng)自動(dòng)設(shè)置所非緩沖文件系統(tǒng):不由系統(tǒng)自動(dòng)設(shè)置所需緩沖區(qū),而由用戶根據(jù)需要設(shè)置。需緩沖區(qū),而由用戶根據(jù)需要設(shè)置。新的新的ANSI標(biāo)準(zhǔn)只建議使用緩沖系統(tǒng),并標(biāo)準(zhǔn)只建議使用緩沖系統(tǒng),并對(duì)緩沖文件系統(tǒng)的功能進(jìn)行了擴(kuò)充,使既對(duì)緩沖文件系統(tǒng)的功能進(jìn)行了擴(kuò)充,使既能用于處理字符代碼文件,也能處理二進(jìn)能用于處理字符代碼文件,也能處理二進(jìn)制文件。制文件。提高

7、篇對(duì)文件的操作是通過(guò)文件指針實(shí)現(xiàn)的,對(duì)文件的操作是通過(guò)文件指針實(shí)現(xiàn)的,關(guān)鍵的概念是關(guān)鍵的概念是“文件指針文件指針” 。調(diào)用一個(gè)文件需要的信息:調(diào)用一個(gè)文件需要的信息:文件當(dāng)前讀寫的位置;文件當(dāng)前讀寫的位置;與該文件對(duì)應(yīng)的內(nèi)存緩沖區(qū)的地址;與該文件對(duì)應(yīng)的內(nèi)存緩沖區(qū)的地址;緩沖區(qū)未被處理的字符數(shù)緩沖區(qū)未被處理的字符數(shù)(字符指針字符指針);文件的操作方式。文件的操作方式。提高篇系統(tǒng)內(nèi)部定義了一個(gè)系統(tǒng)內(nèi)部定義了一個(gè)FILE的結(jié)構(gòu)類型。的結(jié)構(gòu)類型。typedef structint_fd;/文件號(hào)文件號(hào)int_cleft;/緩沖區(qū)中剩余的字符緩沖區(qū)中剩余的字符int_mode;/文件操作方式文件操作方式

8、char *_nextc;/下一個(gè)字符位置下一個(gè)字符位置char *_buff;/文件緩沖區(qū)位置文件緩沖區(qū)位置FILE;提高篇 FILE類型類型 保存被使用的文件的有關(guān)信息保存被使用的文件的有關(guān)信息 所有的文件操作都需要所有的文件操作都需要FILE類型的指針類型的指針 FILE是庫(kù)文件中定義的結(jié)構(gòu)體的別是庫(kù)文件中定義的結(jié)構(gòu)體的別名名,FILE 定義在定義在stdio.h中中 注意不要寫成注意不要寫成struct FILE 舉例舉例 FILE *fp;提高篇文件必須先打開(kāi)后,并及時(shí)關(guān)閉文件必須先打開(kāi)后,并及時(shí)關(guān)閉1)打開(kāi)文件:是在用戶程序和操作系打開(kāi)文件:是在用戶程序和操作系統(tǒng)之間建立聯(lián)系,程序

9、要把操作的文統(tǒng)之間建立聯(lián)系,程序要把操作的文件的信息通知操作系統(tǒng),如文件名、件的信息通知操作系統(tǒng),如文件名、文件操作方式文件操作方式(讀寫讀寫)。提高篇讀文件:讀文件:需要先確定此文件是否存在,需要先確定此文件是否存在,并將讀當(dāng)前位置設(shè)定為文件的開(kāi)頭。并將讀當(dāng)前位置設(shè)定為文件的開(kāi)頭。寫文件:寫文件:需要檢查原來(lái)是否有同名文需要檢查原來(lái)是否有同名文件,如有則將該文件的原有內(nèi)容刪除,件,如有則將該文件的原有內(nèi)容刪除,如無(wú)同名文件就建立一個(gè)新文件,然如無(wú)同名文件就建立一個(gè)新文件,然后將寫當(dāng)前位置設(shè)定于文件的開(kāi)頭,后將寫當(dāng)前位置設(shè)定于文件的開(kāi)頭,以便從文件開(kāi)頭寫入數(shù)據(jù)。以便從文件開(kāi)頭寫入數(shù)據(jù)。提高篇文

10、件的打開(kāi)方式:文件的打開(kāi)方式:l調(diào)用方式調(diào)用方式nfopen(文件名文件名,文件操作方式文件操作方式);l功能:返回一個(gè)指向該文件的指針或錯(cuò)誤標(biāo)志功能:返回一個(gè)指向該文件的指針或錯(cuò)誤標(biāo)志NULL。為避免出錯(cuò),常用以下方法來(lái)打開(kāi)文件為避免出錯(cuò),常用以下方法來(lái)打開(kāi)文件FILE*fp;if(fp=fopen(“文件名文件名”,“使用文件方式使用文件方式”)=NULL)printf(”cannot open this file.n”);exit(0); /正常中止程序正常中止程序提高篇文件的打開(kāi)模式文件的打開(kāi)模式打開(kāi)模式描 述r只讀,打開(kāi)已有文件,不能寫w只寫,創(chuàng)建或打開(kāi),覆蓋已有文件a追加,創(chuàng)建或打

11、開(kāi),在已有文件末尾追加r+讀寫,打開(kāi)已有文件w+讀寫,創(chuàng)建或打開(kāi),覆蓋已有文件a+讀寫,創(chuàng)建或打開(kāi),在已有文件末尾追加t按文本方式打開(kāi) (缺省)b按二進(jìn)制方式打開(kāi)提高篇文件的打開(kāi)舉例FILE *fp1, *fp2, *fp3;char filename=file3.dat;/* 以文本只讀方式打開(kāi)以文本只讀方式打開(kāi)file1 */if (!(fp1=fopen(file1, r) printf(Cannot Open This File!n); exit(0); /* 退出程序退出程序 */ /* 以二進(jìn)制讀寫方式打開(kāi)以二進(jìn)制讀寫方式打開(kāi)file2.txt */fp2=fopen(C:HOME

12、file2.txt, rb+);/* 以二進(jìn)制讀寫方式打開(kāi)以二進(jìn)制讀寫方式打開(kāi)file3.dat */fp3=fopen(filename, a+b);提高篇2)文件的關(guān)閉:文件的關(guān)閉:調(diào)用方式調(diào)用方式nfclose(文件指針變量文件指針變量);l功能:關(guān)閉一個(gè)已打開(kāi)的文件功能:關(guān)閉一個(gè)已打開(kāi)的文件(釋放文件信息區(qū)釋放文件信息區(qū))l返回值:若成功,返回返回值:若成功,返回0,若出錯(cuò),返回若出錯(cuò),返回EOF(-1)3)文件結(jié)尾標(biāo)志文件結(jié)尾標(biāo)志: EOF說(shuō)明:說(shuō)明:釋放文件的有關(guān)信息區(qū);釋放文件的有關(guān)信息區(qū);將輸出文件緩沖區(qū)的內(nèi)容將輸出文件緩沖區(qū)的內(nèi)容(無(wú)論緩沖區(qū)是否為滿無(wú)論緩沖區(qū)是否為滿)都輸都

13、輸出寫入文件,然后關(guān)閉文件,這樣可防止丟失本來(lái)應(yīng)出寫入文件,然后關(guān)閉文件,這樣可防止丟失本來(lái)應(yīng)寫入文件的數(shù)據(jù)。寫入文件的數(shù)據(jù)。不用的文件應(yīng)關(guān)閉,防止數(shù)據(jù)破壞丟失不用的文件應(yīng)關(guān)閉,防止數(shù)據(jù)破壞丟失提高篇文件應(yīng)用示例文件應(yīng)用示例例例1:格式化的輸入輸出。:格式化的輸入輸出。fprintf(fp,格式字符串格式字符串,輸出項(xiàng)表列輸出項(xiàng)表列)功能:將輸出按格式串規(guī)定輸出到指定文功能:將輸出按格式串規(guī)定輸出到指定文件。件。fscanf(fp,格式字符串格式字符串,輸入項(xiàng)表列輸入項(xiàng)表列)功能:從功能:從fp所指文件按格式串讀入數(shù)據(jù)。所指文件按格式串讀入數(shù)據(jù)。函數(shù)執(zhí)行成功返回讀得的數(shù)據(jù)項(xiàng)個(gè)數(shù);若函數(shù)執(zhí)行成功

14、返回讀得的數(shù)據(jù)項(xiàng)個(gè)數(shù);若在讀第在讀第1項(xiàng)前已到達(dá)文件結(jié)束處,則返回項(xiàng)前已到達(dá)文件結(jié)束處,則返回EOF。提高篇#include #include #include void main()FILE *fp;char name10;int num;float score;if(fp=fopen(file3.txt,w+)=NULL)printf(cannot open this file.n);exit(0);printf(enter name,num,score:);scanf(%s %d %f,name,&num,&score);提高篇while(strlen(name)1)fp

15、rintf(fp,%s %d %fn,name,num,score);printf(enter name,num,score:);scanf(%s %d %f,name,&num,&score);rewind(fp);/使文件指針?lè)祷氐轿募拈_(kāi)頭while(fscanf(fp,%s %d %f,name,&num, &score) !=EOF)printf(%-10s,%6d,%6.2fn,name,num,score);fclose(fp);提高篇輸入:輸入: enter name,num,score: zhangsan0501 90 enter name,n

16、um,score: liming0502 85 enter name,num,score: gaofei0503 95 enter name,num,score: 000輸出:輸出:zhangsan50190.00 liming50285.00gaofei50395.00提高篇例例2:具有文件拷貝功能的程序:具有文件拷貝功能的程序filecopy.c。說(shuō)明兩個(gè)問(wèn)題:命令行參數(shù)的應(yīng)用和文說(shuō)明兩個(gè)問(wèn)題:命令行參數(shù)的應(yīng)用和文件的字符輸入與輸出應(yīng)用。件的字符輸入與輸出應(yīng)用。fgetc(fp)功能:從指定文件讀入一個(gè)字符。功能:從指定文件讀入一個(gè)字符。fputc(ch,fp)功能:把一個(gè)字符寫到指定文件

17、中去。功能:把一個(gè)字符寫到指定文件中去。提高篇#include #include #include void filecopy(FILE *fp1,FILE *fp2)char c;while(c=fgetc(fp1)!=EOF)fputc(c,fp2);提高篇void main(int argc,char *argv)FILE *fp1,*fp2;/void filecopy(FILE *fp1,FILE *fp2);if(argc1)if(fp1=fopen(*+argv,r)=NULL)printf(cant fopen %sn,*argv);exit(0);if(fp2=fopen(*

18、+argv,w)=NULL)printf(cant fopen %sn,*argv);exit(0);filecopy(fp1,fp2);提高篇例例3:文件的字符串的輸入輸出處理。:文件的字符串的輸入輸出處理。fgets(str,n,fp)字符串輸入函數(shù)字符串輸入函數(shù)其功能是從其功能是從fp指定的文件中讀取一個(gè)串,若滿足以下條指定的文件中讀取一個(gè)串,若滿足以下條件讀取結(jié)束:已讀取件讀取結(jié)束:已讀取n-1個(gè)字符個(gè)字符, 當(dāng)前讀取到的字符是當(dāng)前讀取到的字符是回車符回車符, 已讀取到文件尾。已讀取到文件尾。讀取的字符個(gè)數(shù)至多讀取的字符個(gè)數(shù)至多n-1個(gè),余下的一個(gè)字節(jié)空間作為個(gè),余下的一個(gè)字節(jié)空間作為

19、加加“0”串結(jié)束符。串結(jié)束符。讀取回車符時(shí),也作為一個(gè)字符送入由讀取回車符時(shí),也作為一個(gè)字符送入由str所指的內(nèi)存緩所指的內(nèi)存緩沖區(qū)。然后再加一個(gè)字符結(jié)束符沖區(qū)。然后再加一個(gè)字符結(jié)束符“0”str為數(shù)組名或字符指針為數(shù)組名或字符指針;n為讀取字符個(gè)數(shù)為讀取字符個(gè)數(shù)提高篇例例3:文件的字符串的輸入輸出處理。:文件的字符串的輸入輸出處理。fputs(str,fp)字符串輸出字符串輸出(寫寫)函數(shù)函數(shù)其功能是將其功能是將str所指定的字符串寫到所指定的字符串寫到fp指向的文件中。指向的文件中。與與fgets()函數(shù)在輸入字符串自動(dòng)加函數(shù)在輸入字符串自動(dòng)加“0”特性對(duì)應(yīng),特性對(duì)應(yīng),fputs ()函數(shù)

20、在將函數(shù)在將C字符串寫入文件時(shí)其末尾的字符串寫入文件時(shí)其末尾的“0”字符字符自動(dòng)舍去。自動(dòng)舍去。提高篇#include #include #include void main()FILE*fp;char str16; if(fp=open(“file2.txt”,”w”)=NULLprintf(“cannot open this file.n”);exit(0);while(strlen(gets(str)0)fputs(str,fp);fclose(fp);if(fp=open(“file2.txt”,”r”)=NULLprintf(“cannot open this file.n”);ex

21、it(0);while(fgets(str,16,fp)!=NULL)printf(“%sn”,str);fclose(fp);提高篇文件的讀寫函數(shù)功能函數(shù)功能fputc輸出字符fprintf格式化輸出fgetc輸入字符fscanf格式化輸入putc輸出字符putw輸出一個(gè)字getc輸入字符getw輸入一個(gè)字fwrite輸出數(shù)據(jù)塊fputs輸出字符串fread輸入數(shù)據(jù)塊fgets輸入字符串提高篇例例4:數(shù)據(jù)塊:數(shù)據(jù)塊(二進(jìn)制形式二進(jìn)制形式)的讀寫的讀寫fread(buffer,size,count,fp)功能功能:從指定文件讀入從指定文件讀入count個(gè)大小為個(gè)大小為size的字節(jié)數(shù)據(jù)塊的字節(jié)

22、數(shù)據(jù)塊,存入存入buffer所指存儲(chǔ)單元。返回所讀的數(shù)據(jù)項(xiàng)個(gè)數(shù)所指存儲(chǔ)單元。返回所讀的數(shù)據(jù)項(xiàng)個(gè)數(shù),如遇如遇文件結(jié)束或出錯(cuò)返回文件結(jié)束或出錯(cuò)返回0。fwrite(buffer,size,count,fp)功能功能: 從從buffer所指存儲(chǔ)單元的數(shù)據(jù)取所指存儲(chǔ)單元的數(shù)據(jù)取size count個(gè)字個(gè)字節(jié)送節(jié)送fp所指文件。返回寫到所指文件。返回寫到fp所指文件中的數(shù)據(jù)項(xiàng)的個(gè)所指文件中的數(shù)據(jù)項(xiàng)的個(gè)數(shù)。數(shù)。提高篇例例4:數(shù)據(jù)塊:數(shù)據(jù)塊(二進(jìn)制形式二進(jìn)制形式)的讀寫的讀寫fread(buffer,size,count,fp)fwrite(buffer,size,count,fp)說(shuō)明說(shuō)明:buffer為

23、輸入輸出在內(nèi)存中存放的首地址;為輸入輸出在內(nèi)存中存放的首地址;size為讀、寫的字節(jié)數(shù),即數(shù)據(jù)塊的大?。粸樽x、寫的字節(jié)數(shù),即數(shù)據(jù)塊的大??;count為輸入輸出的數(shù)據(jù)項(xiàng)的個(gè)數(shù);為輸入輸出的數(shù)據(jù)項(xiàng)的個(gè)數(shù);fread()和和fwrite()用于二進(jìn)制文件的輸入輸出。用于二進(jìn)制文件的輸入輸出。提高篇#include #include #define SIZE 4struct studentchar name10;int num,age;char addr15;studSIZE;void save_load()FILE *fp;int i;if(fp=fopen(stu_list,wb+)=NULL)p

24、rintf(cannot open file.n);exit(0);提高篇for(i=0;iSIZE;i+)if(fwrite(&studi,sizeof(struct student),1,fp)!=1)printf(file write error!n);exit(0);rewind(fp);for(i=0;iSIZE;i+)if(fread(&studi,sizeof(struct student),1,fp)!=0)printf(%-10s %4d %4d %-15sn, ,studi.num, studi.age, studi.addr);提高篇輸

25、入:輸入:zhang100119room_101li1002 19room_102wang100321room_103zhao100421room_104輸出:輸出:zhang100119room_101li1002 19room_102wang100321room_103zhao100421room_104void main()int i;for(i=0;iSIZE;i+)scanf(%s %d %d %s, , &studi.num,&studi.age, studi.addr);save_load();提高篇回顧:回顧:fgetc( ), fputc(

26、 )fgets( ), fputs( )fscanf( ), fprintf( )這些函數(shù)都是這些函數(shù)都是按順序讀按順序讀/寫寫文件文件3.5 文件的隨機(jī)讀寫文件的隨機(jī)讀寫提高篇解決的辦法:解決的辦法:把文件指針移到指定的位置即可。把文件指針移到指定的位置即可。關(guān)鍵步驟:關(guān)鍵步驟:文件的定位。文件的定位。3.5 文件的隨機(jī)讀寫文件的隨機(jī)讀寫問(wèn)題:?jiǎn)栴}:要求打開(kāi)文件后,對(duì)指定位置上的數(shù)據(jù)要求打開(kāi)文件后,對(duì)指定位置上的數(shù)據(jù)進(jìn)行讀寫操作,減少一些不必要的中間環(huán)節(jié)。進(jìn)行讀寫操作,減少一些不必要的中間環(huán)節(jié)。提高篇一、對(duì)文件隨機(jī)存取的思想一、對(duì)文件隨機(jī)存取的思想 對(duì)一個(gè)文件流,有主觀的愿望要取指定位對(duì)一個(gè)

27、文件流,有主觀的愿望要取指定位置的記錄和更新指定位置的記錄。置的記錄和更新指定位置的記錄。如:如:對(duì)一個(gè)文件流對(duì)一個(gè)文件流可以有兩種目的:可以有兩種目的: 從第從第i個(gè)字節(jié)開(kāi)始,讀取個(gè)字節(jié)開(kāi)始,讀取k個(gè)字節(jié)的內(nèi)容個(gè)字節(jié)的內(nèi)容 把把k個(gè)字節(jié)的內(nèi)容寫到從第個(gè)字節(jié)的內(nèi)容寫到從第i個(gè)字節(jié)開(kāi)始后個(gè)字節(jié)開(kāi)始后存在的問(wèn)題:存在的問(wèn)題:讀取的內(nèi)容是否滿足我們的要求?讀取的內(nèi)容是否滿足我們的要求?30 1 2結(jié)束標(biāo)志kin1提高篇二、隨機(jī)存取的應(yīng)用二、隨機(jī)存取的應(yīng)用 隨機(jī)存取文件適合于具有固定長(zhǎng)度記錄的文件隨機(jī)存取文件適合于具有固定長(zhǎng)度記錄的文件程序可以很方便的訪問(wèn)到指定位置處的記錄。程序可以很方便的訪問(wèn)到指定

28、位置處的記錄。訪問(wèn)100200300400500結(jié)束標(biāo)志0100個(gè)字節(jié)100個(gè)字節(jié)100個(gè)字節(jié)100個(gè)字節(jié)100個(gè)字節(jié)100個(gè)字節(jié)提高篇三、隨機(jī)存取的目的三、隨機(jī)存取的目的1. 方便、快捷方便、快捷2. 只改變指定位置后的固定長(zhǎng)度字節(jié)的只改變指定位置后的固定長(zhǎng)度字節(jié)的內(nèi)容內(nèi)容(不會(huì)破壞其它的數(shù)據(jù)不會(huì)破壞其它的數(shù)據(jù))結(jié)束標(biāo)志讀取、修改等讀取、修改等提高篇問(wèn)題的實(shí)質(zhì):?jiǎn)栴}的實(shí)質(zhì):把指定的數(shù)據(jù)寫到文件流中指把指定的數(shù)據(jù)寫到文件流中指定的位置。定的位置。問(wèn)題的關(guān)鍵:?jiǎn)栴}的關(guān)鍵:把文件指針定位到文件流中指把文件指針定位到文件流中指定的位置。定的位置。步驟:步驟:定位定位寫數(shù)據(jù)寫數(shù)據(jù)四、向隨機(jī)文件中隨機(jī)地

29、寫入數(shù)據(jù)四、向隨機(jī)文件中隨機(jī)地寫入數(shù)據(jù)提高篇五、文件定位函數(shù)五、文件定位函數(shù) fseek(文件指針變量、 位移量、起始點(diǎn))注:注: 起始點(diǎn)的取值只有3種: 位移量:以起始點(diǎn)為基點(diǎn)移動(dòng)的字節(jié)數(shù) 0 文件開(kāi)始處1 文件位置指針的當(dāng)前位置2 文件尾。文件頭文件尾起始點(diǎn)一位移量十位移量(往后)(往前)提高篇 位移量應(yīng)為long型 fseek( )的返回值:0 成功非零 失敗例:例:fseek(fp, 20l, 0);將位置指針從文件頭移動(dòng)20個(gè)字節(jié)fseek(fp, 10l, 1);將位置指針移到離文件尾30個(gè)字節(jié)處fseek(fp, 30l, 2);將位置從當(dāng)前位置向后移10個(gè)字節(jié)提高篇六、位置函數(shù)

30、六、位置函數(shù) ftell(文件指針變量);作用:作用:返回位置指針的當(dāng)前指向返回值:返回值:0, 文件指針的當(dāng)前指向1, 出錯(cuò)提高篇例例5: 文件文件data1.txt的內(nèi)容如下:的內(nèi)容如下:This is a test.C語(yǔ)言程序設(shè)計(jì),隨機(jī)讀寫函數(shù)測(cè)試。要求編寫一程序隨機(jī)讀出指定的記錄。七、重新定位函數(shù)七、重新定位函數(shù)rewind( 文件指針變量 )作用作用:使文件指針?lè)祷氐轿募拈_(kāi)頭無(wú)返回值提高篇#include #include #include void main( )FILE *fp;int loc1, loc2;long d=8l;char w;fp=fopen(data1.txt

31、, r);if (fp=NULL)printf(errorn);elseloc1=fseek(fp,d,0);if (loc1=0)w=fgetc(fp);printf(w=%cn,w);提高篇運(yùn)行結(jié)果:運(yùn)行結(jié)果: w=a loc2=9 loc2=0loc2=ftell(fp);rewind(fp);printf(loc2=%dn,loc2);loc2=ftell(fp);fclose(fp);printf(loc2=%dn,loc2);提高篇思考思考:若要采用隨機(jī)讀寫的方式讀取一個(gè)漢字,程序如何修改?提示:提示: 一個(gè)漢字占2個(gè)字節(jié) 可使用fgets ( )函數(shù)將要讀出的漢字裝a數(shù)組 讀取的字符個(gè)數(shù)必須為3的單數(shù)提高篇八、文件操作的錯(cuò)誤檢測(cè)八、

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論