cc程序設(shè)計(jì)第9章-文件課件_第1頁
cc程序設(shè)計(jì)第9章-文件課件_第2頁
cc程序設(shè)計(jì)第9章-文件課件_第3頁
cc程序設(shè)計(jì)第9章-文件課件_第4頁
cc程序設(shè)計(jì)第9章-文件課件_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C/C+程序設(shè)計(jì) C/C+程序設(shè)計(jì)第9章 文件操作 引言 文件是存儲(chǔ)在外部介質(zhì)上的數(shù)據(jù)集合。引入文件后,程序的輸出結(jié)果可以轉(zhuǎn)變?yōu)槌绦虻妮斎霐?shù)據(jù),且能實(shí)現(xiàn)數(shù)據(jù)編輯和檢索。 第9章 文 件 操 作1文件的概念 所謂“文件”,一般指存儲(chǔ)在外部存儲(chǔ)介質(zhì)(如磁盤、光盤等)上數(shù)據(jù)的集合。操作系統(tǒng)對(duì)文件的存取是按文件名進(jìn)行的。 之前曾接觸過的文件有:源程序文件(.c)、目標(biāo)文件(.obj)、可執(zhí)行文件(.exe)、庫文件(.h),本章所說的文件指數(shù)據(jù)文件。9.1.1 文件的概念與分類9.1 文件概述2文件的分類 普通文件是指駐留在磁盤或其它外部介質(zhì)上的有序數(shù)據(jù)集合,即磁盤上的文件。 設(shè)備文件是指與主機(jī)相連的

2、各種外部設(shè)備,如顯示器、打印機(jī)、鍵盤等。通常把顯示器定義為標(biāo)準(zhǔn)輸出文件(stdout),把鍵盤定義為標(biāo)準(zhǔn)輸入文件(stdin)。 9.1 文件概述劃 分 角 度分 類從用戶角度普通文件設(shè)備文件從存儲(chǔ)形式ASCII碼文件二進(jìn)制文件從文件內(nèi)容程序文件數(shù)據(jù)文件字 符: 1234ASCII碼: 0011 0001 0011 0010 0011 0011 0011 0100 共需要 4 個(gè)字節(jié)在顯示器上按字符顯示,可讀懂文本文件:也稱ASCII文件,它是把數(shù)據(jù)轉(zhuǎn)換成對(duì)應(yīng)的ASCII碼值,存放在磁盤上,每個(gè)字符占1個(gè)字節(jié)。二進(jìn)制文件:將數(shù)據(jù)以二進(jìn)制形式存放到磁盤上。例如,短整型數(shù)據(jù)1234,在二進(jìn)制文件中

3、,占用2個(gè)字節(jié);而在文本文件中,則需占用4個(gè)字節(jié),如下圖所示:程序文件:程序的源代碼形成的文件;數(shù)據(jù)文件:程序需要使用的數(shù)據(jù)保存在磁盤上時(shí)形成的文件。9.1 文件概述3緩沖文件系統(tǒng)和非緩沖文件系統(tǒng) 緩沖文件系統(tǒng):系統(tǒng)自動(dòng)在內(nèi)存中為每一個(gè)正在使用的文件開辟一個(gè)緩沖區(qū),作為程序與文件之間數(shù)據(jù)交換的中間媒介。 即:C程序讀寫文件經(jīng)過緩沖區(qū)進(jìn)行。 緩沖文件系統(tǒng)利用文件指針標(biāo)識(shí)文件。 內(nèi)存 外存緩沖區(qū) C程序9.1 文件概述文件指針定義: FILE *指針變量;例: FILE *fp;9.1 文件概述含有文件信息的結(jié)構(gòu)體類型,在stdio.h中定義說明:只要把某個(gè)文件的FILE型變量地址賦給fp,就表明

4、在這個(gè)文件和fp之間建立起了聯(lián)系,C語言就把這個(gè)指針作為該文件的標(biāo)識(shí),在程序中就可以通過fp來訪問這個(gè)文件。9.1.2 文件的操作方式1.數(shù)據(jù)文件的操作步驟C語言中對(duì)文件的3個(gè)主要操作:(1)打開文件: 用標(biāo)準(zhǔn)庫函數(shù)fopen( )以某種操作方式打開磁盤上指定的文件。(2)讀/寫文件:用文件輸入、輸出函數(shù)對(duì)文件進(jìn)行讀寫操作。(3)關(guān)閉文件:用標(biāo)準(zhǔn)庫函數(shù)fclose( )將文件關(guān)閉。 關(guān)閉文件主要完成以下工作:關(guān)閉文件緩沖區(qū),將緩沖區(qū)中還沒有輸出的數(shù)據(jù)輸出到磁盤文件中,以保證數(shù)據(jù)不丟失;切斷文件指針與文件名之間的聯(lián)系,釋放文件指針。“讀”或輸入:磁盤上文件 內(nèi)存 “寫”或輸出: 內(nèi)存 磁盤文件9

5、.1 文件概述2.數(shù)據(jù)文件操作方式二進(jìn)制文件打開方式同一表,只是在方式字符后加b(1) 文件打開函數(shù) fopen()3. 數(shù)據(jù)文件的打開與關(guān)閉fopen函數(shù)調(diào)用格式:fopen ( 文件名 , 文件操作方式 )功能:使程序與文件之間建立關(guān)聯(lián)。成功,返回一個(gè)FILE類型的指針值;若不成功,則返回一個(gè)空指針值NULL。說明:1)“文件名”是包含路徑的一個(gè)文件名,用西文雙引號(hào)括起來。若文件與程序路徑相同,可省略路徑。2)“文件操作方式”是指以何種方式對(duì)文件進(jìn)行操作。9.1 文件概述9.1 文件概述(2)數(shù)據(jù)文件的關(guān)閉函數(shù)fclose( )fclose函數(shù)的一般格式如下: fclose ( 文件指針名

6、 ) ;功能: 關(guān)閉文件指針指向的文件。如果文件關(guān)閉成功,函數(shù)返回0值,如果關(guān)閉失敗,函數(shù)返回EOF(-1)。通常在程序中會(huì)檢測(cè)文件是否正常打開。常用下面的程序段來打開一個(gè)文件,并檢查是否打開成功。FILE *fp ;if ( (fp=fopen(“d:c_c+data.txt”, “r” ) )=NULL) printf(file can not open! n ) ; exit (0) ; (文件打開成功后的語句)9.2 文件的讀寫操作9.2.1 字符讀/寫函數(shù)1. 寫字符函數(shù)fputc( )fputc函數(shù)的一般格式:fputc ( ch , fp ) ;功能:將ch代表的字符輸出到fp所

7、指向的文件中。成功返回剛寫入的字符;否則返回EOF(-1)值。例如: fputc ( A , fp ) ; / 將字符 A 寫入 fp 指向的文件中 2. 讀字符函數(shù)fgetc( )fgetc函數(shù)的一般格式如下:ch = fgetc ( fp ) ; 功能:從fp所指的文本文件中讀取一個(gè)字符,并賦給字符型變量ch。成功返回讀出的字符;如果讀到文件結(jié)束符或出錯(cuò),則返回EOF(-1)值。9.2 文件的讀寫操作【例9-1】將鍵盤輸入的一串字符(以輸入的回車符為結(jié)束標(biāo)志)以單個(gè)字符形式寫入L9-1.txt文件中,再將文件內(nèi)容以單個(gè)字符形式從該文件中讀出并顯示到屏幕上。#include #include

8、 void readchar ( ) FILE *fp ; char ch ; if ( ( fp = fopen( L9-1.txt, r ) ) = NULL ) printf ( file can not open!n ) ;return ; ch = fgetc ( fp ) ; while ( ch != EOF ) / 只要文件沒有結(jié)束,則重復(fù)執(zhí)行以下操作 putchar ( ch ) ; / 將當(dāng)前讀取的字符顯示到屏幕ch = fgetc ( fp ) ; / 繼續(xù)讀取下一個(gè)字符 fclose( fp ) ;9.2 文件的讀寫操作void writechar ( ) FILE *

9、fp ; char ch ; if ( ( fp = fopen ( L9-1.txt ,w ) ) = NULL ) printf ( file can not open!n ) ; return ; ch = getchar ( ) ; while ( ch != n ) / 只要輸入的不是回車符,則重復(fù)執(zhí)行以下操作 fputc ( ch, fp ) ; / 向指定的文件中寫入剛輸入的字符ch = getchar( ) ; / 繼續(xù)輸入下一個(gè)字符 fclose ( fp ) ;void main( ) writechar ( ) ; readchar ( ) ; printf ( n )

10、;9.2 文件的讀寫操作9.2.2 字符串讀/寫函數(shù)1.寫字符串函數(shù)fputs( )fputs函數(shù)的一般格式如下:fputs ( str , fp ) ;功能:將str代表的字符串寫入fp指向的文件中,字符串末尾的“0”不予寫入。正確返回寫入的字符個(gè)數(shù),文件內(nèi)部指針會(huì)自動(dòng)后移到新的寫入位置;錯(cuò)誤則返回EOF(-1)值。2.讀字符串函數(shù)fgets( )fgets函數(shù)的一般格式如下:fgets ( str , n , fp ) ; 功能:從fp所指向的文件中讀取不超過n-1個(gè)的字符,存到str中,并在末尾加 0。成功返回讀取的字符串,否則返回NULL。9.2 文件的讀寫操作說明:1)n是要讀出的字

11、符串的所占的最大字節(jié)數(shù),0占一個(gè)字節(jié),故最多可讀取n-1個(gè)字符。2)在讀滿n-1個(gè)字符前,若遇回車換行符(n),則讀出這個(gè)回車換行符,結(jié)束讀操作,并在字符串末尾后加 0,函數(shù)正常返回。這時(shí)文件讀寫指針已經(jīng)移到這個(gè)回車換行符后面。3)在讀滿n-1個(gè)字符前,若遇文件結(jié)束標(biāo)志,直接加0,結(jié)束讀操作,函數(shù)正常返回。4)在讀滿n-1個(gè)字符前,如果遇回車符(r),則讀出該字符,而繼續(xù)讀取的下一個(gè)字符會(huì)存放在str指向的內(nèi)存區(qū)域的第1個(gè)位置,直到遇到n或者遇文件結(jié)束或者讀滿n-1個(gè)字符為止,字符串末尾后加0。9.2 文件的讀寫操作【例9-2】下列程序的功能是將字符串Beijingr123456n&*以字符串

12、方式寫入文件“L9-2.txt”,再以字符方式讀出。試分析運(yùn)行結(jié)果。#include #include #include int main ( ) FILE *fp ; char str140 = abcdefgr132456n&* , str240 ; if ( ( fp = fopen ( L9-2.txt , w ) ) = NULL ) printf ( file can not open!n ) ; exit ( 0 ) ; fputs (str1,fp) ; / 寫字符串到文件 fclose (fp) ; 9.2 文件的讀寫操作 if ( ( fp =fopen ( L9-2.tx

13、t , r ) ) = NULL ) printf ( file can not open!n ) ; exit ( 0 ) ; fgets (str2 ,12 , fp ) ; / / 讀字符串到str2數(shù)組中,最多讀11個(gè)字符 puts ( str2 ) ; / 輸出字符串到屏幕 printf ( 本次讀取的字符串長(zhǎng)度為:%dn, strlen ( str2 ) ) ;fgets (str2, 14 , fp ) ; / 讀字符串到str2數(shù)組中,最多讀13個(gè)字符puts ( str2 ) ; fgets (str2, 10 , fp ) ; / 繼續(xù)讀取不超過10個(gè)字符的字符串puts

14、( str2 ) ; printf ( 本次讀取的字符串長(zhǎng)度為:%dn, strlen ( str2 ) ) ;fclose (fp) ;return 0 ;運(yùn)行結(jié)果:123defg 本次讀取的字符串長(zhǎng)度為:11456 &*本次讀取的字符串長(zhǎng)度為:6結(jié)果分析:【例9-3】將字符串Beijing、Shanghai、Xian、Dalian 寫入文件“L9-3.txt”中,然后再從文件中讀出來,并顯示在屏幕上。 分析:在向文件寫入一個(gè)字符串時(shí),其結(jié)束標(biāo)志0并不寫入,如果連續(xù)將多個(gè)字符串寫入文件,讀出時(shí)就無法判斷一個(gè)字符串的結(jié)束位置。因此,寫入一個(gè)字符串后需要再寫入一個(gè)n,在讀出時(shí)遇n則自動(dòng)替換成0,

15、從而正確讀出一個(gè)字符串。#include #include void main ( ) FILE *fp ; int i ; char str1410 =Beijing,Shanghai,Xian,Dalian, str2410 ; if ( ( fp = fopen ( L9-3.txt , w ) ) = NULL ) printf ( file can not open!n ) ; exit ( 0 ) ; for ( i = 0 ; i 4 ; i+ ) fputs ( str1 i , fp ) ; / 寫字符串到文件 fputs ( “n”, fp ) ; / 寫完一個(gè)字符串后,再

16、寫一個(gè)換行符,想想為什么? fclose ( fp ) ; if ( ( fp = fopen ( L9-3.txt , r ) ) = NULL) printf ( file can not open!n ) ; exit( 0 ) ; for ( i = 0 ; i 4 ; i+ ) fgets ( str2 i , 10 , fp ) ; / 讀字符串,每次最多讀10個(gè)字符 fclose ( fp ) ; for ( i = 0 ; i 4 ; i+ ) / 輸出字符串到屏幕 printf ( %s , str2 i ) ;9.2.3 數(shù)據(jù)塊讀/寫函數(shù)指一次性地將一個(gè)或若干個(gè)指定長(zhǎng)度的數(shù)

17、據(jù)塊寫入文件或從文件中讀出的函數(shù)。1.寫數(shù)據(jù)塊函數(shù)fwrite( )fwrite函數(shù)的格式如下:fwrite ( buf , size , n , fp ); 功能:將內(nèi)存從buf開始的n個(gè)大小為size個(gè)字節(jié)的數(shù)據(jù)塊寫入fp所指向的文件中。成功返回實(shí)際寫入的數(shù)據(jù)塊的個(gè)數(shù),否則返回NULL。說明: buf為內(nèi)存中寫入數(shù)據(jù)的首地址;size為每個(gè)數(shù)據(jù)塊的大小;n為數(shù)據(jù)塊的個(gè)數(shù);fp為文件指針。寫入的信息全部按二進(jìn)制存放。例如: fwrite ( buf , 2 , 18 , fp ) ;注意:用塊方式寫入的數(shù)據(jù),以文本方式打開時(shí),信息因二進(jìn)制而顯示亂碼!2.讀數(shù)據(jù)塊函數(shù)fread( )fread

18、函數(shù)的格式如下:fread ( buf , size , n , fp ) ; 功能:從fp所指向的文件中,一次讀取n個(gè)大小為size的數(shù)據(jù)塊,存放到buf所指向的內(nèi)存中。如果操作成功,返回讀取的數(shù)據(jù)塊的個(gè)數(shù),否則返回0。說明: buf為將要存放數(shù)據(jù)的內(nèi)存首地址,size為每個(gè)數(shù)據(jù)塊的大小,n為數(shù)據(jù)塊的個(gè)數(shù),fp為文件指針?!纠?-4】用函數(shù)fwrite( )把數(shù)組中的10個(gè)數(shù)據(jù)寫入文件“L9-4.txt”中,然后再用函數(shù)fread( )讀出并顯示在屏幕上。#include #include void main ( ) FILE *fp ; int a10 = 1 , 2 , 3 , 4 ,

19、5 , 6 , 7 , 8 , 9 , 10 , b10 , i ; if ( ( fp = fopen ( L9-4.txt , w ) ) = NULL ) printf ( file can not open!n ) ; exit( 0 ) ; fwrite ( a , sizeof ( int ) , 10 , fp ) ; / 以二進(jìn)制形式存放 fclose ( fp ) ; if ( ( fp = fopen ( L9-4.txt , r ) ) = NULL ) printf ( file can not open!n ) ; exit ( 0 ) ; fread ( b , s

20、izeof ( int ) , 10 , fp ) ; / 讀數(shù)據(jù)到數(shù)組b fclose ( fp ) ; for ( i = 0 ; i 10 ; i+ ) / 輸出數(shù)據(jù)到屏幕 printf ( %5d , b i ) ;9.2.4 格式讀/寫函數(shù)格式讀函數(shù)fscanf( )和格式寫函數(shù)fprintf( )是按指定格式對(duì)文件進(jìn)行讀、寫操作的常用函數(shù)。它們與格式輸入函數(shù)scanf( )和格式輸出函數(shù)printf( )相對(duì)應(yīng),不同的是scanf( )和printf( )的讀寫對(duì)象是標(biāo)準(zhǔn)輸入輸出設(shè)備,而fscanf( )和fprintf( )的讀寫對(duì)象是磁盤文件。1. 格式寫函數(shù)fprintf(

21、)fprintf函數(shù)的一般格式如下: fprintf ( 文件指針, , ) ; 功能:按指定的格式將輸出項(xiàng)寫入由文件指針指向的文件中。成功返回寫入文件的數(shù)據(jù)個(gè)數(shù),否則返回EOF(-1)。說明:“格式控制字符串”和“輸出變量列表”的含義,與格式輸出函數(shù)printf( )完全一樣。寫入的信息全部按ASCII碼值存放。2. 格式讀函數(shù)fscanf( )fscanf函數(shù)的一般格式如下: fscanf ( 文件指針, , ) ;功能:從文件中,按“格式控制字符串”指定的格式讀取數(shù)據(jù),輸入到“輸入地址列表”所列出的變量地址中。若讀取正確,返回實(shí)際讀取的數(shù)據(jù)個(gè)數(shù);若沒有讀到數(shù)據(jù)項(xiàng),返回0;若文件結(jié)束,則返

22、回EOF。說明: 使用fprintf ( )和fscanf ( ) 時(shí),要保證格式描述符與數(shù)據(jù)類型的一致性,否則會(huì)出錯(cuò)。通常應(yīng)該是按什么格式寫入數(shù)據(jù),再按什么格式讀出數(shù)據(jù)?!纠?-5】利用格式讀寫函數(shù),將整數(shù)24、實(shí)數(shù)12.34、字符串“hello”寫到“L9-5.txt”文件中,然后再讀出并顯示在屏幕上。#include #include int main ( ) FILE *fp ; int a1 = 24 , a2 ; float f1 = 12.34F , f2 ; char c1 = hello , c210 ; if ( ( fp = fopen ( L9-5.txt , w )

23、) = NULL ) printf ( file can not open!n ) ; exit ( 0 ) ; fprintf ( fp , %d%f%s , a1 , f1 , c1 ) ; / 寫數(shù)據(jù)到文件fp中 fclose ( fp ) ; if ( ( fp = fopen ( L9-5.txt , r ) ) = NULL ) printf ( file can not open!n ) ; exit ( 0 ) ; fscanf ( fp ,%d%f%s , &a2 , &f2 , c2) ; / 從fp中讀數(shù)據(jù)到內(nèi)存變量中 fclose ( fp ) ; printf ( n %d %f %s , a2 , f2 , c2 ) ; return 0;9.3 文件操作的其他函數(shù)1.文件尾測(cè)試函數(shù)feof( ) feof函數(shù)的一般格式: feof ( fp )

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論