辦公課件第11章文件_第1頁(yè)
辦公課件第11章文件_第2頁(yè)
辦公課件第11章文件_第3頁(yè)
辦公課件第11章文件_第4頁(yè)
辦公課件第11章文件_第5頁(yè)
已閱讀5頁(yè),還剩38頁(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、 第11章 文件 11.1文件的基本概念 11.2文件類(lèi)型指針 11.3文件的打開(kāi)與關(guān)閉 11.4文件的讀寫(xiě) 11.5文件的定位 11.6出錯(cuò)檢測(cè) 11.7文件輸入輸出小結(jié) 11.1 文件概述文件定義:指存儲(chǔ)在外部介質(zhì)上的數(shù)據(jù)的集合。(數(shù)據(jù)文件)原來(lái)執(zhí)行程序:鍵盤(pán)輸入數(shù)據(jù) 程序 屏幕顯示結(jié)果現(xiàn)在執(zhí)行程序:文件讀入數(shù)據(jù) 程序 結(jié)果存入文件文件分類(lèi)ASCII文件(文本文件):(能直接顯示內(nèi)容,費(fèi)存儲(chǔ)空間)二進(jìn)制文件:(不能顯示內(nèi)容,節(jié)省存儲(chǔ)空間) 11.2 文件類(lèi)型指針 緩沖文件系統(tǒng)中,每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟一個(gè)區(qū),用來(lái)存放文件的有關(guān)信息。 在Turbo c版本中的stdio.h文件中有以

2、下的類(lèi)型定義:typedef struct int level; /* 緩沖區(qū)空和滿的程度*/ unsigned flags; /* 文件狀態(tài)標(biāo)志 */ char fd; /* 文件描述符 */ unsigned char hold; /* 無(wú)緩沖區(qū)不讀取字符 */ int bsize; /* 緩沖區(qū)的大小*/ unsigned char *buffer; /* 數(shù)據(jù)緩沖區(qū)位置*/ unsigned char *curp; /* 指針的當(dāng)前指向*/ unsigned istemp; /* 臨時(shí)文件指使器*/ short token; /* 用于有效性的檢查 */ FILE; /* This i

3、s the FILE object */ 定義文件型指針變量 :FILE *fp; fp是一個(gè)指向FILE類(lèi)型結(jié)構(gòu)體的指針變量,可通過(guò)該結(jié)構(gòu)體變量中的文件信息能夠訪問(wèn)該文件。如果有n個(gè)文件,一般應(yīng)設(shè)n個(gè)指針變量(指向FILE類(lèi)型結(jié)構(gòu)體的指針變量),使它們指向n個(gè)文件,以實(shí)現(xiàn)對(duì)文件的訪問(wèn)。 11.3 文件的打開(kāi)與關(guān)閉文件的打開(kāi)(fopen函數(shù)) fopen 函數(shù)的調(diào)用方式: FILE *fopen(文件名,使用文件方式); fp=fopen(文件名,使用文件方式); Eg: fp=fopen(“a1”,”r”); 三點(diǎn)信息: (1)需要打開(kāi)的文件名. (2)使用文件的方式. (3)用一個(gè)指針變量

4、指向該文件.使用文件方式表 文件的關(guān)閉(fclose函數(shù)) fclose函數(shù)的調(diào)用方式:fclose (文件指針);注意: 應(yīng)養(yǎng)成在程序終止之前關(guān)閉所有使用的文件的習(xí)慣,否則丟失數(shù)據(jù). fclose 函數(shù)的返回值:正常關(guān)閉為0. 11.4 文件的讀寫(xiě)1.fputc 函數(shù)一般形式: fputc(ch, fp); 功能:將一個(gè)字符寫(xiě)到磁盤(pán)文件上去 參數(shù): ch要輸出的字符 fp文件指針 返回值:調(diào)用成功時(shí)返回輸出的字符。 調(diào)用失敗時(shí)返回 EOF(-1)對(duì)于fputc函數(shù)的使用也要說(shuō)明幾點(diǎn):(1)被寫(xiě)入的文件可以用、寫(xiě)、讀寫(xiě),追加方式打開(kāi),用寫(xiě)或讀寫(xiě)方式打開(kāi)一個(gè)已存在的文件時(shí)將清除原有的文件內(nèi)容,寫(xiě)

5、入字符從文件首開(kāi)始。如需保留原有文件內(nèi)容,希望寫(xiě)入的字符以文件末開(kāi)始存放,必須以追加方式打開(kāi)文件。被寫(xiě)入的文件若不存在,則創(chuàng)建該文件。(2)每寫(xiě)入一個(gè)字符,文件內(nèi)部位置指針向后移動(dòng)一個(gè)字節(jié)。(3)fputc函數(shù)有一個(gè)返回值,如寫(xiě)入成功則返回寫(xiě)入的字符, 否則返回一個(gè)EOF??捎么藖?lái)判斷寫(xiě)入是否成功?!纠?0.1】從鍵盤(pán)輸入一行字符,寫(xiě)入一個(gè)文件, 再把該文件內(nèi)容讀出顯示在屏幕上。 #include stdio.h#include stdlib.hvoid main() FILE *fp;char ch;if(fp=fopen(c:file1.txt,w+)=NULL) printf(Canno

6、t open file please strike any key exit!);getchar();exit(1);printf(input a string:n);ch=getchar();while (ch!=n) fputc(ch,fp);ch=getchar(); 2. fgetc函數(shù)一般形式:ch=fgetc(fp);功能:從指定文件讀入一個(gè)字符,該文件必須是以讀或讀寫(xiě)方式打開(kāi)參數(shù): fp文件指針 返回值:調(diào)用成功時(shí)返回讀入的字符 賦給ch 文件結(jié)束時(shí)返回文件結(jié)束符返回 EOF(-1)從磁盤(pán)文件順序讀入字符并在屏幕上顯示出來(lái):#include void main()FILE *fp

7、;char ch;fp=fopen(c:1.txt,rw);ch=fgetc(fp);while(ch!=EOF) putchar(ch);ch=fgetc(fp); 此種方法只適用于文本文件【例10.2】讀入文件c:file1.txt,在屏幕上輸出。#include stdio.h#include stdlib.hvoid main() FILE *fp;char ch;if(fp=fopen(c:file1.txt,r)=NULL) printf(Cannot open file!);getchar();exit(1);ch=fgetc(fp);while (ch!=EOF) putcha

8、r(ch);ch=fgetc(fp);printf(n);fclose(fp); 3.讀字符串函數(shù)fgets函數(shù)功能是從指定的文件中讀一個(gè)字符串到字符數(shù)組中。函數(shù)調(diào)用的形式為: fgets(字符數(shù)組名,n,文件指針); 其中的n是一個(gè)正整數(shù)。表示從文件中讀出的字符串不超過(guò) n-1個(gè)字符。在讀入的最后一個(gè)字符后加上串結(jié)束標(biāo)志0。例如:fgets(str,n,fp);其意義是從fp所指的文件中讀出n-1個(gè)字符送入字符數(shù)組str中。對(duì)fgets函數(shù)有兩點(diǎn)說(shuō)明:(1)在讀出n-1個(gè)字符之前,如遇到了換行符或EOF,則讀出結(jié)束。(2)fgets函數(shù)也有返回值,其返回值是字符數(shù)組的首地址?!纠?0.3】從

9、c:file1.txt文件中讀入一個(gè)含10個(gè)字符的字符串。 #include stdio.h #include stdlib.hvoid main() FILE *fp;char stri11;if(fp=fopen(c:file1.txt,r)=NULL) printf(Cannot open file strike any key exit!);getchar();exit(1);fgets(stri,11,fp);printf(%s,stri);fclose(fp); 4.寫(xiě)字符串函數(shù)fputsfputs函數(shù)的功能是向指定的文件寫(xiě)入一個(gè)字符串,其調(diào)用形式為:fputs(字符串,文件指針)

10、 其中字符串可以是字符串常量,也可以是字符數(shù)組名,或指針變量。例如:fputs(“1234“,fp);其意義是把字符串“1234”寫(xiě)入fp所指的文件之中。#include void main()FILE *fp;char ch8=china;fp=fopen(c:file1.txt,wt);fputs(ch,fp); 5、fread 函數(shù)和fwrite函數(shù)調(diào)用的一般形式: fread(buffer, size, count, fp); fwrite(buffer, size, count, fp); 說(shuō)明:buffer:是指針, 對(duì) fread,是讀入數(shù)據(jù)的存放地址. 對(duì)fwrite,是要輸出

11、數(shù)據(jù)的地址. size:要讀寫(xiě)的字節(jié)數(shù). count:要進(jìn)行讀寫(xiě)多少個(gè)size字節(jié)的數(shù)據(jù)項(xiàng) fp:文件型指針. 此兩種函數(shù)一般用于二進(jìn)制文件的輸入輸出.把一個(gè)實(shí)數(shù)寫(xiě)到磁盤(pán)文件中去:f=35.678;fread (&f,sizeof(f), 1,fp);結(jié)構(gòu)體:struct student_type char name10; int num; int age; char addr40; stud40;有40個(gè)學(xué)生的數(shù)據(jù),按上面的結(jié)構(gòu)存入磁盤(pán)文件中,for(i=0;i40;i+) fread(&studi,sizeof(struct student_type), 1, fp);例如 fread(b

12、uffer, size, count, fp); fwrite(buffer, size, count, fp); 一般用于2進(jìn)制文件的存取。比如用 fread(buffer, size, count, stdin); 從鍵盤(pán)讀入數(shù)據(jù)。如鍵盤(pán) 輸入:Zhang 1001 19 room_12 會(huì)出錯(cuò)。#include stdio.h #define SIZE 3 struct student_type char num8; char name10; char addr10; studSIZE;void save( ) /*保存到磁盤(pán)*/ FILE *fp; int i; if(fp=fopen

13、(c:1.txt,wb)=NULL) printf(cannot open filen); return; for(i=0;iSIZE;i+) if(fread(&studi,sizeof(struct student_type),1,fp)!=1) printf(file,write,errorn); void main( ) int i; save( ); for(i=0;iSIZE;i+)printf(%s%s%s,,studi.num,studi.addr); 6、fprintf 函數(shù)和fscanf函數(shù) 此兩種函數(shù)的讀寫(xiě)對(duì)象不是終端而是磁盤(pán)文件.一般調(diào)用方式: fp

14、rintf(文件指針,格式字符串,輸出表列); fscanf(文件指針,格式字符串,輸出表列); 說(shuō)明:這兩種函數(shù)對(duì)磁盤(pán)文件讀寫(xiě),使用方便,易理解. 但輸入輸出需要轉(zhuǎn)化,因此,在內(nèi)存與磁盤(pán)頻繁交換數(shù)據(jù)的情況下,最好用fread和fwrite函數(shù).例如:fscanf(fp,%d%s,&i,&s);/*從磁盤(pán)文件中將數(shù)據(jù)讀入到將整型變量i和實(shí)型變量s中*/ fprintf(fp,%d%c,j,ch);/*將整型變量i和字符型變量ch的值輸出到fp所指向的文件中*/【例10.7】從鍵盤(pán)輸入三個(gè)學(xué)生數(shù)據(jù),寫(xiě)入一個(gè)文件中, 再讀出這三個(gè)學(xué)生的數(shù)據(jù)顯示在屏幕上。 #include stdio.h #inc

15、lude stdlib.h#define NUM 3struct student long int num;char name10;int age; stuaNUM,stubNUM,*p,*q;void main() FILE *fp;int i;p=stua;q=stub;if(fp=fopen(c:file_3.txt,wb+)=NULL) printf(Cannot open file strike any key exit!);getchar();exit(1);printf(ninput data:n);for(i=0;inum,p-name,&p-age);p=stua;for(i

16、=0;inum,p-name,p-age);rewind(fp);for(i=0;inum,q-name,&q-age);printf(nnnumbertnametagen);q=stub;for(i=0;inum,q-name, q-age);fclose(fp);.EOF11.5文件的定位文件位置指針控制文件的順序讀寫(xiě)。一般在文件打開(kāi)時(shí),位置指針在文件開(kāi)頭,隨著讀寫(xiě)的字節(jié)數(shù)向后移動(dòng)。(按追加方式打開(kāi)時(shí),位置指針在文件的末尾。)11.5.1 rewind函數(shù)使位置指針重新返回文件的開(kāi) 頭,此函數(shù)無(wú)返回值.例10.4 有一個(gè)磁盤(pán)文件,第一次將它的內(nèi)容顯示在屏幕上,第二次把它復(fù)制到文件上。#in

17、clude void main() FILE *fp1,*fp2; fp1 = fopen (c:1.txt, r); fp2 = fopen (c:2.txt, w); while(!feof(fp1) putchar(getc(fp1); rewind(fp1);while(!feof(fp1) putc(getc(fp1),fp2);11.5.2 fseek函數(shù)和隨機(jī)讀寫(xiě) fseek函數(shù)可以實(shí)現(xiàn)改變文件的位置指針. 調(diào)用方式: fseek(文件類(lèi)型指針,位移量,起始點(diǎn)) 其中:“文件指針”指向被移動(dòng)的文件。 “位移量”表示移動(dòng)的字節(jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長(zhǎng)度大于64K

18、B 時(shí)不會(huì)出錯(cuò)。當(dāng)用常量表示位移量時(shí),要求加后綴“L”?!捌鹗键c(diǎn)”表示從何處開(kāi)始計(jì)算位移量,規(guī)定的起始點(diǎn)有三種:文件首,當(dāng)前位置和文件尾。其表示方法如表10.2。10-2 起始點(diǎn)表示方式表起始點(diǎn)表示符號(hào)數(shù)字表示文件首SEEKSET0當(dāng)前位置SEEKCUR1文件末尾SEEKEND2例如:fseek(fp,10L,0);其意義是把位置指針移到離文件首10個(gè)字節(jié)處。fseek(fp,10L,1); 其意義是把位置指針移到離當(dāng)前位置10個(gè)字節(jié)處。fseek(fp,-10L,2); 其意義是把位置指針從文件末尾處向后退10個(gè)字節(jié)?!纠?0.8】在學(xué)生文件c:file_3.txt中讀出第二個(gè)學(xué)生的數(shù)據(jù)。(

19、說(shuō)明文件的隨機(jī)讀寫(xiě))#include stdio.h #include stdlib.h#define NUM 3struct student int num;char name10;int age; stu,*p;void main() FILE *fp;int i=1;p=&stu;if(fp=fopen(c:file_3.txt,rb)=NULL)printf(Cannot open file strike any key exit!);getchar(); exit(1);rewind(fp);fseek(fp,i*sizeof(struct student),0);fread(p,s

20、izeof(struct student),1,fp);printf(nnnumbertnamet agen);printf(%dt%st%dn,p-num,p-name,p-age);11.5.3 ftell 函數(shù)ftell函數(shù):得到當(dāng)前文件指針位置.其調(diào)用形式為:long ftell(文件指針);返回文件位置指針的當(dāng)前位置(用相對(duì)于文件頭的位移量表示), 如果返回值為-1L,則表明調(diào)用出錯(cuò)。例如: offset=ftell(fp); if(offset=-1L)printf(“ftell() errorn”);(1)文件結(jié)束檢測(cè)函數(shù)feof函數(shù)調(diào)用格式: feof(文件指針);功能:判斷文

21、件是否處于文件結(jié)束位置,如文件結(jié)束,則返回值為1,否則為0。(2)讀寫(xiě)文件出錯(cuò)檢測(cè)函數(shù)ferror函數(shù)在調(diào)用輸入輸出庫(kù)函數(shù)時(shí),如果出錯(cuò),除了函數(shù)返回值有所反映外,也可利用ferror()函數(shù)來(lái)檢測(cè)。調(diào)用格式: ferror(文件指針);功能:檢查文件在用各種輸入輸出函數(shù)進(jìn)行讀寫(xiě)時(shí)是否出錯(cuò)。如果函數(shù)返回值為0,表示未出錯(cuò);如果返回一個(gè)非0值,表示出錯(cuò)。對(duì)同一文件,每次調(diào)用輸入輸出函數(shù)均產(chǎn)生一個(gè)新的ferror()函數(shù)值。因此在調(diào)用了輸入輸出函數(shù)后,應(yīng)立即檢測(cè),否則出錯(cuò)信息會(huì)丟失。在執(zhí)行fopen()函數(shù)時(shí),系統(tǒng)將ferror()的值自動(dòng)置為0。 11.6 出錯(cuò)的檢測(cè)(3)文件出錯(cuò)標(biāo)志和文件結(jié)束標(biāo)

22、志置0函數(shù)clearerr函數(shù)調(diào)用格式: clearerr(文件指針);功能:將文件錯(cuò)誤標(biāo)志(即ferror()函數(shù)的值)和文件結(jié)束標(biāo)志(即feof()函數(shù)的值)置為0。 對(duì)同一文件,只要出錯(cuò)就一直保留,直至遇到clearerr()函數(shù)或rewind()函數(shù),或其它任何一個(gè)輸入輸出庫(kù)函數(shù)?!纠?0.3】把一個(gè)磁盤(pán)文件中的信息復(fù)制到另一個(gè)磁盤(pán)文件中。方法一:在main()中完成磁盤(pán)文件名稱(chēng)的輸入,然后處理。 11.3 文件操作舉例#include stdio.h#include stdlib.hvoid main()FILE *fp1,*fp2;char ch,chin10,chout10;pr

23、intf(please input the in name:n);scanf(%s,chin);printf(please input the out name:n);scanf(%s,chout);if(fp1=fopen(chin,r)=NULL)printf(Cannot open %sn,chin); getchar();exit(1);if(fp2=fopen(chout,w+)=NULL) printf(Cannot open %sn,chout);getchar();exit(1);while(ch=fgetc(fp1)!=EOF)fputc(ch,fp2);fclose(fp1

24、);fclose(fp2);方法二:帶參的main函數(shù),把命令行參數(shù)中的前一個(gè)文件名標(biāo)識(shí)的文件, 復(fù)制到后一個(gè)文件名標(biāo)識(shí)的文件中, 如命令行中只有一個(gè)文件名則把該文件寫(xiě)到標(biāo)準(zhǔn)輸出文件(顯示器)中。#include stdio.h #include stdlib.hvoid main(int argc,char *chr) FILE *fp1,*fp2;char ch;if(argc=1) printf(have not enter file name strike any key exit); getchar();exit(0);if(fp1=fopen(chr1,r)=NULL) print

25、f(Cannot open %sn,chr1); getchar();exit(1);if(argc=2) fp2=stdout;else if(fp2=fopen(chr2,w+)=NULL) printf(Cannot open %sn,chr2);getchar();exit(1);while(ch=fgetc(fp1)!=EOF)fputc(ch,fp2);fclose(fp1);fclose(fp1); 表10-1文件使用方式對(duì)照表文件使用方式意義rt 只讀。打開(kāi)一個(gè)文本文件,只允許讀數(shù)據(jù)wt只寫(xiě)。打開(kāi)或建立一個(gè)文本文件,只允許寫(xiě)數(shù)據(jù)at追加。打開(kāi)一個(gè)文本文件,并在文件末尾寫(xiě)數(shù)據(jù)rb只讀。打開(kāi)一個(gè)二進(jìn)制文件,只允許讀數(shù)據(jù)wb只寫(xiě)。打開(kāi)或建立一個(gè)二進(jìn)制文件,只允許寫(xiě)數(shù)據(jù)ab追加。打開(kāi)一個(gè)二進(jìn)制文件,并在文件末尾寫(xiě)數(shù)據(jù)rt+讀寫(xiě)。打開(kāi)一個(gè)文本文件,允許讀和寫(xiě)wt+讀寫(xiě)。打開(kāi)或建立一個(gè)文本文件,允許讀寫(xiě)at+讀寫(xiě)。打開(kāi)一個(gè)文本文件,允許讀,或在文件末追加數(shù)據(jù)rb+讀寫(xiě)。打開(kāi)一個(gè)二進(jìn)制文件,允許讀和寫(xiě)wb+讀寫(xiě)。打開(kāi)或建立一個(gè)二進(jìn)制文件,允許讀和寫(xiě)ab+讀寫(xiě)。打開(kāi)一個(gè)二進(jìn)制文件,允許讀,或在文件末追加數(shù)據(jù) 說(shuō)明:(1)用“r”方式打開(kāi)的文件必須已存在且只能讀出,不能打開(kāi)并不存在的文件.(2)用“w”

溫馨提示

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