版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第十八次課教案(續(xù))章節(jié)名稱:第11章 文 件教學目的與要求:掌握文件的概念,掌握打開文件、關閉文件及對文件進行讀寫操作的方法。能夠?qū)ξ募M行簡單的讀寫操作。教學內(nèi)容:1. 文件的概念及文件類型指針2. 文件的打開與關閉3. 文件的讀寫4. 文件的定位與隨機讀寫重點: 2、3、4難點: 1作業(yè):完善課程設計簡單版中數(shù)據(jù)的存儲。教學過程:ppt課件,提問回答8/3/2022111.1文件概述一、文件分類(一)文件 文件是存儲在外存儲器上信息的集合。每個文件有唯一的名稱(文件名.擴展名)來標識。計算機通過名稱對文件進行讀、寫、修改或刪除等操作。文件可以從不同的角度進行分類,例如按照文件保存的內(nèi)容區(qū)
2、分,磁盤文件可以分為程序文件和數(shù)據(jù)文件。8/3/20222程序文件保存的是程序,讀寫操作一般由系統(tǒng)完成;數(shù)據(jù)文件用于保存數(shù)據(jù),其讀寫往往由應用程序?qū)崿F(xiàn)。從廣義上說,文件是指信息輸入和輸出的對象,磁盤文件、鍵盤、顯示器、打印機等均可視為文件。如DOS將打印機和鍵盤分別命名為 PRN和CON的兩個專用設備文件名。8/3/20223(二)數(shù)據(jù)文件的存儲形式C語言把文件看作是一個字符(字節(jié))的序列,即由一個一個字符(字節(jié))的數(shù)據(jù)順序組成。根據(jù)數(shù)據(jù)的組織形式,可分為ASCII碼文件和二進制文件。ASCII碼文件是將數(shù)據(jù)以字符形式存放,又稱為文本文件。二進制文件是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣輸
3、出到磁盤上存放。8/3/20224一個任意int型整數(shù),其二進制存儲方式都是占4個字節(jié);而字符存儲方式所占字節(jié)數(shù)該數(shù)的數(shù)字個數(shù)。int型數(shù) 2978 二進制存儲方式 字符存儲方式用戶可以自己選擇存儲方式,若閱讀則選擇文本文件,否則為了節(jié)省時間和空間應該選二進制文件。00001011 1010001000110010 39 37 388/3/20225一般地說,二進制文件節(jié)省存儲空間,用戶程序在實用中,從節(jié)省時間和空間的要求考慮,一般選用二進制文件。但是如果用戶準備的數(shù)據(jù)是作為文檔閱讀使用的,則一般使用文本文件,它們可以方便、快捷地通過顯示器或打印機直接輸出。8/3/20226(三)緩沖文件與非
4、緩沖文件1. 緩沖文件又稱為標準I/O文件或高級文件系統(tǒng);是指系統(tǒng)自動地在內(nèi)存區(qū)為每一個正在使用的文件開辟一個緩沖區(qū)。當從磁盤文件讀數(shù)據(jù)時,應用程序并不直接從磁盤文件讀取數(shù)據(jù),而是先由系統(tǒng)將一批數(shù)據(jù)從磁盤取入內(nèi)存緩沖區(qū),然后再從緩沖區(qū)依次將數(shù)據(jù)送給程序中的接收變量,供程序處理。在向磁盤文件寫入數(shù)據(jù)時,先將程序中有關變量或表達式的值送到緩沖區(qū)中,待緩沖區(qū)裝滿后,才由系統(tǒng)將緩沖區(qū)的數(shù)據(jù)一次寫入磁盤文件中。這樣做減少了系統(tǒng)讀寫磁盤的次數(shù),提高了程序的執(zhí)行效率。 8/3/202272. 非緩沖文件又稱為系統(tǒng)I/O文件或低級文件系統(tǒng)。是指系統(tǒng)不自動開辟確定大小的緩沖區(qū),而由程序本身根據(jù)需要設定。ANSI
5、 C標準決定不采用非緩沖文件系統(tǒng),而只采用緩沖文件系統(tǒng)。即既用緩沖文件系統(tǒng)處理文本文件,也用它來處理二進制文件。8/3/20228(四)文件存取方式C語言的數(shù)據(jù)文件由順序存放的一連串字節(jié)(字符)組成,沒有記錄的界限,因此,C語言的文件被稱作流式文件,文件存取操作的數(shù)據(jù)單位是字節(jié),允許存取一個字節(jié)和任意多個字節(jié),增加了文件操作的靈活性。緩沖文件系統(tǒng)提供了4種文件存取方法:(1) 讀寫一個字符。(2) 讀寫一個字符串,將多個字符組成的字符串寫入文件或從文件中讀出。(3) 格式化讀寫,根據(jù)格式控制指定的數(shù)據(jù)格式對數(shù)據(jù)進行轉(zhuǎn)換存取。(4) 成塊讀寫。有相應的函數(shù)來完成上述的操作。8/3/20229二、
6、文件指針 緩沖文件系統(tǒng)中,關鍵的概念是“文件指針”。每個被使用的文件都在內(nèi)存中開辟一個區(qū)域,用來存放文件的有關信息(如文件的名字、文件當前位置等)。這些信息是保存在一個結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是由系統(tǒng)定義的,取名為FILE。Turbo C在stdio.h文件中定義了FILE類型。 8/3/202210typedef structshort level;unsigned flags;char fd;unsigned char hold;short bsize;unsigned char *buffer;unsigned char *curp;unsigned istemp;short tok
7、en;FILE;8/3/202211有了結(jié)構(gòu)體FILE類型之后,可以用它來定義FILE類型變量,以便存放文件的信息。FILE f1,f2;FILE *fp;fp是一個指向FILE類型的指針變量??梢允筬p指向某一個文件的結(jié)構(gòu)體變量,從而通過該結(jié)構(gòu)體變量中的文件信息能夠訪問該文件。也就是說,通過文件指針變量能夠找到與它相關的文件。如果程序同時對n個文件進行操作,一般應設n個指針變量,使它們分別指向n個文件(即指向存放該文件信息的結(jié)構(gòu)體變量),以實現(xiàn)對文件的訪問。 8/3/202212三、文件的打開與關閉 對磁盤文件的操作往往包括打開文件、讀文件、寫文件、關閉文件或刪除文件等。任何一個文件操作,都
8、必須先打開,后讀或?qū)懀蛔x寫完成后,最后都應關閉文件。1、文件的打開即在程序和系統(tǒng)間建立聯(lián)系,程序?qū)⑽募安僮鞣绞酵ㄖo系統(tǒng)。8/3/202213FILE *fopen( char *filename,char *mode);需要用#include “stdio.h” 函數(shù)的功能是打開一個filename指向的文件,文件使用方式由mode指向的值決定。函數(shù)的返回值是一個文件指針。例如:FILE *fp;fp=fopen(a1,r);8/3/202214若要打開文件的文件名已放在一個字符數(shù)組中或已由一個字符指針指向它,可通過該字符數(shù)組或字符指針來打開該文件。如:FILE *fp;char c5=
9、 a1;fp=fopen(c,r);文件名中也可以包含用雙反斜線隔開的路徑名d:turboc2a18/3/2022158/3/202216當用fopen()函數(shù)成功地打開一個文件時,該函數(shù)將返回一個FILE指針;如果文件打開操作失敗,則函數(shù)返回值是NULL,即一個空指針。FILE *fp;if(fp=fopen(file1,w)=NULL)printf(file cannot be openedn);exit(1);elseprintf(file opened for writingn); 這里使用exit()函數(shù)返回操作系統(tǒng),該函數(shù)將關閉所有打開的文件。若打開的是一個已存在的文件,且使用方式
10、為“W”或“wb”,則文件原有內(nèi)容將被新寫入的內(nèi)容覆蓋。8/3/202217對磁盤文件,在使用前一定要打開,而對外部設備,盡管它們也可以作為設備文件處理,但在以前的應用中并未用到“打開文件”的操作。這是因為當運行一個C程序時,系統(tǒng)自動地打開了5個設備文件,并自動地定義了5個FILE結(jié)構(gòu)指針變量。8/3/2022188/3/2022192、文件的關閉程序?qū)ξ募淖x寫操作完成后,必須關閉文件。這是因為對打開的磁盤文件進行寫入時,若文件緩沖區(qū)的空間未被寫入的內(nèi)容填滿,這些內(nèi)容將不會自動寫入打開的文件中,從而導致內(nèi)容丟失。int fclose(FILE *stream);例如,fclose(fp1);
11、表示將關閉FlLE結(jié)構(gòu)指針變量fp1對應的文件,并返回一個整數(shù)值。若成功地關閉了文件,則返回一個0值;否則返回一個非零值。8/3/202220if(fclose(fp)!=0)printf(File cannot be closedn);exit(1);elseprintf(File is now closedn);若要同時關閉程序中已打開的多個文件可使用fcloseall()函數(shù)。若程序已打開3個文件,當執(zhí)行n=fcloseall();時,這3個文件將同時被關閉,且使n的值為3。8/3/20222111.2 文件的讀寫一、 字符讀寫fputc()函數(shù)和fgetc()函數(shù)每執(zhí)行一次,讀寫文件中
12、的一個字符。1. fputc()函數(shù)int fputc(char ch,FILE *fp);其中:ch是要輸出的字符,它可以是一個字符常量,也可以是一個字符變量。fp是文件指針變量。函數(shù)的作用是把一個字符(ch的值)寫入到由指針變量fp所指定的文件中。fputc()函數(shù)有一個返回值;如果執(zhí)行此函數(shù)成功就返回被輸出的字符,否則就返回EOF(-1)。EOF是在stdio.h文件中定義的符號常量,值為-1。8/3/202222例11.1 從鍵盤輸入5個字符,逐個把它們寫到磁盤文件file1中。#include stdio.h#include stdlib.hmain()char ch; int i;
13、FILE *fp;if(fp=fopen(file1,w)=NULL)printf(cannot open filen);exit(1);for(i=1;i0)/*測試讀入的字符串長度是否為0*/fputs(a,fp); /*寫入磁盤文件*/fputs(n,fp); /*添加分隔標志*/gets(a);/*再從鍵盤讀一行字符*/fclose(fp);8/3/202231三、格式化讀寫fprintf()和fscanf()函數(shù)在實際應用中,應用程序有時需要按照規(guī)定的格式進行文件讀寫,這時可以利用格式化讀寫函數(shù)fscanf()和fprintf()來完成。1. fprintf()函數(shù)把若干個輸出項按照
14、指定的格式寫到磁盤文件上去。int fprintf(FILE *fp,char *format,);2. fscanf()函數(shù)從磁盤文件中按照指定的格式讀取數(shù)據(jù)。int fscanf(FILE *fp,char *format,);8/3/202232scanf()是從stdin標準輸入設備(鍵盤)輸入,printf()是向stdout標準輸出設備(顯示器)輸出;fscanf()和fprintf()則是從文件指針指定的文件輸入或是向文件指針指定的文件輸出。fprintf(fp,%s%d%d,var1,var2,var3);fscanf(fp,%s%d%d,var1,&var2,&var3);8
15、/3/202233例11.7 從鍵盤輸入10個學生的學號、姓名、性別和入學成績,用格式化方式寫入磁盤文件中。#include stdio.hstruct stulong num;char name9,sex3;float score;8/3/202234main()FILE *fp;int i;struct stu a;if (fp=fopen(datafile,w)=NULL)printf(File connot be openedn);exit(1);8/3/202235for(i=1;i=10;i+)scanf(%ld,&a.num);scanf(%s,);scanf(%s,
16、a.sex);scanf(%f,&a.score);fprintf(fp,%ldt%9st%3st%6.2fn,a.num,,a.sex,a.score);fclose(fp);8/3/202236四、塊數(shù)據(jù)讀寫fwrite()函數(shù)和fread()函數(shù)用于從文件中讀寫一個數(shù)據(jù)塊。1. fwrite()函數(shù)把數(shù)據(jù)塊寫入到磁盤文件中。int fwrite(char *ptr,unsigned size,unsigned n,FILE *fp);ptr是要寫入的數(shù)據(jù)塊在內(nèi)存中的首地址,size是字節(jié)數(shù),表示數(shù)據(jù)塊的大小,n表示數(shù)據(jù)塊的個數(shù),fp是文件類型的指針。函數(shù)的作用是將從ptr地址
17、開始,每塊size字節(jié),一共n塊數(shù)據(jù)寫入到由fp所指向的文件中。8/3/202237 for(i=0;i10;i+) scanf(%ld,&ai.num);scanf(%s,);scanf(%s,ai.sex);scanf(%d,&ai.score);fwrite(&ai,sizeof(STU),1,fp);8/3/2022382. fread()函數(shù)從一個磁盤文件中讀取數(shù)據(jù)塊。int fread(char *ptr,unsigned size,unsigned n,FILE *fp);fread()函數(shù)與fwrite()函數(shù)是相對應的。fread()也有4個參數(shù),其含義與fwr
18、ite()中基本相同,只是fread()中的ptr是讀出數(shù)據(jù)塊的存放地址。例:fread(&ai,sizeof(STU),1,fp); 8/3/20223911.3隨機文件和定位操作一、隨機文件上面介紹的對文件的讀寫都是順序讀寫,即從文件的開頭逐個數(shù)據(jù)讀或?qū)?。文件中有一個“讀寫位置指針”,指向當前讀或?qū)懙奈恢?。在順序讀寫時,每讀或?qū)懲暌粋€數(shù)據(jù)后該位置指針就自動移到它后面一個位置。只要能移動位置指針到所需的地方,就可不按文件的物理順序逐個地讀寫數(shù)據(jù)項,實現(xiàn)文件的隨機讀寫。 8/3/202240二、定位操作1、rewind()函數(shù)void rewind(FILE *fp);將fp指向的文件的位置指
19、針置于文件開頭位置,并清除文件結(jié)束標志和錯誤標志。函數(shù)無返回值。例如:rewind(fp);將fp所指向文件的位置指針從當前位置移到文件的開頭。8/3/202241例11.10 有一個磁盤文件,第一次將它的內(nèi)容顯示在屏幕上,第二次將它復制到另一文件上。#include stdio.hmain()FILE *fp1,*fp2;if(fp1=fopen(file1,r)=NULL)printf(cannot open filen);exit(1);if(fp2=fopen(file2,w)=NULL)printf(cannot open filen);exit(1);while(!feof(fp1
20、) putchar(fgetc(fp1);rewind(fp1);while(!feof(fp1) fputc(fgetc(fp1),fp2);fclose(fp1); fclose(fp2);8/3/2022422、fseek()函數(shù)int fseek(FILE *fp,long offset,int origin);其中fp指向需要操作的文件;origin指明以什么地方為起點進行指針移動,起點位置見下圖。8/3/202243fseek()函數(shù)中的offset是位移量,是以origin為基準指針向前或向后移動的字節(jié)數(shù)。所謂向前是指從文件開頭向文件尾移動的方向;向后則反之。位移量的值如果為負,
21、表示指針向后移動。位移量應為long型數(shù)據(jù)。例如:fseek(fp,10L,SEEK_SET);其作用是把文件指針從文件開頭移到第10個字節(jié)處。下面的寫法與其功能是一致的:fseek(fp,10L,0);8/3/202244fseek(fp,-10L,SEEK_END);把位置指針從文件尾往回移動10個字節(jié)。fseek(fp,-5L,1);把位置指針從現(xiàn)行位置往回移動5個字節(jié)。fseek(fp,0L,2);把位置指針移到文件末尾。若fseek()函數(shù)調(diào)用成功,返回值為0;否則返回一個非零值。8/3/2022453、ftell()函數(shù)ftell()函數(shù)用于得到文件的位置指針離開文件起點(即文件開頭)的偏移量(即偏移的字節(jié)數(shù))long ftell(FILE *fp);如果函數(shù)調(diào)用出錯(例如該文件不存在),則函數(shù)的返回值是-1L。由于文件中的位置指針經(jīng)常移動,人們往往不容易知道其當前位置。用ftell()函數(shù)可以得到當前位置。例如:n=ftell(fp);長整型變量n存放當前位置。8/3/20224611.4 文件的狀態(tài)檢測
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川省瀘州市瀘縣五中2024-2025學年高一(上)期末生物試卷(含答案)
- 習作:我的家人 說課稿-2024-2025學年語文四年級上冊統(tǒng)編版
- 鉬產(chǎn)品深加工技術改造產(chǎn)能提升項目可行性研究報告寫作模板-申批備案
- 廣西壯族自治區(qū)南寧市2024-2025學年八年級上學期期末生物試題(無答案)
- 安徽省淮北市和淮南市2025屆高三第一次質(zhì)量檢測歷史試卷(含答案)
- 陜西省寶雞市(2024年-2025年小學六年級語文)部編版期中考試((上下)學期)試卷及答案
- Unit 2 Making a Difference Developing ideas The power of good 說課稿-2023-2024學年高一英語外研版(2019)必修第三冊
- Unit 1 developing the topic-Oral communication 說課稿 2024-2025學年仁愛科普版(2024)七年級英語上冊
- 貴州黔南經(jīng)濟學院《數(shù)據(jù)結(jié)構(gòu)Ⅰ》2023-2024學年第一學期期末試卷
- 新疆塔城地區(qū)(2024年-2025年小學六年級語文)統(tǒng)編版綜合練習((上下)學期)試卷及答案
- 2019年海南省公務員考試申論真題(甲類)
- 事業(yè)部制改革方案
- 2025屆廣東省揭陽市高一生物第一學期期末統(tǒng)考模擬試題含解析
- CSR報告與可持續(xù)發(fā)展
- 蘇教版五年級上冊小數(shù)混合運算300道及答案
- 第一章問題解決策略:分類討論 教案 2024-2025學年 魯教版(五四制)六年級數(shù)學上冊
- 期末復習知識點-2024-2025學年統(tǒng)編版道德與法治九年級上冊
- 職業(yè)技術學?!犊缇畴娮由虅瘴锪髋c倉儲》課程標準
- 2024年小學語文名師工作室年度工作總結(jié)
- 2024時事政治考試題庫附參考答案(黃金題型)
- 中華人民共和國勞動合同法全文下載
評論
0/150
提交評論