C語言(文件)-文檔資料_第1頁
C語言(文件)-文檔資料_第2頁
C語言(文件)-文檔資料_第3頁
C語言(文件)-文檔資料_第4頁
C語言(文件)-文檔資料_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第十六講第十六講 文件文件文件的概念文件的概念文件指針文件指針文件的打開與關閉文件的打開與關閉文件的讀寫文件的讀寫文件的定位文件的定位程序設計舉例程序設計舉例C C語言程序設計語言程序設計簡介簡介文件文件存儲在外存儲器上的數(shù)據(jù)集合。存儲在外存儲器上的數(shù)據(jù)集合。文件文件內存內存硬盤硬盤寫寫讀讀保存在變量和數(shù)組保存在變量和數(shù)組中的數(shù)據(jù)是暫時的中的數(shù)據(jù)是暫時的大量的數(shù)據(jù)保存到大量的數(shù)據(jù)保存到文件實現(xiàn)永久存儲文件實現(xiàn)永久存儲簡介簡介數(shù)據(jù)的層次結構數(shù)據(jù)的層次結構文件文件001000111001001111010110011011100100100100111101101011101001011WangH

2、ai21M788983LiFei21F768885ZhaoXin21M818679010111001文件文件字段字段字節(jié)字節(jié)位位記錄記錄簡介簡介C語言的文件處理語言的文件處理C語言把文件看作是一個有序的字節(jié)或字符流。語言把文件看作是一個有序的字節(jié)或字符流。文件文件簡介簡介文件的分類文件的分類(按存儲形式分)(按存儲形式分)文本文件文本文件數(shù)據(jù)被作為字符,并以字符的二進制編碼形式保存。數(shù)據(jù)被作為字符,并以字符的二進制編碼形式保存。舉例舉例文件文件12341 2 3 4整數(shù)整數(shù)把把4個字符的二進制編碼寫入文件中個字符的二進制編碼寫入文件中00110001 00110010 00110011 001

3、10100簡介簡介文件的分類文件的分類(按存儲形式分)(按存儲形式分)二進制文件二進制文件以數(shù)據(jù)在內存中的二進制形式保存。以數(shù)據(jù)在內存中的二進制形式保存。舉例舉例文件文件1234整數(shù)整數(shù)00000100 11010010把值把值1234的二進制編碼寫入文件中的二進制編碼寫入文件中簡介簡介文件的讀寫文件的讀寫緩沖文件系統(tǒng)緩沖文件系統(tǒng)系統(tǒng)在內存中開辟一塊緩沖區(qū)以便慢速的外設與其成塊地進行數(shù)據(jù)系統(tǒng)在內存中開辟一塊緩沖區(qū)以便慢速的外設與其成塊地進行數(shù)據(jù)交換。交換。向磁盤向磁盤(文件文件)輸出數(shù)據(jù):輸出數(shù)據(jù):數(shù)據(jù)數(shù)據(jù)緩沖區(qū),裝滿緩沖區(qū)后緩沖區(qū),裝滿緩沖區(qū)后磁盤文件。磁盤文件。從磁盤從磁盤(文件文件)讀入

4、數(shù)據(jù):讀入數(shù)據(jù): 先一次性從磁盤文件將一批數(shù)據(jù)輸入到緩沖區(qū),先一次性從磁盤文件將一批數(shù)據(jù)輸入到緩沖區(qū), 然后再從緩沖區(qū)逐個數(shù)據(jù)讀入到變量。然后再從緩沖區(qū)逐個數(shù)據(jù)讀入到變量。文件文件文件指針文件指針文件指針文件指針(指向文件的指針)(指向文件的指針)緩沖文件系統(tǒng)為每個使用的文件在內存中開辟一存儲區(qū)存緩沖文件系統(tǒng)為每個使用的文件在內存中開辟一存儲區(qū)存放其相關信息,這些信息用一個結構體變量保存,該放其相關信息,這些信息用一個結構體變量保存,該結構結構體類型體類型的名字是的名字是 FILE。 程序通過程序通過 FILE類型指針建立和文件的聯(lián)系,進行關于文件類型指針建立和文件的聯(lián)系,進行關于文件的一切操

5、作。的一切操作。定義形式:定義形式:FILE *指針變量名指針變量名; 舉例:舉例:定義了一個結構體定義了一個結構體FILE類型的指針變量:類型的指針變量:fp。文件文件用于存放文件的緩沖區(qū)首地用于存放文件的緩沖區(qū)首地址,即指向一個文件。址,即指向一個文件。FILE *fp;文件的打開文件的打開打開文件打開文件方法:方法:為了打開一個文件,首先要為該文件定義一個文件類型指針;為了打開一個文件,首先要為該文件定義一個文件類型指針;然后用然后用C語言提供的語言提供的fopen()函數(shù)函數(shù)打開文件。打開文件。fopen函數(shù)有兩個參數(shù):函數(shù)有兩個參數(shù): “文件名文件名”與與“文件使用方式文件使用方式”

6、。 它們均是字符串。它們均是字符串。一般形式:一般形式:文件文件FILE *文件指針名文件指針名;文件指針名文件指針名fopen(文件名文件名,文件使用方式文件使用方式); 文件的打開文件的打開打開文件打開文件文件使用方式文件使用方式文件文件符號符號意義意義r(read)以只讀方式打開一個文本文件,若文件不存在,則返回空指針以只讀方式打開一個文本文件,若文件不存在,則返回空指針w(write)以只寫方式打開或創(chuàng)建一個文本文件,并覆蓋原有數(shù)據(jù)以只寫方式打開或創(chuàng)建一個文本文件,并覆蓋原有數(shù)據(jù)a(append)以追加方式打開或創(chuàng)建一個文本文件,并從文件末尾寫數(shù)據(jù)以追加方式打開或創(chuàng)建一個文本文件,并從

7、文件末尾寫數(shù)據(jù)t(text)文本文件,可省略不寫文本文件,可省略不寫b(binary)二進制文件二進制文件+讀和寫讀和寫文件的打開文件的打開打開文件打開文件舉例舉例其意義是在當前目錄下打開文件其意義是在當前目錄下打開文件filea.dat,文件的使用方式為,文件的使用方式為“只只讀讀”,并使,并使fp指向該文件。指向該文件。 舉例舉例其意義是打開其意義是打開c盤根目錄下的文件盤根目錄下的文件fileabc.dat,這是一個二進制文,這是一個二進制文件,只允許按二進制方式進行讀操作。件,只允許按二進制方式進行讀操作。兩個反斜線兩個反斜線“”中的第一個表示轉義字符,第二個表示根目錄。中的第一個表示

8、轉義字符,第二個表示根目錄。文件文件FILE *fp;fp = fopen(filea.dat, r); FILE *fpabc;fpabc = fopen(“c:fileabc.dat, rb); 文件的關閉文件的關閉關閉文件關閉文件使用使用fclose()函數(shù)。函數(shù)。一般形式:一般形式:fclose(文件指針文件指針);舉例舉例將將fp指向的緩沖區(qū)中的數(shù)據(jù)存放到外存儲器的文件中,然后釋放該指向的緩沖區(qū)中的數(shù)據(jù)存放到外存儲器的文件中,然后釋放該緩沖區(qū),使文件指針變量不再指向與該文件對應的緩沖區(qū),使文件指針變量不再指向與該文件對應的FILE結構,從而結構,從而斷開與文件的關聯(lián)。斷開與文件的關聯(lián)

9、。操作正常返回操作正常返回0,否則返回,否則返回EOF(是在(是在stdio.h文件中定義的符號常文件中定義的符號常量,值為量,值為-1)。)。文件文件FILE *fp;fclose(fp); 如果不關閉文件,將會丟失數(shù)據(jù),并如果不關閉文件,將會丟失數(shù)據(jù),并且一個且一個C程序能同時打開的文件數(shù)有限,程序能同時打開的文件數(shù)有限,應該養(yǎng)成在使用完文件后關閉文件的應該養(yǎng)成在使用完文件后關閉文件的習慣。習慣。文件操作文件操作文件操作的一般步驟文件操作的一般步驟文件文件/* 定義聲明文件指針定義聲明文件指針 */FILE *fp;/* 打開文件打開文件 */fp = fopen(文件名文件名, r);

10、/* 判斷是否打開文件判斷是否打開文件 */if (fp = NULL) /* 當文件打開失敗時的處理當文件打開失敗時的處理 */ /* 對文件進行讀寫操作對文件進行讀寫操作 */ /* 關閉文件關閉文件 */fclose(fp);文件的讀寫文件的讀寫C語言支持兩種讀寫文件的方式語言支持兩種讀寫文件的方式順序讀寫順序讀寫從文件中一個接一個地讀寫數(shù)據(jù),僅當讀寫了前一個數(shù)據(jù)后,才能從文件中一個接一個地讀寫數(shù)據(jù),僅當讀寫了前一個數(shù)據(jù)后,才能讀寫下一個數(shù)據(jù)。讀寫下一個數(shù)據(jù)。在讀寫數(shù)據(jù)后,文件位置指針自動跳到下一個讀寫位置。在讀寫數(shù)據(jù)后,文件位置指針自動跳到下一個讀寫位置。標準輸入輸出只能進行順序讀寫。

11、標準輸入輸出只能進行順序讀寫。隨機讀寫隨機讀寫從文件中讀寫數(shù)據(jù)時可不考慮數(shù)據(jù)在文件中的位置,可以在文件的從文件中讀寫數(shù)據(jù)時可不考慮數(shù)據(jù)在文件中的位置,可以在文件的任何位置讀寫。任何位置讀寫。在讀寫數(shù)據(jù)前,需要將在讀寫數(shù)據(jù)前,需要將文件位置指針文件位置指針移到讀寫位置。移到讀寫位置。當文件以讀或寫方式打開,文件位置指針設置在文件頭,若文件以當文件以讀或寫方式打開,文件位置指針設置在文件頭,若文件以附加方式打開,位置設置在文件末尾。附加方式打開,位置設置在文件末尾。文件文件字符的讀寫字符的讀寫讀字符讀字符fgetc()函數(shù)函數(shù)從指定文件讀入一個字符,該文件必須是以讀或讀寫方式打開。從指定文件讀入一

12、個字符,該文件必須是以讀或讀寫方式打開。返回值:返回值: 調用成功時返回讀入的字符;調用成功時返回讀入的字符; 文件結束時返回文件結束符文件結束時返回文件結束符EOF。舉例舉例 表示從文件指針變量表示從文件指針變量fp指向的文件中讀出一個字符,賦給字符變量指向的文件中讀出一個字符,賦給字符變量ch文件文件ch = fgetc(fp);字符的讀寫字符的讀寫文件位置指針文件位置指針文件型數(shù)據(jù)結構中,用文件位置指針指向當前對文件進行文件型數(shù)據(jù)結構中,用文件位置指針指向當前對文件進行讀寫操作的位置。讀寫操作的位置。在文件打開時,該指針總是指向文件的第一個字節(jié)。讀寫文件時,在文件打開時,該指針總是指向文

13、件的第一個字節(jié)。讀寫文件時,每讀寫一個字符后,該位置指針的值會自動加每讀寫一個字符后,該位置指針的值會自動加1,指向下一個字符。,指向下一個字符。改變位置指針的值,也就改變了下一次讀寫操作在文件中執(zhí)行時的改變位置指針的值,也就改變了下一次讀寫操作在文件中執(zhí)行時的位置。位置。文件文件文件位置指針文件位置指針字符的讀寫字符的讀寫文件結束文件結束問題問題使用使用fgetc()函數(shù),文件結束時返回文件結束符函數(shù),文件結束時返回文件結束符EOF,其值為,其值為-1。這。這在對文本文件操作時不會產生問題。但對二進制文件進行讀操作時,在對文本文件操作時不會產生問題。但對二進制文件進行讀操作時,由于由于-1是

14、二進制數(shù)的合法值,故將影響文件數(shù)據(jù)的讀取。是二進制數(shù)的合法值,故將影響文件數(shù)據(jù)的讀取。為解決此問題,為解決此問題,ANSI C提供了專門判斷文件結束的函數(shù)提供了專門判斷文件結束的函數(shù)feof()。feof()函數(shù)函數(shù)feof(文件指針文件指針);判斷文件位置指針是否已至文件尾判斷文件位置指針是否已至文件尾 返回值:返回值: 函數(shù)返回值為函數(shù)返回值為1時表示已至文件尾部;時表示已至文件尾部; 為為0時則還未到文件結束處。時則還未到文件結束處。文件文件字符的讀寫字符的讀寫寫字符寫字符fputc()函數(shù)函數(shù)fputc(字符量,文件指針字符量,文件指針); 將一個字符寫到磁盤文件上去將一個字符寫到磁盤

15、文件上去返回值:返回值: 調用成功時返回輸出的字符;調用成功時返回輸出的字符; 失敗時返回失敗時返回EOF。舉例舉例 表示向文件指針變量表示向文件指針變量fp指向的文件寫入一個字符指向的文件寫入一個字符a。文件文件fputc(a, fp);案例分析:字符的讀寫案例分析:字符的讀寫問題問題打開打開“c:infile.c”文件,然后將其復制到文件,然后將其復制到“c:outfile.c”。源代碼源代碼文件文件#include stdio.h#include stdlib.hvoid main() FILE *infp,*outfp; char ch; if (infp = fopen(c:infi

16、le.c, r) = NULL) printf(Cannot open infile.c.n); exit(0); 案例分析:字符的讀寫案例分析:字符的讀寫源代碼源代碼文件文件 if (outfp = fopen(c:outfile.c, w) = NULL) printf(Cannot open outfile.c.n); exit(0); while(!feof(infp) if (ch = fgetc(infp) != EOF) fputc(ch,outfp); fclose(infp); fclose(outfp); 字符串的讀寫字符串的讀寫讀字符串讀字符串fgets()函數(shù)函數(shù)fge

17、ts(字符數(shù)組名字符數(shù)組名, n, 文件指針文件指針); 從指定文件讀入從指定文件讀入n-1個字符到字符數(shù)組,最后加一個個字符到字符數(shù)組,最后加一個0結束符。結束符。在讀完在讀完n-1個字符之前遇到換行符或文件結束符個字符之前遇到換行符或文件結束符EOF,讀入即結束。,讀入即結束。返回值:字符數(shù)組的地址。返回值:字符數(shù)組的地址。舉例舉例 從從fp所指的文件中讀出所指的文件中讀出n-1個字符送入字符數(shù)組個字符送入字符數(shù)組str中。中。文件文件fgets(str, n, fp);字符串的讀寫字符串的讀寫寫字符串寫字符串fputs()函數(shù)函數(shù)fputs(字符數(shù)組名字符數(shù)組名, 文件指針文件指針);

18、向指定的文件輸出一個字符串,向指定的文件輸出一個字符串,0結束符不輸出。其中字符串結束符不輸出。其中字符串可以是字符串常量、字符數(shù)組名或指針變量。可以是字符串常量、字符數(shù)組名或指針變量。返回值:返回值: 調用成功時,返回調用成功時,返回0; 否則返回否則返回EOF。舉例舉例 其意義是把字符串其意義是把字符串“abcd”寫入寫入fp所指的文件之中。所指的文件之中。文件文件fputs(“abcd”, fp);案例分析:字符串的讀寫案例分析:字符串的讀寫問題問題從鍵盤上輸入一串字符,寫入文本文件從鍵盤上輸入一串字符,寫入文本文件“abc.c”中,再將中,再將文本文件的內容讀出,顯示在屏幕上。文本文件

19、的內容讀出,顯示在屏幕上。源代碼源代碼文件文件#include stdio.h#include stdlib.hvoid main() FILE *fp; char str100, ch; if(fp = fopen(c:abc.c, w) = NULL) printf(file open error.n); exit(0);案例分析:字符串的讀寫案例分析:字符串的讀寫源代碼源代碼文件文件printf(請輸入一串字符:請輸入一串字符:n);gets(str);fputs(str,fp);fclose(fp); if(fp=fopen(c:abc.c, r) = NULL) printf(fil

20、e open error.n); exit(0);while(!feof(fp) if (ch = fgetc(fp) != EOF) putchar(ch);fclose(fp); 格式化讀寫格式化讀寫格式化讀格式化讀fscanf()函數(shù)函數(shù)fscanf(文件指針文件指針, ”格式控制字符串格式控制字符串”, 地址表列地址表列); 從指定的文件中格式化讀數(shù)據(jù)。從指定的文件中格式化讀數(shù)據(jù)。這個函數(shù)與格式輸入函數(shù)這個函數(shù)與格式輸入函數(shù)scanf( )很相似,它們的區(qū)別在于,很相似,它們的區(qū)別在于,scanf( )函數(shù)是從鍵盤輸入數(shù)據(jù),而函數(shù)是從鍵盤輸入數(shù)據(jù),而fscanf( )函數(shù)是從文件讀入數(shù)

21、函數(shù)是從文件讀入數(shù)據(jù),因此在據(jù),因此在fscanf( )函數(shù)參數(shù)中多了一個文件指針,用于指出從哪函數(shù)參數(shù)中多了一個文件指針,用于指出從哪個文件讀入數(shù)據(jù)。個文件讀入數(shù)據(jù)。舉例舉例 表示從磁盤文件中的讀取一個浮點數(shù)和一個整數(shù),分別存入變量表示從磁盤文件中的讀取一個浮點數(shù)和一個整數(shù),分別存入變量f和和d。文件文件fscanf(fp, “%f%d”, &f, &d);格式化讀寫格式化讀寫格式化寫格式化寫fprintf()函數(shù)函數(shù)fprintf(文件指針文件指針, ”格式控制字符串格式控制字符串”, 輸出表列輸出表列); 格式化寫數(shù)據(jù)到指定的文件中。格式化寫數(shù)據(jù)到指定的文件中。這個函數(shù)與

22、這個函數(shù)與printf( )函數(shù)很相似,它們的區(qū)別在于,函數(shù)很相似,它們的區(qū)別在于,printf()函數(shù)是函數(shù)是將數(shù)據(jù)輸出到屏幕上,而將數(shù)據(jù)輸出到屏幕上,而fprintf()函數(shù)是將數(shù)據(jù)輸出到文件中,因函數(shù)是將數(shù)據(jù)輸出到文件中,因此在此在fprintf()函數(shù)參數(shù)中多了一個文件指針,用于指出將數(shù)據(jù)輸出函數(shù)參數(shù)中多了一個文件指針,用于指出將數(shù)據(jù)輸出到哪個文件中。到哪個文件中。舉例舉例 表示把變量表示把變量f和和d按指定的格式寫入磁盤文件。按指定的格式寫入磁盤文件。文件文件fprintf(fp, “f=%f, d=%dn”, f, d);數(shù)據(jù)塊的讀寫數(shù)據(jù)塊的讀寫以數(shù)據(jù)塊方式讀寫文件以數(shù)據(jù)塊方式讀寫

23、文件fscanf()函數(shù)和函數(shù)和fprintf()函數(shù)對磁盤文件讀寫,使用方便,函數(shù)對磁盤文件讀寫,使用方便,易理解。但輸入輸出需要轉化。易理解。但輸入輸出需要轉化。因此,在內存與磁盤頻繁交換數(shù)據(jù)的情況下,最好用因此,在內存與磁盤頻繁交換數(shù)據(jù)的情況下,最好用fread()和和fwrite()函數(shù)。函數(shù)。fread(內存地址內存地址,數(shù)據(jù)項字節(jié)數(shù)數(shù)據(jù)項字節(jié)數(shù),數(shù)據(jù)項個數(shù)數(shù)據(jù)項個數(shù),文件指針文件指針);fwrite(內存地址內存地址,數(shù)據(jù)項字節(jié)數(shù)數(shù)據(jù)項字節(jié)數(shù),數(shù)據(jù)項個數(shù)數(shù)據(jù)項個數(shù),文件指針文件指針);通常用于對二進制文件的讀寫操作。通常用于對二進制文件的讀寫操作。舉例舉例 表示從已打開的一個文件中

24、讀入表示從已打開的一個文件中讀入5個整數(shù),依次送入整型數(shù)組個整數(shù),依次送入整型數(shù)組a中。中。文件文件int a5;fread(a, sizeof(int), 5, fp);文件的隨機讀寫文件的隨機讀寫文件內部的位置文件內部的位置按要求移動位置指針,是實現(xiàn)隨機讀寫的關鍵。按要求移動位置指針,是實現(xiàn)隨機讀寫的關鍵。rewind()函數(shù)函數(shù)rewind(文件指針文件指針);使位置指針重新返回到文件的開頭,函數(shù)無返回值。使位置指針重新返回到文件的開頭,函數(shù)無返回值。ftell()函數(shù)函數(shù)ftell();得到當前文件指針位置。得到當前文件指針位置。返回值:返回值: 調用成功時,返回調用成功時,返回lon

25、g int 數(shù)值,表示文件指針位置;數(shù)值,表示文件指針位置; 出錯返回出錯返回-1L。文件文件文件的隨機讀寫文件的隨機讀寫文件內部的位置文件內部的位置fseek()函數(shù)函數(shù)rewind(文件指針文件指針, 位移量位移量, 起始點起始點);改變文件的位置指針。改變文件的位置指針。其中,其中, 文件指針:是文件打開時返回的文件指針。文件指針:是文件打開時返回的文件指針。 位移量:是指以起始點為基點,向前向后移動的字節(jié)數(shù),可以為負值。位移量:是指以起始點為基點,向前向后移動的字節(jié)數(shù),可以為負值。大多數(shù)大多數(shù)C語言版本要求位移量為語言版本要求位移量為long型數(shù)。型數(shù)。 起始點:表示從何處開始計算位移

26、量,規(guī)定的起始點有:起始點:表示從何處開始計算位移量,規(guī)定的起始點有:返回值:操作成功返回返回值:操作成功返回0,否則返回非,否則返回非0。文件文件起始點起始點名字名字數(shù)字代號數(shù)字代號文件開始文件開始SEEK_SET SEEK_SET 0 0 當前位置當前位置SEEK_CURSEEK_CUR1 1文件末尾文件末尾SEEK_ENDSEEK_END2 2案例分析:文件的隨機讀寫案例分析:文件的隨機讀寫問題問題設文件設文件“alphabet.c”中存放了字母表中存放了字母表“AZ”,現(xiàn)在打開,現(xiàn)在打開這個文件,用從尾部倒著讀的方式將其信息讀出并送屏幕這個文件,用從尾部倒著讀的方式將其信息讀出并送屏幕顯示。顯示。源代碼源代碼文件文件#include #include void main() FILE *fp; long i; if(fp=fopen(“c:alphabet.c”, “rb”)= NULL) printf(“file open error.n”); exit(0); 案例分析:文件的隨機讀寫案例分析:文件的隨機讀寫源代碼源代碼文件文件 for(i=1;i=26;i+) fseek(fp,-i,SEEK_END); /* i=1時,定位于字母時,定位于字母Z *

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論