C語言程序設(shè)計_11文件操作_第1頁
C語言程序設(shè)計_11文件操作_第2頁
C語言程序設(shè)計_11文件操作_第3頁
C語言程序設(shè)計_11文件操作_第4頁
C語言程序設(shè)計_11文件操作_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第11章章 文件操作文件操作11.1 文件概述文件概述11.2 文件的打開與文件文件的打開與文件11.3 文件的順序讀寫操作文件的順序讀寫操作11.4 文件的隨機讀寫操作文件的隨機讀寫操作11.5 文件操作時的出錯檢測文件操作時的出錯檢測11.6 文件應(yīng)用舉例文件應(yīng)用舉例本章小結(jié)本章小結(jié)11.1 文文 件件 概概 述述11.1.1 文件的概念文件的概念文件(文件(FILE)是存儲在外部介質(zhì)上一組相關(guān)信息的集合。)是存儲在外部介質(zhì)上一組相關(guān)信息的集合。數(shù)據(jù)文件是數(shù)據(jù)的集合。每個文件都有一個名字,稱為文件數(shù)據(jù)文件是數(shù)據(jù)的集合。每個文件都有一個名字,稱為文件名。一批數(shù)據(jù)是以文件的形式存放在外部介質(zhì)

2、(如磁盤)上名。一批數(shù)據(jù)是以文件的形式存放在外部介質(zhì)(如磁盤)上的,而操作系統(tǒng)以文件為單位對數(shù)據(jù)進行管理。的,而操作系統(tǒng)以文件為單位對數(shù)據(jù)進行管理。在程序運行時,常常需要將一些數(shù)據(jù)(運行的中間數(shù)據(jù)或最在程序運行時,常常需要將一些數(shù)據(jù)(運行的中間數(shù)據(jù)或最終結(jié)果)輸出到磁盤上存放起來,以后需要時再從磁盤中讀終結(jié)果)輸出到磁盤上存放起來,以后需要時再從磁盤中讀入到計算機內(nèi)存,這就要用到磁盤文件。磁盤既可作為輸入入到計算機內(nèi)存,這就要用到磁盤文件。磁盤既可作為輸入設(shè)備,也可作為輸出設(shè)備,因此,有磁盤輸入文件和磁盤輸設(shè)備,也可作為輸出設(shè)備,因此,有磁盤輸入文件和磁盤輸出文件。除磁盤文件外,操作系統(tǒng)把每一

3、個與主機相聯(lián)的輸出文件。除磁盤文件外,操作系統(tǒng)把每一個與主機相聯(lián)的輸入入/輸出設(shè)備都當(dāng)作文件來管理,稱為標準輸入輸出設(shè)備都當(dāng)作文件來管理,稱為標準輸入/輸出文件。輸出文件。例如,鍵盤是標準輸入文件,顯示器和打印機是標準輸出文例如,鍵盤是標準輸入文件,顯示器和打印機是標準輸出文件。件。C語言把文件看作一個字節(jié)序列,即由一連串的字節(jié)組成,語言把文件看作一個字節(jié)序列,即由一連串的字節(jié)組成,稱為流(稱為流(STREAM),以字節(jié)為單位訪問,輸入),以字節(jié)為單位訪問,輸入/輸出數(shù)據(jù)輸出數(shù)據(jù)流的開始和結(jié)束僅受程序控制而不受物理符號(如回車換行流的開始和結(jié)束僅受程序控制而不受物理符號(如回車換行符)控制,把

4、這種文件稱為流式文件。換句話說,符)控制,把這種文件稱為流式文件。換句話說,C語言中語言中的文件并不是由記錄(的文件并不是由記錄(RECORD)組成的。)組成的。根據(jù)文件數(shù)據(jù)的組織形式,根據(jù)文件數(shù)據(jù)的組織形式,C語言的文件可分為語言的文件可分為ASCII文件文件和二進制文件。在和二進制文件。在ASCII文件中,一個字節(jié)代表一個字符,文件中,一個字節(jié)代表一個字符,因而便于對字符進行逐個處理,也便于輸出字符。但一般占因而便于對字符進行逐個處理,也便于輸出字符。但一般占用存儲空間較多,而且要花費時間轉(zhuǎn)換(二進制形式與用存儲空間較多,而且要花費時間轉(zhuǎn)換(二進制形式與ASCII碼間的轉(zhuǎn)換)。用二進制形式

5、輸出數(shù)值,可以節(jié)省外碼間的轉(zhuǎn)換)。用二進制形式輸出數(shù)值,可以節(jié)省外存空間和轉(zhuǎn)換時間,但一個字節(jié)并不對應(yīng)一個字符,不能直存空間和轉(zhuǎn)換時間,但一個字節(jié)并不對應(yīng)一個字符,不能直接輸出字符形式。一般中間結(jié)果數(shù)據(jù)需要暫時保存在外存以接輸出字符形式。一般中間結(jié)果數(shù)據(jù)需要暫時保存在外存以后又需要讀入到內(nèi)存的,常用二進制文件保存。后又需要讀入到內(nèi)存的,常用二進制文件保存。11.1.2 C語言的文件系統(tǒng)語言的文件系統(tǒng)從從C語言對文件的處理方法來看,可以將文件分為兩類:緩語言對文件的處理方法來看,可以將文件分為兩類:緩沖文件系統(tǒng)和非緩沖文件系統(tǒng)。緩沖文件系統(tǒng),稱為標準文沖文件系統(tǒng)和非緩沖文件系統(tǒng)。緩沖文件系統(tǒng),稱

6、為標準文件系統(tǒng)。件系統(tǒng)。緩沖文件系統(tǒng)的特點是:系統(tǒng)自動地在內(nèi)存中為每一個正在緩沖文件系統(tǒng)的特點是:系統(tǒng)自動地在內(nèi)存中為每一個正在讀寫的文件開辟一個緩沖區(qū),利用緩沖區(qū)完成文件讀寫操作。讀寫的文件開辟一個緩沖區(qū),利用緩沖區(qū)完成文件讀寫操作。將數(shù)據(jù)寫入文件或從文件中讀出數(shù)據(jù)的過程如圖將數(shù)據(jù)寫入文件或從文件中讀出數(shù)據(jù)的過程如圖11-1所示。所示。圖圖11-1 文件的讀寫過程文件的讀寫過程非緩沖文件系統(tǒng)不由系統(tǒng)自動設(shè)置緩沖區(qū),而由用戶自己根非緩沖文件系統(tǒng)不由系統(tǒng)自動設(shè)置緩沖區(qū),而由用戶自己根據(jù)需要設(shè)置。據(jù)需要設(shè)置。一般把緩沖文件系統(tǒng)的輸入一般把緩沖文件系統(tǒng)的輸入/輸出稱為標準輸入輸出稱為標準輸入/輸出(

7、標準輸出(標準I/O),非緩沖文件系統(tǒng)的輸入),非緩沖文件系統(tǒng)的輸入/輸出稱為系統(tǒng)輸入輸出稱為系統(tǒng)輸入/輸出(系輸出(系統(tǒng)統(tǒng)I/O)。在)。在C語言中,沒有輸入語言中,沒有輸入/輸出語句,對文件的讀寫輸出語句,對文件的讀寫都是用庫函數(shù)來實現(xiàn)的。都是用庫函數(shù)來實現(xiàn)的。ANSI規(guī)定了標準輸入規(guī)定了標準輸入/輸出函數(shù),輸出函數(shù),用它們對文件進行讀寫。本章主要介紹用它們對文件進行讀寫。本章主要介紹ANSI C的文件系統(tǒng)的文件系統(tǒng)及其讀寫方法。及其讀寫方法。11.1.3 文件類型指針文件類型指針在緩沖文件系統(tǒng)中,涉及到的關(guān)鍵概念是文件類型指針。對在緩沖文件系統(tǒng)中,涉及到的關(guān)鍵概念是文件類型指針。對于每個

8、正在使用的文件都要說明一個于每個正在使用的文件都要說明一個FILE類型的結(jié)構(gòu)體變類型的結(jié)構(gòu)體變量,該結(jié)構(gòu)體變量用于存放文件的有關(guān)信息。在量,該結(jié)構(gòu)體變量用于存放文件的有關(guān)信息。在C語言中,語言中,無論是一般磁盤文件還是設(shè)備文件,都要通過文件結(jié)構(gòu)的數(shù)無論是一般磁盤文件還是設(shè)備文件,都要通過文件結(jié)構(gòu)的數(shù)據(jù)集合進行輸入據(jù)集合進行輸入/輸出處理。在緩沖文件系統(tǒng)中,每個被使用輸出處理。在緩沖文件系統(tǒng)中,每個被使用的文件都在內(nèi)存中開辟一個區(qū)域,用來存放文件的有關(guān)信息。的文件都在內(nèi)存中開辟一個區(qū)域,用來存放文件的有關(guān)信息。這些信息保存在一個結(jié)構(gòu)體類型的變量中。該結(jié)構(gòu)體類型是這些信息保存在一個結(jié)構(gòu)體類型的變量

9、中。該結(jié)構(gòu)體類型是在在STDIO.H頭文件中由系統(tǒng)定義的,取名為頭文件中由系統(tǒng)定義的,取名為FILE。不同的編譯系統(tǒng)可能使用不同的定義,但基本含義不會有太不同的編譯系統(tǒng)可能使用不同的定義,但基本含義不會有太大變化,因為它最終都要通過操作系統(tǒng)去控制這些文件。用大變化,因為它最終都要通過操作系統(tǒng)去控制這些文件。用戶不必關(guān)心戶不必關(guān)心FILE結(jié)構(gòu)體的細節(jié),只要知道對于每一個要操結(jié)構(gòu)體的細節(jié),只要知道對于每一個要操作的文件,系統(tǒng)都為它開辟一個如上的結(jié)構(gòu)體變量。有幾個作的文件,系統(tǒng)都為它開辟一個如上的結(jié)構(gòu)體變量。有幾個文件就開辟幾個這樣的結(jié)構(gòu)體變量,分別用來存放各個文件文件就開辟幾個這樣的結(jié)構(gòu)體變量,分

10、別用來存放各個文件的有關(guān)信息。這些結(jié)構(gòu)體變量不用變量名來標識,而通過指的有關(guān)信息。這些結(jié)構(gòu)體變量不用變量名來標識,而通過指向結(jié)構(gòu)體類型的指針變量去訪問,這就是文件類型指針。向結(jié)構(gòu)體類型的指針變量去訪問,這就是文件類型指針。在在C程序中,凡是要對已打開的文件進行操作,都要通過指程序中,凡是要對已打開的文件進行操作,都要通過指向該文件的向該文件的FILE結(jié)構(gòu)體的指針。為此,需要在程序中定義結(jié)構(gòu)體的指針。為此,需要在程序中定義指向指向FILE結(jié)構(gòu)體的指針變量。文件類型指針變量定義的格結(jié)構(gòu)體的指針變量。文件類型指針變量定義的格式為:式為:FILE *文件類型指針變量名;其中,其中,F(xiàn)ILE是文件結(jié)構(gòu)體

11、的類型名,標識結(jié)構(gòu)體類型。文是文件結(jié)構(gòu)體的類型名,標識結(jié)構(gòu)體類型。文件類型指針是指向件類型指針是指向FILE結(jié)構(gòu)體的指針。結(jié)構(gòu)體的指針。需要注意的是,語言中標準設(shè)備文件是由系統(tǒng)控制的,它需要注意的是,語言中標準設(shè)備文件是由系統(tǒng)控制的,它們由系統(tǒng)自動打開和關(guān)閉,標準設(shè)備文件的文件結(jié)構(gòu)的指針們由系統(tǒng)自動打開和關(guān)閉,標準設(shè)備文件的文件結(jié)構(gòu)的指針由系統(tǒng)命名,用戶在程序中可以直接使用,無需再進行說明。由系統(tǒng)命名,用戶在程序中可以直接使用,無需再進行說明。語言中提供了語言中提供了3個常用標準設(shè)備文件的指針,標準輸入文個常用標準設(shè)備文件的指針,標準輸入文件(鍵盤)的文件類型指針是件(鍵盤)的文件類型指針是S

12、TDIN,標準輸出文件(顯示,標準輸出文件(顯示器)的文件類型指針是器)的文件類型指針是STDOUT,標準錯誤輸出文件(顯示,標準錯誤輸出文件(顯示器)的文件類型指針是器)的文件類型指針是STDERR。11.2 文件的打開與文件文件的打開與文件11.2.1 打開文件打開文件打開文件需調(diào)用打開文件需調(diào)用FOPEN函數(shù)。它的一般調(diào)用格式為:函數(shù)。它的一般調(diào)用格式為:FILE *FP;FP=FOPEN(文件說明符,操作方式);其中,文件說明符指定打開的文件名,可以包含盤符、路徑其中,文件說明符指定打開的文件名,可以包含盤符、路徑和文件名,它是一個字符串。注意,文件路徑中的和文件名,它是一個字符串。注

13、意,文件路徑中的“”要寫成要寫成“”,例如,要打開,例如,要打開D:CPP中的中的TEST.DAT文件,文件說明文件,文件說明符要寫成符要寫成“D:DPPTEST.DAT”。操作方式指定打開文件的。操作方式指定打開文件的讀寫方式,該參數(shù)是字符串,必須小寫。文件操作方式用具讀寫方式,該參數(shù)是字符串,必須小寫。文件操作方式用具有特定含義的符號表示,如表有特定含義的符號表示,如表11-1所示。函數(shù)返回一指向文所示。函數(shù)返回一指向文件塊的首地址,以后對文件的操作就利用這個文件塊。如果件塊的首地址,以后對文件的操作就利用這個文件塊。如果打開文件失敗,則返回打開文件失敗,則返回NULL。表表11-1 文件

14、操作方式文件操作方式文件操作方式含文件操作方式含 義文件操作方式含義文件操作方式含 義義R(只讀)為輸入(只讀)為輸入打開一個文本文件打開一個文本文件R+(讀寫)為讀(讀寫)為讀/寫打開一個文本文件寫打開一個文本文件W(只寫)為輸出打開一個文本文件(只寫)為輸出打開一個文本文件W+(讀寫)為讀(讀寫)為讀/寫建立寫建立一個新的文本文件一個新的文本文件A(追加)向文本文件尾增加數(shù)據(jù)(追加)向文本文件尾增加數(shù)據(jù)A+(讀(讀寫)為讀寫)為讀/寫打開一個文本文件寫打開一個文本文件RB(只讀)為輸入打開一個(只讀)為輸入打開一個二進制文件二進制文件RB+(讀寫)為讀(讀寫)為讀/寫打開一個二進制文件寫打

15、開一個二進制文件WB(只寫)為輸出打開一個二進制文件(只寫)為輸出打開一個二進制文件WB+(讀寫)為讀(讀寫)為讀/寫寫建立一個新的二進制文件建立一個新的二進制文件AB(追加)向二進制文件尾增加(追加)向二進制文件尾增加數(shù)據(jù)數(shù)據(jù)AB+(讀寫)為讀(讀寫)為讀/寫打開一個二進制文件寫打開一個二進制文件11.2.2 關(guān)閉文件關(guān)閉文件用用FCLOSE函數(shù)關(guān)閉文件,其調(diào)用格式為:函數(shù)關(guān)閉文件,其調(diào)用格式為:FCLOSE(文件類型指針);FCLOSE函數(shù)用于關(guān)閉已打開的文件,切斷緩沖區(qū)與該文件函數(shù)用于關(guān)閉已打開的文件,切斷緩沖區(qū)與該文件的聯(lián)系,并釋放文件類型指針。正常關(guān)閉返回值為的聯(lián)系,并釋放文件類型指

16、針。正常關(guān)閉返回值為0,否則,否則返回一個非返回一個非0值,表示關(guān)閉出錯。值,表示關(guān)閉出錯。11.3 文件的順序讀寫操作文件的順序讀寫操作11.3.1 文件的字符輸入文件的字符輸入/輸出函數(shù)輸出函數(shù)FGETC函數(shù)和函數(shù)和FPUTC函數(shù)按字符方式讀寫文件。把一個字符寫函數(shù)按字符方式讀寫文件。把一個字符寫入一個打開的磁盤文件上,用入一個打開的磁盤文件上,用FPUTC函數(shù)。從指定文件當(dāng)前指函數(shù)。從指定文件當(dāng)前指針下,讀取一個字符可用針下,讀取一個字符可用FGETC函數(shù)。函數(shù)。1字符輸入函數(shù)字符輸入函數(shù)FGETC()該函數(shù)的調(diào)用格式為:該函數(shù)的調(diào)用格式為:字符變量=FGETC(文件類型指針);FGET

17、C函數(shù)從指定的文件中讀取一個字符,即從文件類型指針函數(shù)從指定的文件中讀取一個字符,即從文件類型指針所指向的文件(該文件必須是以讀或讀寫方式打開的)中讀取所指向的文件(該文件必須是以讀或讀寫方式打開的)中讀取一個字符返回,讀取的字符賦給字符變量。若讀取字符時文件一個字符返回,讀取的字符賦給字符變量。若讀取字符時文件已經(jīng)結(jié)束或出錯,已經(jīng)結(jié)束或出錯,F(xiàn)GETC函數(shù)返回文件結(jié)束標記函數(shù)返回文件結(jié)束標記EOF,此時,此時EOF的值為的值為-1。注意:文件結(jié)束標記注意:文件結(jié)束標記EOF是不可輸出字符,不能在屏幕上顯是不可輸出字符,不能在屏幕上顯示。因為示。因為EOF是在頭文件是在頭文件STDIO.H中定

18、義的符號常量,其值中定義的符號常量,其值為為-1,而,而ASCII碼中沒有用到碼中沒有用到-1,可見,用它作為文件結(jié)束標,可見,用它作為文件結(jié)束標記是合適的。記是合適的。2字符輸出函數(shù)字符輸出函數(shù)FPUTC()該函數(shù)的調(diào)用格式為:該函數(shù)的調(diào)用格式為:FPUTC(字符,文件類型指針);FPUTC函數(shù)將一個字符輸出到指定文件中。即將字符輸出到函數(shù)將一個字符輸出到指定文件中。即將字符輸出到文件類型指針所指向的文件。若輸出操作成功,該函數(shù)返回文件類型指針所指向的文件。若輸出操作成功,該函數(shù)返回輸出的字符,否則返回輸出的字符,否則返回EOF。3FEOF 函數(shù)函數(shù)在讀二進制文件時,讀入某字節(jié)的二進制數(shù)據(jù)有

19、可能為在讀二進制文件時,讀入某字節(jié)的二進制數(shù)據(jù)有可能為-1,而這又恰好是而這又恰好是EOF的值,這就出現(xiàn)了需要讀入有用數(shù)據(jù)而即的值,這就出現(xiàn)了需要讀入有用數(shù)據(jù)而即被處理為文件結(jié)束的情況,引起二義性。為解決這個問題,被處理為文件結(jié)束的情況,引起二義性。為解決這個問題,系統(tǒng)給出系統(tǒng)給出FEOF函數(shù)來判斷文件是否真正結(jié)束。其調(diào)用的一函數(shù)來判斷文件是否真正結(jié)束。其調(diào)用的一般格式為:般格式為:FEOF(文件類型指針);該函數(shù)可以判斷文件類型指針是否已指向文件結(jié)束處,若是,該函數(shù)可以判斷文件類型指針是否已指向文件結(jié)束處,若是,則返回非則返回非0值(真),否則,返回值(真),否則,返回0(假)。從鍵盤讀入數(shù)

20、據(jù),(假)。從鍵盤讀入數(shù)據(jù),按按【CTRL+Z】鍵(顯示器顯示鍵(顯示器顯示 Z),即輸入文件結(jié)束符。),即輸入文件結(jié)束符。FEOF函數(shù)可用于二進制文件和函數(shù)可用于二進制文件和ASCII碼文件。碼文件?!纠?1.1】首先從鍵盤輸入若干字符,逐個將它們寫入文件首先從鍵盤輸入若干字符,逐個將它們寫入文件FILE1.TXT中,直到輸入一個中,直到輸入一個“*”為止。然后從該文件中逐為止。然后從該文件中逐個讀出字符,并在屏幕上顯示出來。個讀出字符,并在屏幕上顯示出來。4文件讀寫時的數(shù)據(jù)流動文件讀寫時的數(shù)據(jù)流動對文件進行寫操作時的數(shù)據(jù)流動如圖對文件進行寫操作時的數(shù)據(jù)流動如圖11-2所示。所示。 圖圖1

21、1-2 寫時的數(shù)據(jù)流動寫時的數(shù)據(jù)流動對文件進行讀操作時的數(shù)據(jù)流動如圖對文件進行讀操作時的數(shù)據(jù)流動如圖11-3所示。所示。 圖圖11-3 讀時的數(shù)據(jù)流動讀時的數(shù)據(jù)流動11.3.2 文件的字符串輸入文件的字符串輸入/輸出函數(shù)輸出函數(shù)1字符串輸入函數(shù)字符串輸入函數(shù)FGETS()該函數(shù)的調(diào)用格式為:該函數(shù)的調(diào)用格式為:FGETS(字符數(shù)組,字符數(shù),文件類型指針);FGETS函數(shù)從文件類型指針所指向的文件中讀取長度不超過函數(shù)從文件類型指針所指向的文件中讀取長度不超過N-1(設(shè)字符數(shù)參數(shù)為(設(shè)字符數(shù)參數(shù)為N)個字符的字符串,并將該字符串放)個字符的字符串,并將該字符串放到字符數(shù)組中。如果操作正確,函數(shù)的返

22、回值為字符數(shù)組的到字符數(shù)組中。如果操作正確,函數(shù)的返回值為字符數(shù)組的首地址。如果文件結(jié)束或出錯,則函數(shù)的返回值為首地址。如果文件結(jié)束或出錯,則函數(shù)的返回值為NULL。分以下幾種情況:分以下幾種情況:(1)從文件中已經(jīng)讀入了)從文件中已經(jīng)讀入了N-1個連續(xù)的字符,還沒有遇到文個連續(xù)的字符,還沒有遇到文件結(jié)束標志或行結(jié)束標志件結(jié)束標志或行結(jié)束標志“N”,則,則S中存入中存入N-1個字符,串尾個字符,串尾以串結(jié)束標記以串結(jié)束標記“0”結(jié)束。結(jié)束。(2)從文件中讀入字符遇到了行結(jié)束標志)從文件中讀入字符遇到了行結(jié)束標志“N”,則,則S中存入中存入實際讀入的字符,串尾為實際讀入的字符,串尾為“N”和和“

23、0”。(3)在讀文件的過程中遇到文件尾(文件結(jié)束標志)在讀文件的過程中遇到文件尾(文件結(jié)束標志EOF),),則則S中存入實際讀入的字符,串尾為中存入實際讀入的字符,串尾為“0”。文件結(jié)束標志。文件結(jié)束標志EOF不會存入數(shù)組。不會存入數(shù)組。(4)當(dāng)文件已經(jīng)結(jié)束仍然繼續(xù)讀文件,或讀取文件內(nèi)容發(fā))當(dāng)文件已經(jīng)結(jié)束仍然繼續(xù)讀文件,或讀取文件內(nèi)容發(fā)生錯誤,則函數(shù)的返回值為生錯誤,則函數(shù)的返回值為NULL,表示文件結(jié)束。,表示文件結(jié)束。2字符串輸出函數(shù)字符串輸出函數(shù)FPUTS()該函數(shù)的調(diào)用格式為:該函數(shù)的調(diào)用格式為:FPUTS(字符串,文件類型指針);FPUTS函數(shù)將字符串寫入文件類型指針指向的文件。輸出

24、的函數(shù)將字符串寫入文件類型指針指向的文件。輸出的字符串寫入文件時,字符字符串寫入文件時,字符“0”被自動舍去。函數(shù)調(diào)用成功,被自動舍去。函數(shù)調(diào)用成功,則返回則返回0,否則返回,否則返回EOF?!纠?1.2】首先從鍵盤輸入若干字符串,逐個將它們寫入文首先從鍵盤輸入若干字符串,逐個將它們寫入文件件FILE2.TXT中,直到按中,直到按【CTRL+Z】鍵,即輸入文件結(jié)束鍵,即輸入文件結(jié)束符時結(jié)束。然后從該文件中逐個讀出字符串,并在屏幕上顯符時結(jié)束。然后從該文件中逐個讀出字符串,并在屏幕上顯示出來。示出來。11.3.3 文件的格式化輸入文件的格式化輸入/輸出函數(shù)輸出函數(shù)1格式化輸入函數(shù)格式化輸入函數(shù)

25、FSCANF()該函數(shù)的調(diào)用格式為:該函數(shù)的調(diào)用格式為:FSCANF(文件類型指針,格式控制串,輸入項表);其中格式控制串和輸入項表的內(nèi)容、含義及對應(yīng)關(guān)系與其中格式控制串和輸入項表的內(nèi)容、含義及對應(yīng)關(guān)系與SCANF函數(shù)相同。函數(shù)相同。FSCANF函數(shù)從文件類型指針指向的文件中,按格式控制符函數(shù)從文件類型指針指向的文件中,按格式控制符讀取相應(yīng)數(shù)據(jù)賦給輸入項表中的對應(yīng)變量地址中。例如:讀取相應(yīng)數(shù)據(jù)賦給輸入項表中的對應(yīng)變量地址中。例如:FSCANF(FP,“%D,%F”,&I,&T);從指定的磁盤文件上讀取從指定的磁盤文件上讀取ASCII字符,并按字符,并按“%D”和和“%F”型型格式轉(zhuǎn)換成二進制形

26、式的數(shù)據(jù)送給變量格式轉(zhuǎn)換成二進制形式的數(shù)據(jù)送給變量I和和T。2格式化輸出函數(shù)格式化輸出函數(shù)FPRINTF()該函數(shù)的調(diào)用格式為:該函數(shù)的調(diào)用格式為:FPRINTF(文件類型指針,格式控制串,輸出項表);格式控制串和輸出項表的內(nèi)容及對應(yīng)關(guān)系與格式控制串和輸出項表的內(nèi)容及對應(yīng)關(guān)系與PRINTF函數(shù)相函數(shù)相同。同。FPRINTF函數(shù)將輸出項表中的各個常量、變量或表達式,函數(shù)將輸出項表中的各個常量、變量或表達式,依次按格式控制符說明的格式寫入文件類型指針指向的文件。依次按格式控制符說明的格式寫入文件類型指針指向的文件。該函數(shù)調(diào)用的返回值是實際輸出的字符數(shù)。該函數(shù)調(diào)用的返回值是實際輸出的字符數(shù)?!纠?

27、1.3】首先提供首先提供N個學(xué)生的信息,逐個將它們寫入文件個學(xué)生的信息,逐個將它們寫入文件FILE3.TXT中。然后從該文件中逐個讀出學(xué)生的信息,并在中。然后從該文件中逐個讀出學(xué)生的信息,并在屏幕上顯示出來。屏幕上顯示出來。11.3.4 文件的數(shù)據(jù)塊輸入文件的數(shù)據(jù)塊輸入/輸出函數(shù)輸出函數(shù)這類函數(shù)是這類函數(shù)是ANSI C標準對緩沖文件系統(tǒng)所做的擴充,以方標準對緩沖文件系統(tǒng)所做的擴充,以方便文件操作實現(xiàn)一次讀寫一組數(shù)據(jù)的功能。例如,采用這種便文件操作實現(xiàn)一次讀寫一組數(shù)據(jù)的功能。例如,采用這種方式對數(shù)組和結(jié)構(gòu)體進行整體的輸入方式對數(shù)組和結(jié)構(gòu)體進行整體的輸入/輸出是比較方便的。輸出是比較方便的。1文件

28、數(shù)據(jù)塊讀函數(shù)文件數(shù)據(jù)塊讀函數(shù)FREAD()該函數(shù)的調(diào)用格式為:該函數(shù)的調(diào)用格式為:FREAD(數(shù)據(jù)地址,讀數(shù)據(jù)的字節(jié)數(shù),數(shù)據(jù)項數(shù)目,文件類型指針);FREAD函數(shù)對文件類型指針所指向的文件讀取指定的數(shù)據(jù)函數(shù)對文件類型指針所指向的文件讀取指定的數(shù)據(jù)項數(shù),每次讀取指定字節(jié)數(shù)的數(shù)據(jù)塊,將讀取的各數(shù)據(jù)塊存項數(shù),每次讀取指定字節(jié)數(shù)的數(shù)據(jù)塊,將讀取的各數(shù)據(jù)塊存到數(shù)據(jù)地址所指向的內(nèi)存區(qū)。該函數(shù)的返回值是實際讀取的到數(shù)據(jù)地址所指向的內(nèi)存區(qū)。該函數(shù)的返回值是實際讀取的數(shù)據(jù)項數(shù)目。若讀成功,返回數(shù)據(jù)項數(shù)目;若讀失敗或遇到數(shù)據(jù)項數(shù)目。若讀成功,返回數(shù)據(jù)項數(shù)目;若讀失敗或遇到文件結(jié)束符,返回文件結(jié)束符,返回0。2文件

29、數(shù)據(jù)塊寫函數(shù)文件數(shù)據(jù)塊寫函數(shù)FWRITE()該函數(shù)的調(diào)用格式為:該函數(shù)的調(diào)用格式為:FWRITE(數(shù)據(jù)地址,寫數(shù)據(jù)的字節(jié)數(shù),數(shù)據(jù)項數(shù)目,文件類型指針);FWRITE函數(shù)的參數(shù)及其功能與函數(shù)的參數(shù)及其功能與FREAD函數(shù)類似,只是對函數(shù)類似,只是對文件的操作而言是互逆的,一個是讀取,一個是寫入。若寫文件的操作而言是互逆的,一個是讀取,一個是寫入。若寫成功,返回數(shù)據(jù)項數(shù)目,否則返回成功,返回數(shù)據(jù)項數(shù)目,否則返回0。如果文件以二進制形式打開,用以如果文件以二進制形式打開,用以FREAD和和FWRITE函數(shù)函數(shù)可以讀寫任何類型的數(shù)據(jù)。例如:可以讀寫任何類型的數(shù)據(jù)。例如:FREAD(A,4,2,FP);

30、其中其中A是一個實型數(shù)組名。一個實型變量占是一個實型數(shù)組名。一個實型變量占4個字節(jié)。該函數(shù)個字節(jié)。該函數(shù)從從FP所指向的文件讀入所指向的文件讀入2個個4字節(jié)的數(shù)據(jù),存儲到數(shù)組字節(jié)的數(shù)據(jù),存儲到數(shù)組A中。中。注意,用注意,用FREAD和和FWRITE函數(shù)進行讀寫時,必須采用二函數(shù)進行讀寫時,必須采用二進制。進制?!纠?1.4】從例從例11.3建立的建立的FILE3.TXT文本文件中讀取數(shù)據(jù)文本文件中讀取數(shù)據(jù)生成生成FILE3.DAT二進制文件,然后將二進制文件,然后將FILE3.DAT文件在屏幕文件在屏幕上顯示出來。上顯示出來。11.4 文件的隨機讀寫操作文件的隨機讀寫操作11.4.1 文件的

31、定位文件的定位1位置指針重返文件頭函數(shù)位置指針重返文件頭函數(shù)REWIND()該函數(shù)可以使文件指針重新指向文件的開頭,函數(shù)本身無該函數(shù)可以使文件指針重新指向文件的開頭,函數(shù)本身無返回值。調(diào)用的一般格式為:返回值。調(diào)用的一般格式為:REWIND(文件類型指針);2改變文件位置指針函數(shù)改變文件位置指針函數(shù)FSEEK()隨機文件實現(xiàn)的關(guān)鍵是控制當(dāng)前文件指針的移動,可由隨機文件實現(xiàn)的關(guān)鍵是控制當(dāng)前文件指針的移動,可由FSEEK函數(shù)完成。函數(shù)完成。FSEEK函數(shù)的調(diào)用格式為:函數(shù)的調(diào)用格式為:FSEEK(文件類型指針,偏移量,起始點);其中其中“偏移量偏移量”是離起點的字節(jié)數(shù),可為整型或長整型。起是離起點

32、的字節(jié)數(shù),可為整型或長整型。起始點指出以什么位置為基準進行移動,用下列符號或數(shù)字始點指出以什么位置為基準進行移動,用下列符號或數(shù)字表示:表示:(1)文件開始位置用)文件開始位置用SEEK_SET或或0表示。表示。(2)文件當(dāng)前位置用)文件當(dāng)前位置用SEEK_CUR或或1表示。表示。(3)文件末尾位置用)文件末尾位置用SEEK_END或或2表示。表示。以文件開始位置為基準,偏移量只能是正值;以文件末尾以文件開始位置為基準,偏移量只能是正值;以文件末尾位置為基準,偏移量只能是負值;以文件文件當(dāng)前位置位置為基準,偏移量只能是負值;以文件文件當(dāng)前位置(即文件當(dāng)前指針)為基準,偏移量可以是正值,也可以(

33、即文件當(dāng)前指針)為基準,偏移量可以是正值,也可以是負值。是負值。下面是下面是FSEEK函數(shù)調(diào)用的幾個例子。函數(shù)調(diào)用的幾個例子。FSEEK(FP,100L,SEEK_SET); /*將文件指針從文件開始移到第100字節(jié)處*/FSEEK(FP,50L,1); /*將文件指針從當(dāng)前位置向文件尾移動50個字節(jié)*/FSEEK(FP,-50L,1); /*將文件指針從當(dāng)前位置向文件頭移動50個字節(jié)*/FSEEK(FP,-30L,2); /*將文件指針從文件末尾向文件頭移動30個字節(jié)*/3查詢文件指針函數(shù)查詢文件指針函數(shù)FTELL函數(shù)函數(shù)()該函數(shù)的調(diào)用的格式為:該函數(shù)的調(diào)用的格式為:FTELL(文件類型指

34、針);FTELL函數(shù)的返回值為文件開始處到當(dāng)前指針處的偏移字節(jié)函數(shù)的返回值為文件開始處到當(dāng)前指針處的偏移字節(jié)數(shù)。如果返回數(shù)。如果返回-1,則表示出錯。,則表示出錯。11.4.2 二進制隨機文件二進制隨機文件對于隨機文件,數(shù)據(jù)塊的字節(jié)數(shù)必須是固定不變的,否則,對于隨機文件,數(shù)據(jù)塊的字節(jié)數(shù)必須是固定不變的,否則,無法計算出文件當(dāng)前指針的位置。對于文本文件,因一行的無法計算出文件當(dāng)前指針的位置。對于文本文件,因一行的字節(jié)數(shù)不等,一般不能用隨機文件。隨機文件可以隨機讀或字節(jié)數(shù)不等,一般不能用隨機文件。隨機文件可以隨機讀或?qū)?。寫。【例?1.5】從例從例11.3建立的建立的FILE3.TXT文本文件中讀

35、取數(shù)據(jù)文本文件中讀取數(shù)據(jù)生成生成BFILE3.DAT二進制隨機文件,然后將二進制隨機文件,然后將BFILE3.DAT文文件在屏幕上顯示出來。件在屏幕上顯示出來。程序中以學(xué)生學(xué)號計算出每位學(xué)生信息的偏移量,然后應(yīng)用程序中以學(xué)生學(xué)號計算出每位學(xué)生信息的偏移量,然后應(yīng)用FSEEK函數(shù)確定文件當(dāng)前指針的位置。函數(shù)確定文件當(dāng)前指針的位置?!纠?1.6】編寫一個程序,對文件編寫一個程序,對文件FILE3.DAT加密,加密方加密,加密方式是對文件中所有第奇數(shù)個字節(jié)的中間兩個二進制位進行取式是對文件中所有第奇數(shù)個字節(jié)的中間兩個二進制位進行取反。反。11.5 文件操作時的出錯檢測文件操作時的出錯檢測1報告文件

36、操作錯誤狀態(tài)函數(shù)報告文件操作錯誤狀態(tài)函數(shù)FERROR函數(shù)用于報告文件操作錯誤狀態(tài),其調(diào)用格式為:函數(shù)用于報告文件操作錯誤狀態(tài),其調(diào)用格式為:FERROR(文件類型指針);函數(shù)函數(shù)FERROR的功能是測試文件指針所指的文件是否有錯誤。的功能是測試文件指針所指的文件是否有錯誤。如果沒有錯誤,返回值為如果沒有錯誤,返回值為0;否則,返回一個非;否則,返回一個非0值,表示出值,表示出錯。錯。2清除錯誤標志函數(shù)清除錯誤標志函數(shù)CLEARERR函數(shù)用于清除錯誤標志,調(diào)用格式為:函數(shù)用于清除錯誤標志,調(diào)用格式為:CLEARERR(文件類型指針);該函數(shù)清除該函數(shù)清除FP所指的文件的錯誤標志,即將文件錯誤標志

37、和所指的文件的錯誤標志,即將文件錯誤標志和文件結(jié)束標記置為文件結(jié)束標記置為0。在用在用FEOF和和FERROR函數(shù)檢測文件結(jié)束和出錯情況時,遇函數(shù)檢測文件結(jié)束和出錯情況時,遇到文件結(jié)束或出錯,兩個函數(shù)的返回值均為非到文件結(jié)束或出錯,兩個函數(shù)的返回值均為非0值。對于出值。對于出錯或已結(jié)束的文件,在程序中可以有兩種方法清除出錯標記:錯或已結(jié)束的文件,在程序中可以有兩種方法清除出錯標記:調(diào)用調(diào)用CLEARERR函數(shù)清除出錯標記,或者對出錯文件調(diào)用函數(shù)清除出錯標記,或者對出錯文件調(diào)用一個正確的文件讀寫函數(shù)。一個正確的文件讀寫函數(shù)?!纠?1.7】從鍵盤上輸入一個長度小于從鍵盤上輸入一個長度小于20的字

38、符串,將該字的字符串,將該字符串寫入文件符串寫入文件FILE4.TXT中,并測試是否有錯。若有錯,則中,并測試是否有錯。若有錯,則輸出錯誤信息,然后清除文件出錯標記,關(guān)閉文件。否則輸輸出錯誤信息,然后清除文件出錯標記,關(guān)閉文件。否則輸出剛才輸入的字符串。出剛才輸入的字符串。11.6 文件應(yīng)用舉例文件應(yīng)用舉例【例例11.8】從從FILE5.TXT文件中讀出信息,再將信息逆序?qū)懳募凶x出信息,再將信息逆序?qū)懙降紽ILE6.TXT文件中。文件中?!纠?1.9】有兩個磁盤文件有兩個磁盤文件FILE7.TXT和和FILE8.TXT,各存,各存放一行已經(jīng)按升序排列的字母(不多于放一行已經(jīng)按升序排列的字母

39、(不多于20個),要求依然按個),要求依然按字母升序排列,將兩個文件中的內(nèi)容合并,輸出到一個新文字母升序排列,將兩個文件中的內(nèi)容合并,輸出到一個新文件件FILE9.TXT中去。中去。【例例11.10】在在NUMBER.DAT文件中放有文件中放有10個不小個不小于于2的正整數(shù),編寫程序?qū)崿F(xiàn):的正整數(shù),編寫程序?qū)崿F(xiàn):(1)在)在PRIME函數(shù)中判斷和統(tǒng)計函數(shù)中判斷和統(tǒng)計10個整數(shù)中的素個整數(shù)中的素數(shù)以及個數(shù)。數(shù)以及個數(shù)。(2)在主函數(shù)中將全部素數(shù)以及素數(shù)個數(shù)追加到文)在主函數(shù)中將全部素數(shù)以及素數(shù)個數(shù)追加到文件件NUMBER.DAT的尾部,同時輸出到屏幕上。的尾部,同時輸出到屏幕上?!纠?1.11

40、】將將SINX在在(I=0,1,2,359)上的值保存在上的值保存在文件文件DSIN.DAT中,并從該文件中讀取數(shù)據(jù),以這中,并從該文件中讀取數(shù)據(jù),以這些數(shù)據(jù)為基礎(chǔ),計算些數(shù)據(jù)為基礎(chǔ),計算SINX在在0,2上的定積分。上的定積分。 本本 章章 小小 結(jié)結(jié)1在文件操作方面,在文件操作方面,C語言與其他高級語言的不同之處在于:語言與其他高級語言的不同之處在于:C語言沒有提供單獨的文件操作語句,有關(guān)文件的操作均是語言沒有提供單獨的文件操作語句,有關(guān)文件的操作均是通過庫函數(shù)進行的。通過庫函數(shù)進行的。2在在C語言中引入了流(語言中引入了流(STREAM)的概念。它將數(shù)據(jù)的)的概念。它將數(shù)據(jù)的輸入輸入/輸出看作是數(shù)據(jù)的流入和流出,這種把數(shù)據(jù)的輸入輸出看作是數(shù)據(jù)的流入和流出,這種把數(shù)據(jù)的輸入/輸輸出操作對象抽象化為一種流,而不管它的具體結(jié)構(gòu)的方法很出操作對象抽象化為一種流,而不管它的具體結(jié)構(gòu)的方法很利于編程。在利于編程。在C中流可分為兩大類,即文本流(

溫馨提示

  • 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

提交評論