電腦基礎(chǔ)知識(shí)c語(yǔ)言教學(xué)課件續(xù)_第1頁(yè)
電腦基礎(chǔ)知識(shí)c語(yǔ)言教學(xué)課件續(xù)_第2頁(yè)
電腦基礎(chǔ)知識(shí)c語(yǔ)言教學(xué)課件續(xù)_第3頁(yè)
電腦基礎(chǔ)知識(shí)c語(yǔ)言教學(xué)課件續(xù)_第4頁(yè)
電腦基礎(chǔ)知識(shí)c語(yǔ)言教學(xué)課件續(xù)_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第十八次課教案(續(xù))章節(jié)名稱(chēng):第11章 文 件教學(xué)目的與要求:掌握文件的概念,掌握打開(kāi)文件、關(guān)閉文件及對(duì)文件進(jìn)行讀寫(xiě)操作的方法。能夠?qū)ξ募M(jìn)行簡(jiǎn)單的讀寫(xiě)操作。教學(xué)內(nèi)容:1. 文件的概念及文件類(lèi)型指針2. 文件的打開(kāi)與關(guān)閉3. 文件的讀寫(xiě)4. 文件的定位與隨機(jī)讀寫(xiě)重點(diǎn): 2、3、4難點(diǎn): 1作業(yè):完善課程設(shè)計(jì)簡(jiǎn)單版中數(shù)據(jù)的存儲(chǔ)。教學(xué)過(guò)程:ppt課件,提問(wèn)回答8/3/2022111.1文件概述一、文件分類(lèi)(一)文件 文件是存儲(chǔ)在外存儲(chǔ)器上信息的集合。每個(gè)文件有唯一的名稱(chēng)(文件名.擴(kuò)展名)來(lái)標(biāo)識(shí)。計(jì)算機(jī)通過(guò)名稱(chēng)對(duì)文件進(jìn)行讀、寫(xiě)、修改或刪除等操作。文件可以從不同的角度進(jìn)行分類(lèi),例如按照文件保存的內(nèi)容區(qū)

2、分,磁盤(pán)文件可以分為程序文件和數(shù)據(jù)文件。8/3/20222程序文件保存的是程序,讀寫(xiě)操作一般由系統(tǒng)完成;數(shù)據(jù)文件用于保存數(shù)據(jù),其讀寫(xiě)往往由應(yīng)用程序?qū)崿F(xiàn)。從廣義上說(shuō),文件是指信息輸入和輸出的對(duì)象,磁盤(pán)文件、鍵盤(pán)、顯示器、打印機(jī)等均可視為文件。如DOS將打印機(jī)和鍵盤(pán)分別命名為 PRN和CON的兩個(gè)專(zhuān)用設(shè)備文件名。8/3/20223(二)數(shù)據(jù)文件的存儲(chǔ)形式C語(yǔ)言把文件看作是一個(gè)字符(字節(jié))的序列,即由一個(gè)一個(gè)字符(字節(jié))的數(shù)據(jù)順序組成。根據(jù)數(shù)據(jù)的組織形式,可分為ASCII碼文件和二進(jìn)制文件。ASCII碼文件是將數(shù)據(jù)以字符形式存放,又稱(chēng)為文本文件。二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣輸

3、出到磁盤(pán)上存放。8/3/20224一個(gè)任意int型整數(shù),其二進(jìn)制存儲(chǔ)方式都是占4個(gè)字節(jié);而字符存儲(chǔ)方式所占字節(jié)數(shù)該數(shù)的數(shù)字個(gè)數(shù)。int型數(shù) 2978 二進(jìn)制存儲(chǔ)方式 字符存儲(chǔ)方式用戶(hù)可以自己選擇存儲(chǔ)方式,若閱讀則選擇文本文件,否則為了節(jié)省時(shí)間和空間應(yīng)該選二進(jìn)制文件。00001011 1010001000110010 39 37 388/3/20225一般地說(shuō),二進(jìn)制文件節(jié)省存儲(chǔ)空間,用戶(hù)程序在實(shí)用中,從節(jié)省時(shí)間和空間的要求考慮,一般選用二進(jìn)制文件。但是如果用戶(hù)準(zhǔn)備的數(shù)據(jù)是作為文檔閱讀使用的,則一般使用文本文件,它們可以方便、快捷地通過(guò)顯示器或打印機(jī)直接輸出。8/3/20226(三)緩沖文件與非

4、緩沖文件1. 緩沖文件又稱(chēng)為標(biāo)準(zhǔn)I/O文件或高級(jí)文件系統(tǒng);是指系統(tǒng)自動(dòng)地在內(nèi)存區(qū)為每一個(gè)正在使用的文件開(kāi)辟一個(gè)緩沖區(qū)。當(dāng)從磁盤(pán)文件讀數(shù)據(jù)時(shí),應(yīng)用程序并不直接從磁盤(pán)文件讀取數(shù)據(jù),而是先由系統(tǒng)將一批數(shù)據(jù)從磁盤(pán)取入內(nèi)存緩沖區(qū),然后再?gòu)木彌_區(qū)依次將數(shù)據(jù)送給程序中的接收變量,供程序處理。在向磁盤(pán)文件寫(xiě)入數(shù)據(jù)時(shí),先將程序中有關(guān)變量或表達(dá)式的值送到緩沖區(qū)中,待緩沖區(qū)裝滿(mǎn)后,才由系統(tǒng)將緩沖區(qū)的數(shù)據(jù)一次寫(xiě)入磁盤(pán)文件中。這樣做減少了系統(tǒng)讀寫(xiě)磁盤(pán)的次數(shù),提高了程序的執(zhí)行效率。 8/3/202272. 非緩沖文件又稱(chēng)為系統(tǒng)I/O文件或低級(jí)文件系統(tǒng)。是指系統(tǒng)不自動(dòng)開(kāi)辟確定大小的緩沖區(qū),而由程序本身根據(jù)需要設(shè)定。ANSI

5、 C標(biāo)準(zhǔn)決定不采用非緩沖文件系統(tǒng),而只采用緩沖文件系統(tǒng)。即既用緩沖文件系統(tǒng)處理文本文件,也用它來(lái)處理二進(jìn)制文件。8/3/20228(四)文件存取方式C語(yǔ)言的數(shù)據(jù)文件由順序存放的一連串字節(jié)(字符)組成,沒(méi)有記錄的界限,因此,C語(yǔ)言的文件被稱(chēng)作流式文件,文件存取操作的數(shù)據(jù)單位是字節(jié),允許存取一個(gè)字節(jié)和任意多個(gè)字節(jié),增加了文件操作的靈活性。緩沖文件系統(tǒng)提供了4種文件存取方法:(1) 讀寫(xiě)一個(gè)字符。(2) 讀寫(xiě)一個(gè)字符串,將多個(gè)字符組成的字符串寫(xiě)入文件或從文件中讀出。(3) 格式化讀寫(xiě),根據(jù)格式控制指定的數(shù)據(jù)格式對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換存取。(4) 成塊讀寫(xiě)。有相應(yīng)的函數(shù)來(lái)完成上述的操作。8/3/20229二、

6、文件指針 緩沖文件系統(tǒng)中,關(guān)鍵的概念是“文件指針”。每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟一個(gè)區(qū)域,用來(lái)存放文件的有關(guān)信息(如文件的名字、文件當(dāng)前位置等)。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類(lèi)型是由系統(tǒng)定義的,取名為FILE。Turbo C在stdio.h文件中定義了FILE類(lèi)型。 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類(lèi)型之后,可以用它來(lái)定義FILE類(lèi)型變量,以便存放文件的信息。FILE f1,f2;FILE *fp;fp是一個(gè)指向FILE類(lèi)型的指針變量。可以使fp指向某一個(gè)文件的結(jié)構(gòu)體變量,從而通過(guò)該結(jié)構(gòu)體變量中的文件信息能夠訪問(wèn)該文件。也就是說(shuō),通過(guò)文件指針變量能夠找到與它相關(guān)的文件。如果程序同時(shí)對(duì)n個(gè)文件進(jìn)行操作,一般應(yīng)設(shè)n個(gè)指針變量,使它們分別指向n個(gè)文件(即指向存放該文件信息的結(jié)構(gòu)體變量),以實(shí)現(xiàn)對(duì)文件的訪問(wèn)。 8/3/202212三、文件的打開(kāi)與關(guān)閉 對(duì)磁盤(pán)文件的操作往往包括打開(kāi)文件、讀文件、寫(xiě)文件、關(guān)閉文件或刪除文件等。任何一個(gè)文件操作,都

8、必須先打開(kāi),后讀或?qū)?;讀寫(xiě)完成后,最后都應(yīng)關(guān)閉文件。1、文件的打開(kāi)即在程序和系統(tǒng)間建立聯(lián)系,程序?qū)⑽募安僮鞣绞酵ㄖo系統(tǒng)。8/3/202213FILE *fopen( char *filename,char *mode);需要用#include “stdio.h” 函數(shù)的功能是打開(kāi)一個(gè)filename指向的文件,文件使用方式由mode指向的值決定。函數(shù)的返回值是一個(gè)文件指針。例如:FILE *fp;fp=fopen(a1,r);8/3/202214若要打開(kāi)文件的文件名已放在一個(gè)字符數(shù)組中或已由一個(gè)字符指針指向它,可通過(guò)該字符數(shù)組或字符指針來(lái)打開(kāi)該文件。如:FILE *fp;char c5=

9、 a1;fp=fopen(c,r);文件名中也可以包含用雙反斜線隔開(kāi)的路徑名d:turboc2a18/3/2022158/3/202216當(dāng)用fopen()函數(shù)成功地打開(kāi)一個(gè)文件時(shí),該函數(shù)將返回一個(gè)FILE指針;如果文件打開(kāi)操作失敗,則函數(shù)返回值是NULL,即一個(gè)空指針。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ù)將關(guān)閉所有打開(kāi)的文件。若打開(kāi)的是一個(gè)已存在的文件,且使用方式

10、為“W”或“wb”,則文件原有內(nèi)容將被新寫(xiě)入的內(nèi)容覆蓋。8/3/202217對(duì)磁盤(pán)文件,在使用前一定要打開(kāi),而對(duì)外部設(shè)備,盡管它們也可以作為設(shè)備文件處理,但在以前的應(yīng)用中并未用到“打開(kāi)文件”的操作。這是因?yàn)楫?dāng)運(yùn)行一個(gè)C程序時(shí),系統(tǒng)自動(dòng)地打開(kāi)了5個(gè)設(shè)備文件,并自動(dòng)地定義了5個(gè)FILE結(jié)構(gòu)指針變量。8/3/2022188/3/2022192、文件的關(guān)閉程序?qū)ξ募淖x寫(xiě)操作完成后,必須關(guān)閉文件。這是因?yàn)閷?duì)打開(kāi)的磁盤(pán)文件進(jìn)行寫(xiě)入時(shí),若文件緩沖區(qū)的空間未被寫(xiě)入的內(nèi)容填滿(mǎn),這些內(nèi)容將不會(huì)自動(dòng)寫(xiě)入打開(kāi)的文件中,從而導(dǎo)致內(nèi)容丟失。int fclose(FILE *stream);例如,fclose(fp1);

11、表示將關(guān)閉FlLE結(jié)構(gòu)指針變量fp1對(duì)應(yīng)的文件,并返回一個(gè)整數(shù)值。若成功地關(guān)閉了文件,則返回一個(gè)0值;否則返回一個(gè)非零值。8/3/202220if(fclose(fp)!=0)printf(File cannot be closedn);exit(1);elseprintf(File is now closedn);若要同時(shí)關(guān)閉程序中已打開(kāi)的多個(gè)文件可使用fcloseall()函數(shù)。若程序已打開(kāi)3個(gè)文件,當(dāng)執(zhí)行n=fcloseall();時(shí),這3個(gè)文件將同時(shí)被關(guān)閉,且使n的值為3。8/3/20222111.2 文件的讀寫(xiě)一、 字符讀寫(xiě)fputc()函數(shù)和fgetc()函數(shù)每執(zhí)行一次,讀寫(xiě)文件中

12、的一個(gè)字符。1. fputc()函數(shù)int fputc(char ch,FILE *fp);其中:ch是要輸出的字符,它可以是一個(gè)字符常量,也可以是一個(gè)字符變量。fp是文件指針變量。函數(shù)的作用是把一個(gè)字符(ch的值)寫(xiě)入到由指針變量fp所指定的文件中。fputc()函數(shù)有一個(gè)返回值;如果執(zhí)行此函數(shù)成功就返回被輸出的字符,否則就返回EOF(-1)。EOF是在stdio.h文件中定義的符號(hào)常量,值為-1。8/3/202222例11.1 從鍵盤(pán)輸入5個(gè)字符,逐個(gè)把它們寫(xiě)到磁盤(pán)文件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)/*測(cè)試讀入的字符串長(zhǎng)度是否為0*/fputs(a,fp); /*寫(xiě)入磁盤(pán)文件*/fputs(n,fp); /*添加分隔標(biāo)志*/gets(a);/*再?gòu)逆I盤(pán)讀一行字符*/fclose(fp);8/3/202231三、格式化讀寫(xiě)fprintf()和fscanf()函數(shù)在實(shí)際應(yīng)用中,應(yīng)用程序有時(shí)需要按照規(guī)定的格式進(jìn)行文件讀寫(xiě),這時(shí)可以利用格式化讀寫(xiě)函數(shù)fscanf()和fprintf()來(lái)完成。1. fprintf()函數(shù)把若干個(gè)輸出項(xiàng)按照

14、指定的格式寫(xiě)到磁盤(pán)文件上去。int fprintf(FILE *fp,char *format,);2. fscanf()函數(shù)從磁盤(pán)文件中按照指定的格式讀取數(shù)據(jù)。int fscanf(FILE *fp,char *format,);8/3/202232scanf()是從stdin標(biāo)準(zhǔn)輸入設(shè)備(鍵盤(pán))輸入,printf()是向stdout標(biāo)準(zhǔn)輸出設(shè)備(顯示器)輸出;fscanf()和fprintf()則是從文件指針指定的文件輸入或是向文件指針指定的文件輸出。fprintf(fp,%s%d%d,var1,var2,var3);fscanf(fp,%s%d%d,var1,&var2,&var3);8

15、/3/202233例11.7 從鍵盤(pán)輸入10個(gè)學(xué)生的學(xué)號(hào)、姓名、性別和入學(xué)成績(jī),用格式化方式寫(xiě)入磁盤(pán)文件中。#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ù)讀寫(xiě)fwrite()函數(shù)和fread()函數(shù)用于從文件中讀寫(xiě)一個(gè)數(shù)據(jù)塊。1. fwrite()函數(shù)把數(shù)據(jù)塊寫(xiě)入到磁盤(pán)文件中。int fwrite(char *ptr,unsigned size,unsigned n,FILE *fp);ptr是要寫(xiě)入的數(shù)據(jù)塊在內(nèi)存中的首地址,size是字節(jié)數(shù),表示數(shù)據(jù)塊的大小,n表示數(shù)據(jù)塊的個(gè)數(shù),fp是文件類(lèi)型的指針。函數(shù)的作用是將從ptr地址

17、開(kāi)始,每塊size字節(jié),一共n塊數(shù)據(jù)寫(xiě)入到由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ù)從一個(gè)磁盤(pán)文件中讀取數(shù)據(jù)塊。int fread(char *ptr,unsigned size,unsigned n,FILE *fp);fread()函數(shù)與fwrite()函數(shù)是相對(duì)應(yīng)的。fread()也有4個(gè)參數(shù),其含義與fwr

18、ite()中基本相同,只是fread()中的ptr是讀出數(shù)據(jù)塊的存放地址。例:fread(&ai,sizeof(STU),1,fp); 8/3/20223911.3隨機(jī)文件和定位操作一、隨機(jī)文件上面介紹的對(duì)文件的讀寫(xiě)都是順序讀寫(xiě),即從文件的開(kāi)頭逐個(gè)數(shù)據(jù)讀或?qū)?。文件中有一個(gè)“讀寫(xiě)位置指針”,指向當(dāng)前讀或?qū)懙奈恢?。在順序讀寫(xiě)時(shí),每讀或?qū)懲暌粋€(gè)數(shù)據(jù)后該位置指針就自動(dòng)移到它后面一個(gè)位置。只要能移動(dòng)位置指針到所需的地方,就可不按文件的物理順序逐個(gè)地讀寫(xiě)數(shù)據(jù)項(xiàng),實(shí)現(xiàn)文件的隨機(jī)讀寫(xiě)。 8/3/202240二、定位操作1、rewind()函數(shù)void rewind(FILE *fp);將fp指向的文件的位置指

19、針置于文件開(kāi)頭位置,并清除文件結(jié)束標(biāo)志和錯(cuò)誤標(biāo)志。函數(shù)無(wú)返回值。例如:rewind(fp);將fp所指向文件的位置指針從當(dāng)前位置移到文件的開(kāi)頭。8/3/202241例11.10 有一個(gè)磁盤(pán)文件,第一次將它的內(nèi)容顯示在屏幕上,第二次將它復(fù)制到另一文件上。#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指明以什么地方為起點(diǎn)進(jìn)行指針移動(dòng),起點(diǎn)位置見(jiàn)下圖。8/3/202243fseek()函數(shù)中的offset是位移量,是以origin為基準(zhǔn)指針向前或向后移動(dòng)的字節(jié)數(shù)。所謂向前是指從文件開(kāi)頭向文件尾移動(dòng)的方向;向后則反之。位移量的值如果為負(fù),

21、表示指針向后移動(dòng)。位移量應(yīng)為long型數(shù)據(jù)。例如:fseek(fp,10L,SEEK_SET);其作用是把文件指針從文件開(kāi)頭移到第10個(gè)字節(jié)處。下面的寫(xiě)法與其功能是一致的:fseek(fp,10L,0);8/3/202244fseek(fp,-10L,SEEK_END);把位置指針從文件尾往回移動(dòng)10個(gè)字節(jié)。fseek(fp,-5L,1);把位置指針從現(xiàn)行位置往回移動(dòng)5個(gè)字節(jié)。fseek(fp,0L,2);把位置指針移到文件末尾。若fseek()函數(shù)調(diào)用成功,返回值為0;否則返回一個(gè)非零值。8/3/2022453、ftell()函數(shù)ftell()函數(shù)用于得到文件的位置指針離開(kāi)文件起點(diǎn)(即文件開(kāi)頭)的偏移量(即偏移的字節(jié)數(shù))long ftell(FILE *fp);如果函數(shù)調(diào)用出錯(cuò)(例如該文件不存在),則函數(shù)的返回值是-1L。由于文件中的位置指針經(jīng)常移動(dòng),人們往往不容易知道其當(dāng)前位置。用ftell()函數(shù)可以得到當(dāng)前位置。例如:n=ftell(fp);長(zhǎng)整型變量n存放當(dāng)前位置。8/3/20224611.4 文件的狀態(tài)檢測(cè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論