第9章 文件操作3_第1頁
第9章 文件操作3_第2頁
第9章 文件操作3_第3頁
第9章 文件操作3_第4頁
第9章 文件操作3_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、【問題9】制作一個班級學(xué)生成績管理系統(tǒng),完成對全班45名學(xué)生、每人4科成績的輸入、輸出以及統(tǒng)計總分、按總分排名次。第9章 文件操作本章介紹的文件,就是指將輸入的數(shù)據(jù)和運行結(jié)果以文件的方式保存在外部介質(zhì)(磁盤)上。這樣做的好處:一是程序和數(shù)據(jù)分離,使程序可以滿足不同數(shù)據(jù)處理的需要;二是數(shù)據(jù)可以長期保存,重復(fù)使用,減少數(shù)據(jù)的反復(fù)輸入;三是以文件形式保存的運行結(jié)果,可為其它應(yīng)用提供相關(guān)數(shù)據(jù)。本章主要講述C語言能夠處理的文件形式、文件的建立、數(shù)據(jù)的存儲和讀出等操作。9.1 C語言中有關(guān)文件的概念9.1.1 文件概述1文件的概念 所謂“文件”,一般指存儲在外部存儲介質(zhì)(如磁盤、光盤等)上數(shù)據(jù)的集合。文件

2、的存取是按文件名進(jìn)行的。2文件的分類 劃分角度分 類從用戶角度普通文件普通文件設(shè)備文件設(shè)備文件從存儲形式ASCII文件文件二進(jìn)制文件二進(jìn)制文件普通文件普通文件是指駐留在磁盤或其它外部介質(zhì)上的有序數(shù)據(jù)集合,即磁盤上的文件。 設(shè)備文件設(shè)備文件是指與主機(jī)相連的各種外部設(shè)備,如顯示器、打印機(jī)、鍵盤等。通常把顯示器定義為標(biāo)準(zhǔn)輸出文件,把鍵盤定義為標(biāo)準(zhǔn)輸入文件。 文本文件文本文件,也稱ASCII文件,是一種字符流文件。它是把內(nèi)存中的數(shù)據(jù)轉(zhuǎn)換成相應(yīng)的ASCII碼值形式,存放在磁盤上。每個字符占1字節(jié),存放字符的ASCII碼。 二進(jìn)制文件二進(jìn)制文件則是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣存放到磁盤上去,是

3、一種二進(jìn)制流文件。 短整型數(shù):-1234 1111 1011 0010 1110 字字 符:符: - 1234ASCII碼:碼: 0010 1101 0011 0001 0011 0010 0011 0011 0011 0100 (a) 二進(jìn)制文件形式 (b) 文本文件形式 3標(biāo)準(zhǔn)輸入輸出文件標(biāo)準(zhǔn)輸入輸出文件有三個,是外部設(shè)備中的特殊文件,也稱標(biāo)準(zhǔn)設(shè)備文件。 標(biāo)準(zhǔn)輸入文件,文件指針為stdin,系統(tǒng)指定為鍵盤。 標(biāo)準(zhǔn)輸出文件,文件指針為stdout,系統(tǒng)指定為顯示器。 標(biāo)準(zhǔn)錯誤輸出文件,文件指針為stderr。系統(tǒng)指定輸出錯誤信息到顯示器。4緩沖文件系統(tǒng)和非緩沖文件系統(tǒng) (l)緩沖文件系統(tǒng) 是

4、指在處理文件時,系統(tǒng)自動在內(nèi)存區(qū)為每一個正在使用的文件開辟一個緩沖區(qū)。 (2)非緩沖文件系統(tǒng) 是指系統(tǒng)不自動開辟確定大小的緩沖區(qū),而是由程序為每一個文件設(shè)定確定大小的緩沖區(qū),它占用的是操作系統(tǒng)的緩沖區(qū),而不是用戶存儲區(qū)。 ANSI C采用緩沖文件系統(tǒng)。 用戶程序區(qū)磁盤文件輸出 內(nèi)存區(qū)用戶數(shù)據(jù)區(qū)輸入 文件緩沖區(qū)輸出 輸入 9.1.2 文件的概念1.程序文件和數(shù)據(jù)文件程序文件和數(shù)據(jù)文件 程序文件,即以程序的源代碼形成的文件;數(shù)據(jù)文件,即以程序運行時需要的原始數(shù)據(jù)和輸出的結(jié)果形成的文件。2. 數(shù)據(jù)文件的存取方式數(shù)據(jù)文件的存取方式 (l)文件的輸入與輸出)文件的輸入與輸出 在程序運行時,從外部文件讀入

5、數(shù)據(jù),這一過程稱為“讀”文件或“取”文件,即輸入。把程序的運行結(jié)果保存到磁盤上,這一過程稱為“寫”文件或“存”文件,即輸出。 (3)順序文件和隨機(jī)文件)順序文件和隨機(jī)文件 (2)文件的存取方式)文件的存取方式 順序存取只能依先后次序存取文件中的數(shù)據(jù)。隨機(jī)存取也稱直接存取,可以直接存取文件中指定的數(shù)據(jù)。 可以進(jìn)行順序存取的文件稱為順序文件??梢赃M(jìn)行隨機(jī)存取的文件稱為隨機(jī)文件。 3數(shù)據(jù)文件的操作步驟 數(shù)據(jù)文件的創(chuàng)建和使用需要由程序完成,一般要經(jīng)過以下三個步驟:(l)打開文件 fopen ( ) (2)讀/寫文件 (3)關(guān)閉文件 fclose( ) 4文件名及路徑 在DOS或Windows環(huán)境下,路

6、徑中的目錄名是用反斜杠分開的。在C語言中,磁盤文件名的一般格式為: :. . 或 :/:/ /. .5C語言中文件的結(jié)構(gòu)體類型及其指針p系統(tǒng)對緩沖文件的訪問,都是通過文件指針進(jìn)行的。p文件指針是一個指向含有文件信息的結(jié)構(gòu)體類型的指針。p在C語言中,此結(jié)構(gòu)體類型由系統(tǒng)定義,在stdio.h文件中將其定義為FILE類型。其類型聲明為: typedef struct short level ; /* 緩沖區(qū)滿或空的程度 */ unsigned flags ; /* 文件狀態(tài)標(biāo)志 */ char fd ; /* 文件描述符 */ unsigned char hold ; /* 如無緩沖區(qū)不讀取字符 *

7、/ short bsize ; /* 緩沖區(qū)大小 */ unsigned char *buffer ; /* 數(shù)據(jù)緩沖區(qū)的位置 */ unsigned char *curp ; /* 指針當(dāng)前的指向 */ unsigned istemp ; /* 臨時文件指示器 */ short token ; /* 用于有效性檢查 */ FILE /* 指定的類型名為FILE */9.2 文件的打開與關(guān)閉操作打開文件打開文件,就是將一個FILE類型的指針變量指向被打開的文件的結(jié)構(gòu)體變量,以便通過指針變量訪問該文件。 1. 文件的打開函數(shù) fopen ( )(1)fopen( )函數(shù)的調(diào)用格式 FILE *f

8、p ;fp = fopen( 文件名 , 文件操作方式 ) ;(2)文件操作方式 9.2.1 文件的打開與關(guān)閉函數(shù)(3)fopen( )函數(shù)的返回值 該函數(shù)的返回值是一個FILE型指針。如果文件打開正確,返回值就是文件在內(nèi)存中的起始地址;如果打開不成功,返回值是一個空指針值(NULL)。文件打開方式含 義指定文件(包括路徑)對文件的讀寫操作不存在存在文本文件打開方式r (只讀)以只讀方式打開一個已存在的文本文件出錯打開正確允許讀w (只寫)以只寫方式打開一個文本文件建立新文件刪除原內(nèi)容允許寫a (追加寫)以追加方式打開一個文本文件建立新文件打開正確允許寫r+ (讀寫)以讀寫方式打開一個文本文件

9、出錯打開正確允許讀、寫w+ (讀寫)以讀寫方式打開一個文本文件建立新文件刪除原內(nèi)容允許讀、寫a+ (讀寫)以追加方式打開一個文本文件建立新文件打開正確允許讀、寫二進(jìn)制文件打開方式rb (只讀)以只讀方式打開一個二進(jìn)制文件出錯打開正確允許讀wb (只寫)以只寫方式打開一個二進(jìn)制文件建立新文件刪除原內(nèi)容允許寫ab (追加寫)以追加方式打開一個二進(jìn)制文件建立新文件打開正確允許寫rb+ (讀寫)以讀寫方式打開一個二進(jìn)制文件出錯打開正確允許讀、寫wb+(讀寫)以讀寫方式打開一個二進(jìn)制文件建立新文件刪除原內(nèi)容允許讀、寫ab+ (讀寫)以讀寫方式打開一個二進(jìn)制文件建立新文件打開正確允許讀、寫為確保文件操作的

10、正常進(jìn)行,有必要在程序中檢測文件是否正常打開。常用下面的程序段來打開一個文件,并檢查是否打開成功。例如:以只讀方式打開“d:vc98cctest1.txt”文件。FILE *fp ;if ( ( fp = fopen ( d:vc98cc test1.txt , r ) ) = NULL ) printf ( file can not open! n ) ; exit ( 0 ) ;在VC+ 6.0 中,exit ( 0 ) 函數(shù)的在頭文件是“stdlib.h”。導(dǎo)致函數(shù)fopen ( ) 返回NULL的原因,大致有以下幾個: 所給文件名不對(不能有空格)。 文件所在磁盤沒有準(zhǔn)備好(比如軟盤未

11、插好等)。 指定的目錄不存在。 試圖以“r”(讀)方式打開一個不存在的文件。正是因為有多種原因會造成文件打開失敗。所以在程序中使用fopen ( ) 函數(shù)時,最好用if語句來檢查打開操作是否成功。2. 文件的關(guān)閉函數(shù) fclose( ) 功能:關(guān)閉文件指針指向的文件。如果文件關(guān)閉成功,函數(shù)返回0值,文件指針變量與所指向的文件脫離,并釋放文件緩沖區(qū);如果關(guān)閉失敗,函數(shù)返回EOF(表示-1),說明關(guān)閉有錯。程序中可以用ferror ( ) 函數(shù)來診斷并顯示錯誤的類型。fclose ( 文件指針名 ) ;9.2.2 文件的打開與關(guān)閉操作舉例【例9.1】 編寫一個程序,在用戶自己的目錄下,用“w”方式

12、建立一個名為“f9_1.txt”的新文件,然后將其關(guān)閉。(假設(shè)用戶自己的目錄為:d:vc98cc )# include stdio.h# include stdlib.hmain ( ) FILE *fp ; if ( ( fp = fopen (d:vc98ccf9_1.txt , w ) ) = NULL ) printf ( file can not open! n ) ; exit ( 0 ) ; printf ( file open OK! n ) ; /* 文件打開成功 */ fclose ( fp ) ; /* 關(guān)閉fp所標(biāo)識的文件 */9.3 文件的讀寫操作9.3.1 字符讀寫

13、函數(shù)1. 寫字符函數(shù) fputc( )fputc( ch , fp ) ;函數(shù)功能:將ch代表的字符輸出到fp所指向的文件中。如果輸出成功,函數(shù)返回剛寫入的字符;否則返回EOF 即值(-1)?!纠?.2】編寫一個程序,從鍵盤輸入一串字符,利用寫字符函數(shù)fputc ( ),將其存入到文件“d:vc98ccf9_2.txt”中。 # include stdio.h# include stdlib.hmain ( ) FILE *fp ; int k ; char str30 ; if ( fp = fopen ( d:vc98ccf9_2.txt , w ) = NULL ) printf ( f

14、ile can not open! n ) ; exit ( 0 ) ; gets ( str ) ; /* 文件打開成功,從鍵盤輸入一個字符串 */ for ( k = 0 ; strk ; k+ ) /* 將字符串中的字符逐個寫入文件,直到遇到 0為止 */ fputc ( strk , fp ) ; fclose ( fp ) ; 2讀字符函數(shù) fgetc( ) 函數(shù)功能:從文件指針fp所指的文本文件中讀取一個字符,并賦給字符型變量ch。如果讀取成功,返回讀出的字符;如果讀到文件結(jié)束符或出錯,則返回EOF(-1值)。 【例9.3】編寫一個程序,從【例9.2】中建立的數(shù)據(jù)文件“f9_2.t

15、xt”中讀出前5個字符,并顯示在屏幕上。 ch = fgetc ( fp ) ; # include stdio.h# include stdlib.hmain ( ) FILE *fp ; int k , i ; char ch ; if ( fp = fopen ( d:vc98ccf9_2.txt , r ) ) = NULL ) printf ( file can not open!n ) ; exit ( 0 ) ; i = 1 ; while ( i = 5 ) /* 判斷讀取的字符個數(shù) */ ch = fgetc ( fp ) ; /* 從fp所指文件讀一個字符給ch */ pu

16、tchar ( ch ) ; /* 把ch中的字符顯示在屏幕上 */ i+ ; fclose ( fp ) ;【例9.4】編寫一個程序,從鍵盤輸入一串字符,將其寫到標(biāo)準(zhǔn)輸出文件“stdout”中。# include stdio.hmain ( ) int k ; char str30 ; gets ( str ) ; for ( k = 0 ; strk ; k+ ) fputc ( strk , stdout ) ; /* stdout指向標(biāo)準(zhǔn)的輸出文件 */運行程序,輸入:abcd輸出:abcd9.3.2 字符串讀寫函數(shù)1寫字符串函數(shù) fputs( )fputs( str , fp ) ;

17、功能:將str代表的字符串寫入fp指向的文件中,字符串末尾的“0”不予寫入。若該函數(shù)執(zhí)行正確,返回寫入文件的實際字符個數(shù),文件內(nèi)部指針會自動后移到新的寫入位置;如果執(zhí)行錯誤,則返回EOF值(即-1)。2讀字符串函數(shù)fgets( ) fgets( str , n , fp ) ; 功能:該函數(shù)的功能是從文件指針fp所指向的文件中最多讀取n-1個字符,將讀入的字符串存到str中。若操作成功,返回讀取的字符串,否則返回NULL?!纠?.5】將字符串 “Beijing”、“Shanghai”、“Xian”、“Dalian” 寫入文件“d:vc98cc f9_5.txt”中,然后再從文件中讀出來,并顯示

18、在屏幕上。 # include stdio.h# include stdlib.hmain ( ) FILE *fp ;char str1410 = Beijing , Shanghai , Xian , Dalian , str2410 ;int i ;if ( ( fp = fopen ( d:vc98ccf9_5.txt , w ) ) = NULL ) printf ( file can not open!n ) ;exit ( 0 ) ; for ( i = 0 ; i 4 ; i+ ) fputs ( str1i , fp ) ; /* 寫字符串到文件 */fputs( n, fp

19、 ) ; /* 寫完一個字符串后,再寫一個換行符 */fclose ( fp ) ;if ( ( fp = fopen ( d:vc98ccf9_5.txt , r ) ) = NULL) printf ( file can not open!n ) ;exit ( 0 ) ; for ( i = 0 ; i 4 ; i+ ) /* 讀字符串到str2數(shù)組中 */fgets ( str2i , 10 , fp ) ; fclose ( fp ) ;for ( i = 0 ; i 4 ; i+ ) /* 輸出字符串到屏幕 */printf ( %s , str2i ) ;運行結(jié)果:Beijing

20、 ShanghaiXian Dalian9.3.3 讀寫數(shù)據(jù)塊函數(shù) 1. 寫數(shù)據(jù)塊函數(shù) fwrite( ) fwrite( buf,size,n,fp ) ;函數(shù)功能:從buf所指向的內(nèi)存地址開始,將n個大小為size個字節(jié)的數(shù)據(jù)塊寫入fp所指向的文件中。如果操作成功,函數(shù)返回實際寫入的數(shù)據(jù)項塊的個數(shù),否則,返回NULL。 2. 讀數(shù)據(jù)塊函數(shù) fread( ) fread( buf,size,n,fp ) ; 函數(shù)功能:從fp所指向的文件中,一次讀取n個大小為size的數(shù)據(jù)塊,存放到buf所指向的內(nèi)存中。如果操作成功,返回讀取的數(shù)據(jù)塊的個數(shù),否則返回0?!纠?.6】編寫一個程序,用函數(shù)fwr

21、ite ( )把數(shù)組中的10個數(shù)據(jù)寫入文件:“d:vc98ccf9_6.txt”,然后再用fread ( )讀出并顯示在屏幕上?!纠?-7】從鍵盤輸入4名學(xué)生的有關(guān)數(shù)據(jù),寫入工作目錄的文件“f9_7.txt”中,然后將文件中的數(shù)據(jù)讀出,輸出到屏幕。文件的讀、寫用函數(shù)實現(xiàn)。9.3.4 格式讀寫函數(shù)1. 格式寫函數(shù) fprintf( ) fprintf( 文件指針 , ,) ; 函數(shù)功能:將“輸出變量列表”中的各輸出項,按“格式控制字符串”中指定的格式寫入由文件指針指向的文件中。若寫入成功,返回實際寫入文件的數(shù)據(jù)個數(shù),否則返回EOF(即-1)。2. 格式讀函數(shù) fscanf( ) fscanf( 文件指針 , , ) ;函數(shù)功能:從文件指針?biāo)傅奈募?,按“格式控制字符串”指定的格式讀取數(shù)據(jù),輸入到“輸入地址列表”所列出的變量地址中去。若讀取正確,返回實際讀取的數(shù)據(jù)個數(shù);若沒有讀數(shù)據(jù)項,返回0;若文件結(jié)束,則返回EOF?!纠?.8】利用格式讀寫函數(shù),將整數(shù)24、實數(shù)12.34、字符串hello寫到“f_8.txt”文件中,然后再讀出并顯示在屏幕上。9.4 文件操作中的其它函數(shù)在文件被成功打開后,系統(tǒng)會為每個打開的文件設(shè)置一個位置指針(也叫文件指針)。通常在文件打開時,位置指針位于文件頭部,隨著數(shù)據(jù)的讀寫,指針會向后移動,文件指針總

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論