kj-第12章文件ppt課件(全)_第1頁(yè)
kj-第12章文件ppt課件(全)_第2頁(yè)
kj-第12章文件ppt課件(全)_第3頁(yè)
kj-第12章文件ppt課件(全)_第4頁(yè)
kj-第12章文件ppt課件(全)_第5頁(yè)
已閱讀5頁(yè),還剩52頁(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、第12章 文件 本章概述 本章的學(xué)習(xí)目標(biāo)主要內(nèi)容1本章概述文件操作是C語(yǔ)言程序設(shè)計(jì)中的重要組成部分。很多應(yīng)用問(wèn)題中會(huì)用到文件操作。本章討論C語(yǔ)言程序設(shè)計(jì)中的文件操作。包括文件的打開(kāi)與關(guān)閉、文件的定位與檢測(cè)、文件的讀寫(xiě)所使用的各種函數(shù)和編程方法。2本章的學(xué)習(xí)目標(biāo)本章教學(xué)目的:理解文件的概念,掌握用來(lái)進(jìn)行文件的打開(kāi)、關(guān)閉、定位、檢測(cè)、讀寫(xiě)操作的方法。本章教學(xué)重點(diǎn):文件的讀寫(xiě)本章教學(xué)難點(diǎn):文件的定位與檢測(cè)3主要內(nèi)容12.1 文件概述 12.2 文件的打開(kāi)與關(guān)閉 12.3 文件的定位和檢測(cè) 12.4 文件的讀寫(xiě) 12.5 程序設(shè)計(jì)舉例 412.1 文件概述 12.1.1 文件文件是程序設(shè)計(jì)中的一個(gè)重要

2、概念,所謂“文件”是指存儲(chǔ)在外部介質(zhì)(如磁盤)上的一組相關(guān)數(shù)據(jù)的集合,為了便于定位這組數(shù)據(jù),通常要為它取一個(gè)名稱,即文件名。操作系統(tǒng)就是以文件為單位對(duì)數(shù)據(jù)進(jìn)行管理的,如果想找存儲(chǔ)在外部介質(zhì)上的數(shù)據(jù),必須按文件名找到存放該數(shù)據(jù)的文件,然后再?gòu)奈募凶x取數(shù)據(jù)。從用戶的角度來(lái)看,文件可以分普通文件和設(shè)備文件。普通文件是駐留在外部介質(zhì)上的有序數(shù)據(jù)集,它可以是源文件、目標(biāo)文件、可執(zhí)行程序,也可是一組待輸入的原始數(shù)據(jù),或者是一組輸出結(jié)果。前者通常稱為程序文件,后者則可稱為數(shù)據(jù)文件。設(shè)備文件是指與主機(jī)相聯(lián)的各種外部設(shè)備,如顯示器、鍵盤等,對(duì)于操作系統(tǒng)而言,每一個(gè)與主機(jī)相聯(lián)的輸入/輸出設(shè)備都是一個(gè)文件,其輸入

3、輸出等同于文件的讀和寫(xiě)。例如,通常將顯示器定義為標(biāo)準(zhǔn)輸出文件,將鍵盤定義為標(biāo)準(zhǔn)輸入文件。我們前面使用的printf()、putchar()等C函數(shù)就是輸出到標(biāo)準(zhǔn)輸出文件(即顯示器),scanf()、getchar()等C函數(shù)就是從標(biāo)準(zhǔn)輸入文件(即鍵盤)輸入數(shù)據(jù)。 512.1 文件概述 12.1.2 數(shù)據(jù)文件的存儲(chǔ)形式從文件的編碼方式來(lái)看,文件可以分為ASCII碼文件和二進(jìn)制文件兩種。ASCII碼文件也稱為文本文件,這種文件在磁盤中存儲(chǔ)時(shí)每個(gè)字符對(duì)應(yīng)一個(gè)字節(jié),存放的是該字符的ASCII碼值。二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣輸出到磁盤上存放。ASCII碼文件內(nèi)容可以在屏幕上按字

4、符顯示,例如C源程序文件就是ASCII文件,在windows中可以直接用記事本打開(kāi)閱讀。由于ASCII碼文件是按字符顯示,因此能讀懂其內(nèi)容,而二進(jìn)制文件雖然有時(shí)也能顯示在屏幕上,但其內(nèi)容卻無(wú)法直接讀懂。6圖12.1中,00110001、00110010、00110011、00110100分別是字符1、2、3、4的ASCII碼值的二進(jìn)制形式。例如,數(shù)字1234的幾種存儲(chǔ)形式如圖12.1所示: 7存儲(chǔ)內(nèi)容用ASCII碼形式輸出時(shí),其字節(jié)與字符一一對(duì)應(yīng),一個(gè)字節(jié)代表一個(gè)字符,便于對(duì)字符進(jìn)行逐個(gè)處理,也便于輸出字符,但一般占用的存儲(chǔ)空間較多,而且要花費(fèi)轉(zhuǎn)換時(shí)間。用二進(jìn)制形式輸出,可以節(jié)省外存空間和轉(zhuǎn)換

5、時(shí)間,但一個(gè)字節(jié)與字符無(wú)一一對(duì)應(yīng)關(guān)系,不能直接輸出字符形式。一般中間結(jié)果數(shù)據(jù)需要暫時(shí)保存在外存上,常用二進(jìn)制文件保存。因?yàn)镃文件是一串字節(jié)流或二進(jìn)制流,所以C系統(tǒng)在處理這些文件時(shí),并不區(qū)分類型,都看成是字符流,按字節(jié)進(jìn)行處理。輸入輸出字符流的開(kāi)始和結(jié)束只由程序控制而不受物理符號(hào)(如回車符)的控制,即在輸出時(shí)不會(huì)自動(dòng)增加回車換行符以作為記錄結(jié)束的標(biāo)志,輸入時(shí)不以回車換行符作為記錄的間隔。我們把這種文件稱作“流式文件”。C語(yǔ)言允許對(duì)文件存取一個(gè)字符,有很強(qiáng)的靈活性。812.1.3 標(biāo)準(zhǔn)文件與非標(biāo)準(zhǔn)文件在老版本的C(如Unix下的C)中對(duì)文件的處理方式有兩種:一種是緩沖文件系統(tǒng)又稱標(biāo)準(zhǔn)文件系統(tǒng),另一

6、種是非緩沖文件系統(tǒng)又稱非標(biāo)準(zhǔn)文件系統(tǒng)。9所謂“緩沖文件系統(tǒng)”是指系統(tǒng)自動(dòng)地在內(nèi)存區(qū)為每一個(gè)正在使用的文件開(kāi)辟一個(gè)緩沖區(qū),從內(nèi)存向磁盤輸出數(shù)據(jù)時(shí)必須先送到內(nèi)存中的緩沖區(qū),緩沖區(qū)裝滿數(shù)據(jù)后,再一起送到磁盤中去。同樣,從磁盤向內(nèi)存中讀入數(shù)據(jù)時(shí),則一次從磁盤文件中將一批數(shù)據(jù)讀入到緩沖區(qū),然后再?gòu)木彌_區(qū)逐個(gè)地將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)(給程序中的變量),如圖12.2所示。緩沖區(qū)的大小隨C的版本不同而不同,一般為512字節(jié)。10所謂“非緩沖文件系統(tǒng)”是指系統(tǒng)不會(huì)自動(dòng)開(kāi)辟確定大小的緩沖區(qū),而由程序?yàn)槊總€(gè)文件設(shè)定緩沖區(qū)。C語(yǔ)言中沒(méi)有專門的輸入輸出語(yǔ)句,對(duì)文件的讀寫(xiě)都是用庫(kù)函數(shù)來(lái)實(shí)現(xiàn)的,ANSI規(guī)定了輸入輸出函數(shù),用

7、它們對(duì)文件進(jìn)行讀寫(xiě)。本章只介紹ANSI C規(guī)定的緩沖文件系統(tǒng),即標(biāo)準(zhǔn)文件系統(tǒng)。 1112.1.4 文件類型指針 在緩沖文件系統(tǒng)中有一個(gè)關(guān)鍵概念是“文件類型指針”,每一個(gè)存在的文件都在內(nèi)存中開(kāi)辟一個(gè)區(qū)域,用來(lái)存放文件的有關(guān)信息(如文件的名稱、文件狀態(tài)、文件當(dāng)前位置等),這些信息保存在一個(gè)結(jié)構(gòu)體變量中,該結(jié)構(gòu)體由系統(tǒng)聲明,取名為FILE。 Turbo C在stdio.h文件中有以下的類型聲明:typedef struct short level; /*緩沖區(qū)“滿”或“空”的程度*/ unsigned flags; /*文件狀態(tài)標(biāo)志*/ char fd; /*文件描述符*/ unsigned cha

8、r hold; /*如無(wú)緩沖區(qū)不讀取字符*/ short bsize; /*緩沖區(qū)的大小*/ unsigned char *buffer; /*數(shù)據(jù)緩沖區(qū)的位置*/ unsigned char *curp; /*指針,當(dāng)前的指向*/ unsigned istemp; /*臨時(shí)文件,指示器*/ short token; /*用于有效性檢查*/FILE; 1212.1.4 文件類型指針 定義文件類型指針變量的格式為: FILE *指針變量標(biāo)識(shí)符;例如: FILE *fp; 上面的定義表示fp是指向文件類型的指針變量。 文件被打開(kāi)時(shí),系統(tǒng)自動(dòng)為該文件定義一個(gè)FILE類型變量,使該文件與對(duì)應(yīng)的FILE

9、類型變量建立聯(lián)系。因?yàn)閒p是指向FILE類型的指針變量,通過(guò)fp即可找到存放該文件信息的FILE類型變量,然后按變量提供的信息找到該文件,對(duì)該文件實(shí)施操作。 習(xí)慣上籠統(tǒng)地把fp稱為文件類型指針。所謂打開(kāi)文件就是指建立文件的各種有關(guān)信息,并使FILE類型指針指向該文件,以便對(duì)文件進(jìn)行操作。關(guān)閉文件則斷開(kāi)FILE類型指針與該文件間的聯(lián)系,也就禁止對(duì)該文件進(jìn)行操作。1312.2 文件的打開(kāi)與關(guān)閉 12.2.1 打開(kāi)文件的函數(shù)( fopen) 函數(shù)fopen用來(lái)打開(kāi)文件,函數(shù)fopen的使用格式如下: FILE *fp ; fp = fopen(文件名,文件使用方式) 例如:fp=fopen(“d:e

10、xerciseuser.txt”, “r”); 表示要打開(kāi)的文件名為user.txt,文件在d:exercise目錄下,使用文件的方式為“只讀”(r代表讀)。fopen函數(shù)帶回指向user.txt文件的指針并賦給fp,這樣fp就指向user.txt文件。 由上面例子可以看出,在打開(kāi)一個(gè)文件時(shí),通知編譯系統(tǒng)以下信息: 需要打開(kāi)的文件標(biāo)識(shí),也就是文件的位置及文件名; 使用文件的方式(是“讀”還是“寫(xiě)”等); 讓哪一個(gè)指針指向被打開(kāi)的文件。14表12-1 文件的使用方式字符含 義r以只讀方式打開(kāi)一個(gè)文本文件。文件必須存在,否則打開(kāi)失敗。打開(kāi)后,文件內(nèi)部的位置指針指向文件首部的第一個(gè)字符。w以只寫(xiě)方式

11、打開(kāi)一個(gè)文本文件。若文件不存在,則建立該文件。若文件已存在,則刪除原文件內(nèi)容,寫(xiě)入新內(nèi)容。a以追加方式打開(kāi)一個(gè)文本文件。只能向文件尾追加數(shù)據(jù)。文件必須存在,否則打開(kāi)失敗。打開(kāi)后,文件內(nèi)部的位置指針指向文件尾。rb以只讀方式打開(kāi)一個(gè)二進(jìn)制文件。文件必須存在,否則打開(kāi)失敗。打開(kāi)后,文件內(nèi)部的位置指針指向文件首部的第一個(gè)字節(jié)。wb以只寫(xiě)方式打開(kāi)一個(gè)二進(jìn)制文件。若文件不存在,則建立該文件。若文件已存在,則刪除原文件內(nèi)容,寫(xiě)入新內(nèi)容。ab以追加方式打開(kāi)一個(gè)二進(jìn)制文件。只能向文件尾追加數(shù)據(jù)。文件必須存在,否則打開(kāi)失敗。打開(kāi)后,文件內(nèi)部的位置指針指向文件尾。15表12-1 文件的使用方式字符含 義r+以讀/

12、寫(xiě)方式打開(kāi)一個(gè)文本文件。文件必須存在。打開(kāi)后,文件內(nèi)部的位置指針指向文件首部的第一個(gè)字符。打開(kāi)后,可以讀取文本內(nèi)容,也可以寫(xiě)入文本內(nèi)容,也可以既讀又寫(xiě)。w+以讀/寫(xiě)方式打開(kāi)或新建立一個(gè)文本文件。若文件已存在,則新的寫(xiě)操作將覆蓋原來(lái)的數(shù)據(jù)。若文件不存在,則建立一個(gè)新文件。還可以在不關(guān)閉文件的情況下,再讀取文件內(nèi)容。a+以讀和追加的方式打開(kāi)一個(gè)文本文件。允許讀或追加。文件必須存在,否則打開(kāi)失敗。打開(kāi)后,文件內(nèi)部的位置指針指向文件尾。可在文件尾追加數(shù)據(jù),也可將位置指針移到某個(gè)位置,讀取文件內(nèi)容。rb+以讀/寫(xiě)方式打開(kāi)二進(jìn)制文件。文件必須存在。打開(kāi)后,文件內(nèi)部的位置指針指向文件首部的第一個(gè)字節(jié)。打開(kāi)后

13、,可以讀取數(shù)據(jù),也可以寫(xiě)入數(shù)據(jù),也可以既讀又寫(xiě)。wb+以讀/寫(xiě)方式打開(kāi)或新建立一個(gè)二進(jìn)制文件。若文件已存在,則新的寫(xiě)操作將覆蓋原來(lái)的數(shù)據(jù)。若文件不存在,則建立一個(gè)新文件。還可以在不關(guān)閉文件的情況下,再讀取文件內(nèi)容。ab+以讀和追加的方式打開(kāi)一個(gè)二進(jìn)制文件。允許讀或追加。文件必須存在,否則打開(kāi)失敗。打開(kāi)后,文件內(nèi)部的位置指針指向文件尾。可在文件尾追加數(shù)據(jù),也可將位置指針移到某個(gè)位置,讀取數(shù)據(jù)。1612.2 文件的打開(kāi)與關(guān)閉 如果成功打開(kāi)一個(gè)文件,則fopen()函數(shù)將返回一個(gè)指向該文件的指針,否則將返回空指針(NULL),由此可以判斷一個(gè)文件是否成功打開(kāi)。1712.2 文件的打開(kāi)與關(guān)閉 12.2

14、.2 關(guān)閉文件的函數(shù)fclose fclose函數(shù)用來(lái)關(guān)閉一個(gè)文件,其使用格式如下: fclose(文件類型指針); 例如: fclose(fp); 用fclose函數(shù)關(guān)閉一個(gè)由fopen函數(shù)打開(kāi)的文件,當(dāng)文件關(guān)閉成功時(shí)返回0,否則返回EOF。EOF是在stdio.h中定義的符號(hào)常量,值為-1??梢愿鶕?jù)該函數(shù)返回的值判斷文件是否正常關(guān)閉。1812.2 文件的打開(kāi)與關(guān)閉 例12.1 打開(kāi)與關(guān)閉文件示例。#include int main()FILE *fp; int i; fp=fopen(“cj.dat”, “rb”); if(fp=NULL) printf(“File open failed

15、!n”); else printf(“File open successful!n”); i=fclose(fp); if (i=0) printf(“File close successful!n”); else printf(“File close failed!n”); return 0; 1912.3 文件的定位和檢測(cè) 12.3.1 文件的順序讀寫(xiě)和隨機(jī)讀寫(xiě)對(duì)文件的讀寫(xiě)方式有兩種:順序讀寫(xiě)和隨機(jī)讀寫(xiě),也稱為順序存取和隨機(jī)存取。順序讀寫(xiě)的特點(diǎn)是:從文件開(kāi)始到文件結(jié)尾,一個(gè)字節(jié)一個(gè)字節(jié)地順序讀寫(xiě),讀寫(xiě)完第一個(gè)字節(jié),才能順序讀寫(xiě)第二個(gè)字節(jié),讀寫(xiě)完第二個(gè)字節(jié),才能順序讀寫(xiě)第三個(gè)字節(jié),依次類推。

16、隨機(jī)讀寫(xiě)的特點(diǎn)是:允許從文件的任何位置開(kāi)始讀寫(xiě),利用后面介紹的fseek和rewind函數(shù),可以使文件內(nèi)部的位置指針指向某一個(gè)位置,從該位置開(kāi)始讀寫(xiě)。用程序來(lái)控制文件內(nèi)部的位置指針的移動(dòng),稱為文件的定位。對(duì)于存儲(chǔ)在磁盤上的文件,既可以采用順序讀寫(xiě)方式,也可以采用隨機(jī)讀寫(xiě)方式。2012.3 文件的定位和檢測(cè) 12.3.2 rewind函數(shù)和fseek函數(shù) 1rewind函數(shù) rewind函數(shù)的使用格式: rewind(文件類型指針); 例如: rewind(fp); rewind函數(shù)的功能是把文件內(nèi)部的位置指針重新定位到文件的開(kāi)頭,此函數(shù)無(wú)返回值。 注意:剛打開(kāi)文件時(shí),文件內(nèi)部的位置指針是定位在

17、文件的開(kāi)頭,即文件首。2112.3 文件的定位和檢測(cè) 12.3.2 rewind函數(shù)和fseek函數(shù) 2fseek函數(shù)fseek函數(shù)的使用格式如下: fseek(文件類型指針,位移量,起始點(diǎn));fseek函數(shù)的功能是移動(dòng)文件內(nèi)部的位置指針到規(guī)定的位置。 2212.3 文件的定位和檢測(cè) fseek函數(shù)的第一個(gè)參數(shù)是“文件類型指針”,指明了要操作是哪一個(gè)文件。第二個(gè)參數(shù)是“位移量”,指明了從“起始點(diǎn)”開(kāi)始移動(dòng)的字節(jié)數(shù),位移量必須是長(zhǎng)整型數(shù)據(jù),加后綴“L”;若位移量是正整數(shù),表示文件內(nèi)部的位置指針向文件尾方向移動(dòng),若位移量是負(fù)整數(shù),表示文件內(nèi)部的位置指針向文件首方向移動(dòng)。第三個(gè)參數(shù)是“起始點(diǎn)”,指明

18、了移動(dòng)時(shí)的起始位置,起始點(diǎn)有三種取值,分別代表文件首、文件尾和當(dāng)前位置,如表12-2所示。 表12-2 fseek函數(shù)的起始點(diǎn)符號(hào)常量數(shù)值含義SEEK_SET0從文件首開(kāi)始移動(dòng)SEEK_CUR1從文件的當(dāng)前位置開(kāi)始移動(dòng)SEEK_END2從文件尾開(kāi)始移動(dòng)23例如:fseek(fp,100L,SEEK_SET); 或fseek(fp,100L, 0); 將文件內(nèi)部的位置指針從文件首開(kāi)始向文件尾方向移動(dòng)100個(gè)字節(jié)。fseek(fp,20L,SEEK_CUR); 或fseek(fp,20L,1); 將文件內(nèi)部的位置指針從當(dāng)前位置向文件尾方向移動(dòng)20個(gè)字節(jié)。fseek(fp,-30L,SEEK_CUR

19、); 或fseek(fp,-30L,1); 將文件內(nèi)部的位置指針從當(dāng)前位置向文件首方向移動(dòng)30個(gè)字節(jié)。fseek(fp,-10L,SEEK_END); 或fseek(fp,-10L,2); 將文件內(nèi)部的位置指針從文件尾開(kāi)始向文件首方向移動(dòng)10個(gè)字節(jié)。2412.3 文件的定位和檢測(cè) 12.3.3 feof函數(shù)和ftell函數(shù) 1feof函數(shù) feof函數(shù)的使用格式如下: feof(文件類型指針); feof函數(shù)是用來(lái)檢測(cè)文件位置指針是否到達(dá)文件尾,若到達(dá)文件尾則返回一個(gè)非0值(真),否則返回0(假)。當(dāng)我們對(duì)文件操作時(shí),例如順序讀取文件的所有數(shù)據(jù),可以使用這個(gè)函數(shù)來(lái)判斷文件內(nèi)容是否結(jié)束,若文件內(nèi)

20、容沒(méi)有結(jié)束,則繼續(xù)讀取數(shù)據(jù),否則結(jié)束讀取操作。 下面的循環(huán)語(yǔ)句是使用feof函數(shù)判斷fp所指向的文本文件內(nèi)容是否結(jié)束,若文件內(nèi)容沒(méi)有結(jié)束,則使用fgetc函數(shù)繼續(xù)讀取數(shù)據(jù)。fgetc將在后面介紹。While (!feof(fp) putchar(fgetc(fp); 2512.3 文件的定位和檢測(cè) 12.3.3 feof函數(shù)和ftell函數(shù) 2ftell函數(shù) ftell函數(shù)的使用格式如下: 長(zhǎng)整型變量=ftell(文件類型指針); ftell函數(shù)是用來(lái)檢測(cè)文件內(nèi)部的位置指針的當(dāng)前位置,若調(diào)用成功,ftell函數(shù)返回值是:從文件開(kāi)頭到位置指針?biāo)府?dāng)前位置的總的字節(jié)數(shù)(長(zhǎng)整型),否則返回值是-1L

21、。2612.3 文件的定位和檢測(cè) 12.3.4 ferror函數(shù)和clearerr函數(shù) 1ferror函數(shù) ferror函數(shù)的使用格式如下: ferror(文件指針); ferror函數(shù)的功能是檢查文件在用各種輸入輸出函數(shù)進(jìn)行讀寫(xiě)時(shí)是否出錯(cuò)。若ferror返回值為0表示未出錯(cuò),否則表示有錯(cuò)。執(zhí)行fopen函數(shù)時(shí),ferror函數(shù)的初始值自動(dòng)置為0。 2712.3 文件的定位和檢測(cè) 12.3.4 ferror函數(shù)和clearerr函數(shù) 2clearerr函數(shù) clearerr函數(shù)的使用格式如下: clearerr(文件指針); clearerr函數(shù)的功能是將文件的錯(cuò)誤標(biāo)志和文件結(jié)束標(biāo)志設(shè)置為0。

22、若文件發(fā)生了輸入輸出錯(cuò)誤,其錯(cuò)誤標(biāo)志被置為非0,該值會(huì)一直保持到再一次調(diào)用輸入輸出函數(shù)或者使用clearerr函數(shù)才會(huì)改變。文件剛打開(kāi)時(shí),錯(cuò)誤標(biāo)志為0。2812.4 文件的讀寫(xiě) 12.4.1 fgetc函數(shù)和fputc函數(shù) 1fgetc函數(shù) fgetc函數(shù)的使用格式如下: fgetc(文件類型指針); fgetc函數(shù)的功能是從文件類型指針指向的文本文件的當(dāng)前位置讀取一個(gè)字符,該字符的ASCII碼值作為函數(shù)的返回值,若讀到文件結(jié)束符(z)或讀取不成功,則返回EOF(-1)。從文件讀取一個(gè)字符后,文件的當(dāng)前位置將后移一個(gè)字節(jié)。 2912.4.1 fgetc函數(shù)和fputc函數(shù)例如:FILE *fp

23、 ; char ch; fp=fopen(“d:yw.txt”,“r”); ch=fgetc(fp);表示從fp所指向的文件的當(dāng)前位置讀取一個(gè)字符,賦給字符型變量ch。getchar()與fgetc(stdin)功能相同,這里的stdin代表標(biāo)準(zhǔn)輸入文件(如鍵盤)。這兩種形式的作用都是從終端(如鍵盤)輸入一個(gè)字符,函數(shù)值就是該字符。3012.4.1 fgetc函數(shù)和fputc函數(shù)2fputc函數(shù) fputc函數(shù)的使用格式如下: fputc(字符表達(dá)式,文件類型指針); fputc函數(shù)的功能是向文件類型指針指向的文本文件的當(dāng)前位置寫(xiě)入一個(gè)字符,“字符表達(dá)式”代表要寫(xiě)入的字符,字符表達(dá)式可以是字符

24、常量或字符變量。若寫(xiě)入成功,則函數(shù)的返回值是所寫(xiě)入字符的ASCII碼值,否則返回值為EOF(-1)。向文件寫(xiě)入一個(gè)字符后,文件的當(dāng)前位置將后移一個(gè)字節(jié)。3112.4.1 fgetc函數(shù)和fputc函數(shù)例如:FILE *fp ; char ch=A; fp=fopen(“d:yw.txt”,“w”); fpuc(ch , fp); 表示將存儲(chǔ)在變量ch中的字符A寫(xiě)入fp所指向的文件的當(dāng)前位置。 putchar(ch)與fputc(ch, stdout)功能相同,這里的stdout代表標(biāo)準(zhǔn)輸出文件(如顯示器)。這兩種形式的作用都是向終端(如顯示器)輸出一個(gè)字符。32例12.2 從鍵盤輸入若干個(gè)字符

25、,將其中的小寫(xiě)英文字母寫(xiě)入d盤根目錄下名為“yw.txt”文本文件中,將其它字符顯示在屏幕上,若輸入字符#,則程序結(jié)束。 #include int main( ) FILE *fp ; char ch; if (fp=fopen(“d:yw.txt”,“w”)=NULL) printf(“cannot open file!n”); exit(0); ch=getchar( ); while(ch !=#) if (ch=a & ch=a & ch=A & ch=Z) fputc( ch , fp2 ); fclose(fp1); fclose(fp2); return 0; 3412.4 文件

26、的讀寫(xiě) 12.4.2 fread函數(shù)和fwrite函數(shù) 1fread函數(shù) fread函數(shù)的使用格式如下: fread(buffer, size, count, fp); 其中:buffer是存放數(shù)據(jù)的存儲(chǔ)空間的起始地址;size是數(shù)據(jù)塊的大?。ㄗ止?jié)數(shù));count是讀多少個(gè)塊;fp是文件類型指針。fread函數(shù)的功能是:從fp所指向的文件中讀取數(shù)據(jù)塊,讀取的字節(jié)數(shù)為size*count,讀取來(lái)的數(shù)據(jù)存放在buffer為起始地址的內(nèi)存中。若fread函數(shù)的返回值等于count,則執(zhí)行本函數(shù)讀取數(shù)據(jù)成功;若文件結(jié)束或發(fā)生錯(cuò)誤,返回值等于0。 例如,若已知有“int a10;”,則下面語(yǔ)句: fre

27、ad(a, sizeof(int), 10, fp);從fp所指向的文件中讀取2*10個(gè)字節(jié)(即10個(gè)整數(shù))存放于數(shù)組a中。3512.4.2 fread函數(shù)和fwrite函數(shù)2fwrite函數(shù)fwrite函數(shù)的使用格式如下: fwrite(buffer, size, count, fp); 其中四個(gè)參數(shù)的含義與fread函數(shù)基本相同,只不過(guò)現(xiàn)在是將內(nèi)存中從buffer地址開(kāi)始的數(shù)據(jù)往fp所指向的文件里寫(xiě)。 fwrite函數(shù)的的功能是:將內(nèi)存中從buffer地址開(kāi)始的數(shù)據(jù)往fp所指向的文件里寫(xiě),寫(xiě)入到文件里的字節(jié)數(shù)為size*count。 例如,下面語(yǔ)句: int b6=1,3,5,7,9,11

28、; fwrite(b, sizeof(int), 6, fp); 將內(nèi)存中b數(shù)組的6個(gè)元素值(2*6個(gè)字節(jié))寫(xiě)入fp所指向的文件里。36int main() FILE *fp; int i; if (fp=fopen(d:xs.dat, wb)=NULL) printf(Cant open file!); exit(0); for (i=0; iSIZE; i+) /*從鍵盤輸入學(xué)生數(shù)據(jù)*/ printf(Input date of No.%d student:n, i+1); printf(num: ); scanf(%d,&stui.num); printf(name: ); getcha

29、r(); /* 用getchar()來(lái)抵消前面的回車符*/ gets(); printf(age: ); scanf(%d,&stui.age); for (i=0;iSIZE;i+) /*向文件寫(xiě)入學(xué)生數(shù)據(jù)*/ if (fwrite(&stui, sizeof(struct student), 1, fp)!=1) printf(File write error!); fclose(fp); return 0;例12.4 從鍵盤上輸入10名學(xué)生的學(xué)號(hào),姓名,年齡,將這些數(shù)據(jù)寫(xiě)入d:xs.dat文件中。37例12.5 從上題的d:xs.dat文件中讀出所有學(xué)生信息,顯示在屏幕

30、上。#include #define SIZE 10struct student int num; char name8; int age; stuSIZE;38例12.5 從上題的d:xs.dat文件中讀出所有學(xué)生信息,顯示在屏幕上。#include #define SIZE 10struct student int num; char name8; int age; stuSIZE;int main() FILE *fp; int i; if(fp=fopen(d:xs.dat,rb)=NULL) printf(Cant open file!); exit(0); for(i=0;iSIZ

31、E;i+) if (fread(&stui, sizeof(struct student), 1, fp)!=1) printf(File read error!); else printf(%d, %s , %d n, stui.num, , stui.age); fclose(fp); return 0;3912.4.3 fscanf函數(shù)和fprintf函數(shù)1fscanf函數(shù)fscanf函數(shù)的使用格式如下: fscanf(文件類型指針,格式字符串,輸入項(xiàng)地址表列); fscanf函數(shù)的功能是:按“格式字符串”所指定的格式,從“文件類型指針”所指向的文件的當(dāng)前位置讀取數(shù)據(jù),

32、然后按“輸入項(xiàng)地址表列”的順序,將讀取來(lái)的數(shù)據(jù)存入指定的內(nèi)存單元中。fscanf函數(shù)的返回值是讀取的數(shù)據(jù)個(gè)數(shù);若遇見(jiàn)文件結(jié)束符或讀取不成功,則fscanf函數(shù)返回EOF(-1)。 4012.4.3 fscanf函數(shù)和fprintf函數(shù)例如: fscanf(fp,“%d,%f”,&i,&t);表示從fp所指向的文件中,按“%d,%f”規(guī)定的格式讀取兩個(gè)值,將這兩個(gè)值分別存儲(chǔ)在地址&i和&t對(duì)應(yīng)的內(nèi)存單元中。若讀取成功,fscanf函數(shù)的返回值是2。 前面幾章經(jīng)常使用的函數(shù): scanf(格式字符串,輸入項(xiàng)地址表列) ;與 fscanf(stdin,格式字符串,輸入項(xiàng)地址表列) ;功能相同,這里的

33、stdin代表標(biāo)準(zhǔn)輸入文件(如鍵盤)。這兩種形式的作用都是從終端(如鍵盤),按“格式字符串”的格式輸入(讀?。?shù)據(jù),將輸入(讀?。┑臄?shù)據(jù)存入“輸入項(xiàng)地址表列”指定的內(nèi)存單元中。1fscanf函數(shù)4112.4.3 fscanf函數(shù)和fprintf函數(shù) 2fprintf函數(shù)fprintf函數(shù)的使用格式如下: fprintf(文件類型指針,格式字符串,輸出項(xiàng)表列); fprintf函數(shù)的功能是:按“格式字符串”所指定的格式,將“輸出項(xiàng)表列”中指定的各項(xiàng)的值寫(xiě)入“文件類型指針”所指向的文件的當(dāng)前位置。若寫(xiě)入成功,fprintf函數(shù)的返回值是寫(xiě)入文件中的字符個(gè)數(shù)(或字節(jié)個(gè)數(shù)),否則返回EOF(-1)。4

34、2例如: fprintf(fp,“%d,%f”, i,t);表示按“%d,%f”規(guī)定的格式,在fp所指向的文件中,從文件的當(dāng)前位置開(kāi)始,將i和t的值寫(xiě)入文件中。 前面幾章經(jīng)常使用的函數(shù): printf(格式字符串,輸出項(xiàng)表列) ;與 fprintf(stdout,格式字符串,輸出項(xiàng)表列) ;功能相同,這里的stdout代表標(biāo)準(zhǔn)輸出文件(如顯示器)。這兩種形式的作用都是向終端(如顯示器)按“格式字符串”的格式輸出(寫(xiě)入)數(shù)據(jù)。12.4.3 fscanf函數(shù)和fprintf函數(shù) 2fprintf函數(shù)43例12.6 將一個(gè)學(xué)生姓名以及三門課的成績(jī)寫(xiě)入新建立的文件user.txt中,該文件放在C盤根目

35、錄下的dat目錄中,然后再將這個(gè)學(xué)生姓名以及三個(gè)成績(jī)值讀取出來(lái),求出它們的平均值,顯示在屏幕上。#include int main() FILE *fp; int a1=82, a2=81, a3=83, b1, b2, b3; char name120=”ZhangHua”, name220; float aver; fp=fopen(c:datuser.txt, w+); fprintf(fp, %s , %d , %d , %d , name1 , a1, a2, a3); rewind(fp); fscanf(fp, %s , %d ,%d , %d , name2 , &b1, &b

36、2, &b3); aver=(b1+b2+b3)/3.0; printf(%s , %d , %d , %d , %f n , name2, b1, b2, b3,aver); fclose(fp); return 0;4412.4 文件的讀寫(xiě) 1fgets函數(shù) fgets函數(shù)的使用格式如下: fgets(pstr,n,fp); pstr是存放字符串的內(nèi)存首地址,可以是數(shù)組名或指針變量名。整型變量n是限定讀取的字符個(gè)數(shù)。fp是文件類型指針。 fgets函數(shù)的功能是:從fp所指向的文件的當(dāng)前位置開(kāi)始讀取n-1個(gè)字符,然后在所有字符的后面加一個(gè)字符串結(jié)束標(biāo)志0,將這個(gè)字符串存于pstr為首地址的內(nèi)

37、存地址中??赡茏x取的字符數(shù)不足n-1個(gè),因?yàn)橐?guī)定在讀完n-1個(gè)字符之前,若遇見(jiàn)換行符或文件結(jié)束(EOF),則結(jié)束讀取。正常情況下,函數(shù)返回值是存放字符串的內(nèi)存首地址(pstr);若一個(gè)字符也沒(méi)有讀入或有錯(cuò)誤發(fā)生,函數(shù)返回值是NULL。12.4.4 fgets函數(shù)和fputs函數(shù)45例如: char str10; fgets(str,10,fp);表示從fp所指向的文件中讀取9個(gè)字符,在9個(gè)字符的后面加一個(gè)字符串結(jié)束標(biāo)志0,存入數(shù)組str中。12.4 文件的讀寫(xiě) 12.4.4 fgets函數(shù)和fputs函數(shù)1fgets函數(shù)4612.4 文件的讀寫(xiě) 12.4.4 fgets函數(shù)和fputs函數(shù) 2

38、fputs函數(shù) fputs函數(shù)的使用格式如下: fputs(pstr,fp); pstr代表字符串,可以是字符串常量、字符串?dāng)?shù)組名或指向字符串的指針變量名。fp是文件類型指針。 fputs函數(shù)的功能是將字符串寫(xiě)入文件類型指針?biāo)赶虻奈募腥?,不包括字符串結(jié)束標(biāo)志0。 47例如: fputs(“We love peace!”,fp);表示將字符串“We love peace!”寫(xiě)入fp所指向的文件中(不包括0)。 char str=“character string”; (或char *str=“character string”;) fputs(str,fp);表示將str對(duì)應(yīng)的字符串寫(xiě)入fp

39、所指向的文件中(不包括0)。12.4.4 fgets函數(shù)和fputs函數(shù) 2fputs函數(shù)48例12.7 將字符串“I love china!”(各單詞間只有一個(gè)空格)寫(xiě)入c:zg.txt文件中,然后將其中的“l(fā)ove china!”讀取出來(lái),顯示在屏幕上。#include int main() FILE *fp; char a30; fp=fopen(c:zg.txt,w+); fputs(I love china!, fp); fseek(fp, 2L, SEEK_SET); fgets(a, 12, fp); printf(%sn, a); fclose(fp); return 0;49

40、12.5 程序設(shè)計(jì)舉例 例12.8 編程實(shí)現(xiàn):(1)將若干名學(xué)生的學(xué)號(hào)、姓名、數(shù)學(xué)成績(jī)、英語(yǔ)成績(jī)、語(yǔ)文成績(jī)存儲(chǔ)在c:student.txt文件中。(2)根據(jù)給定的學(xué)號(hào),在文件student.txt中查找并顯示與該學(xué)號(hào)對(duì)應(yīng)的學(xué)生的姓名、數(shù)學(xué)成績(jī)、英語(yǔ)成績(jī)、語(yǔ)文成績(jī)的值。(3)在文件student.txt所有內(nèi)容的后面,追加若干個(gè)學(xué)生的信息(每個(gè)學(xué)生包括學(xué)號(hào)、姓名、數(shù)學(xué)成績(jī)、英語(yǔ)成績(jī)、語(yǔ)文成績(jī)5個(gè)數(shù)據(jù))。(4)計(jì)算并顯示每個(gè)學(xué)生的數(shù)學(xué)成績(jī)、英語(yǔ)成績(jī)、語(yǔ)文成績(jī)的平均分。50程序如下: # include struct student int num; char name8; int math; in

41、t engl; int chin; ;51 void sto( ) FILE *fp; int yn=1 ; struct student stu; /*stu存放一個(gè)學(xué)生的項(xiàng)數(shù)據(jù)*/ if (fp=fopen(c:student, w)=NULL) printf (Cant open file!); return; while (yn=1) printf(請(qǐng)按順序輸入學(xué)生的學(xué)號(hào),數(shù)學(xué)成績(jī),英語(yǔ)成績(jī),語(yǔ)文成績(jī),姓名:n); scanf(%d,%d,%d,%d,%s, &stu.num,&stu.math,&stu.engl,&stu.chin,); fwrite(&stu, s

42、izeof(struct student), 1, fp) ; printf(若停止輸入請(qǐng)按0,若繼續(xù)輸入請(qǐng)按1,然后按回車.n); scanf(%d,&yn); fclose(fp); return; 52 void sea( ) FILE *fp; int bz=0, k=0,xh; struct student a; if (fp=fopen(c:student,r)=NULL) printf(Cant open file!); return; printf( 請(qǐng)輸入學(xué)生的學(xué)號(hào):); scanf(%d, &xh); fseek(fp, k*sizeof(struct student), SEEK_SET); while(!feof(fp) fread(&a, sizeof(struct student), 1, fp); if (xh=a.num) printf(查找成功!學(xué)生信息顯示如下:n); printf(n%d,%s,%d,%d,%dn,a.num,,a.math,a.en

溫馨提示

  • 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)論