版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 第11章 文件 11.1文件的基本概念 11.2文件類型指針 11.3文件的打開與關(guān)閉 11.4文件的讀寫 11.5文件的定位 11.6出錯檢測 11.7文件輸入輸出小結(jié) 11.1 文件概述文件定義:指存儲在外部介質(zhì)上的數(shù)據(jù)的集合。(數(shù)據(jù)文件)原來執(zhí)行程序:鍵盤輸入數(shù)據(jù) 程序 屏幕顯示結(jié)果現(xiàn)在執(zhí)行程序:文件讀入數(shù)據(jù) 程序 結(jié)果存入文件文件分類ASCII文件(文本文件):(能直接顯示內(nèi)容,費存儲空間)二進制文件:(不能顯示內(nèi)容,節(jié)省存儲空間) 11.2 文件類型指針 緩沖文件系統(tǒng)中,每個被使用的文件都在內(nèi)存中開辟一個區(qū),用來存放文件的有關(guān)信息。 在Turbo c版本中的stdio.h文件中有以
2、下的類型定義:typedef struct int level; /* 緩沖區(qū)空和滿的程度*/ unsigned flags; /* 文件狀態(tài)標志 */ char fd; /* 文件描述符 */ unsigned char hold; /* 無緩沖區(qū)不讀取字符 */ int bsize; /* 緩沖區(qū)的大小*/ unsigned char *buffer; /* 數(shù)據(jù)緩沖區(qū)位置*/ unsigned char *curp; /* 指針的當前指向*/ unsigned istemp; /* 臨時文件指使器*/ short token; /* 用于有效性的檢查 */ FILE; /* This i
3、s the FILE object */ 定義文件型指針變量 :FILE *fp; fp是一個指向FILE類型結(jié)構(gòu)體的指針變量,可通過該結(jié)構(gòu)體變量中的文件信息能夠訪問該文件。如果有n個文件,一般應(yīng)設(shè)n個指針變量(指向FILE類型結(jié)構(gòu)體的指針變量),使它們指向n個文件,以實現(xiàn)對文件的訪問。 11.3 文件的打開與關(guān)閉文件的打開(fopen函數(shù)) fopen 函數(shù)的調(diào)用方式: FILE *fopen(文件名,使用文件方式); fp=fopen(文件名,使用文件方式); Eg: fp=fopen(“a1”,”r”); 三點信息: (1)需要打開的文件名. (2)使用文件的方式. (3)用一個指針變量
4、指向該文件.使用文件方式表 文件的關(guān)閉(fclose函數(shù)) fclose函數(shù)的調(diào)用方式:fclose (文件指針);注意: 應(yīng)養(yǎng)成在程序終止之前關(guān)閉所有使用的文件的習慣,否則丟失數(shù)據(jù). fclose 函數(shù)的返回值:正常關(guān)閉為0. 11.4 文件的讀寫1.fputc 函數(shù)一般形式: fputc(ch, fp); 功能:將一個字符寫到磁盤文件上去 參數(shù): ch要輸出的字符 fp文件指針 返回值:調(diào)用成功時返回輸出的字符。 調(diào)用失敗時返回 EOF(-1)對于fputc函數(shù)的使用也要說明幾點:(1)被寫入的文件可以用、寫、讀寫,追加方式打開,用寫或讀寫方式打開一個已存在的文件時將清除原有的文件內(nèi)容,寫
5、入字符從文件首開始。如需保留原有文件內(nèi)容,希望寫入的字符以文件末開始存放,必須以追加方式打開文件。被寫入的文件若不存在,則創(chuàng)建該文件。(2)每寫入一個字符,文件內(nèi)部位置指針向后移動一個字節(jié)。(3)fputc函數(shù)有一個返回值,如寫入成功則返回寫入的字符, 否則返回一個EOF??捎么藖砼袛鄬懭胧欠癯晒??!纠?0.1】從鍵盤輸入一行字符,寫入一個文件, 再把該文件內(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);功能:從指定文件讀入一個字符,該文件必須是以讀或讀寫方式打開參數(shù): fp文件指針 返回值:調(diào)用成功時返回讀入的字符 賦給ch 文件結(jié)束時返回文件結(jié)束符返回 EOF(-1)從磁盤文件順序讀入字符并在屏幕上顯示出來:#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ù)功能是從指定的文件中讀一個字符串到字符數(shù)組中。函數(shù)調(diào)用的形式為: fgets(字符數(shù)組名,n,文件指針); 其中的n是一個正整數(shù)。表示從文件中讀出的字符串不超過 n-1個字符。在讀入的最后一個字符后加上串結(jié)束標志0。例如:fgets(str,n,fp);其意義是從fp所指的文件中讀出n-1個字符送入字符數(shù)組str中。對fgets函數(shù)有兩點說明:(1)在讀出n-1個字符之前,如遇到了換行符或EOF,則讀出結(jié)束。(2)fgets函數(shù)也有返回值,其返回值是字符數(shù)組的首地址?!纠?0.3】從
9、c:file1.txt文件中讀入一個含10個字符的字符串。 #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.寫字符串函數(shù)fputsfputs函數(shù)的功能是向指定的文件寫入一個字符串,其調(diào)用形式為:fputs(字符串,文件指針)
10、 其中字符串可以是字符串常量,也可以是字符數(shù)組名,或指針變量。例如:fputs(“1234“,fp);其意義是把字符串“1234”寫入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); 說明:buffer:是指針, 對 fread,是讀入數(shù)據(jù)的存放地址. 對fwrite,是要輸出
11、數(shù)據(jù)的地址. size:要讀寫的字節(jié)數(shù). count:要進行讀寫多少個size字節(jié)的數(shù)據(jù)項 fp:文件型指針. 此兩種函數(shù)一般用于二進制文件的輸入輸出.把一個實數(shù)寫到磁盤文件中去: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個學生的數(shù)據(jù),按上面的結(jié)構(gòu)存入磁盤文件中,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進制文件的存取。比如用 fread(buffer, size, count, stdin); 從鍵盤讀入數(shù)據(jù)。如鍵盤 輸入:Zhang 1001 19 room_12 會出錯。#include stdio.h #define SIZE 3 struct student_type char num8; char name10; char addr10; studSIZE;void save( ) /*保存到磁盤*/ 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ù)的讀寫對象不是終端而是磁盤文件.一般調(diào)用方式: fp
14、rintf(文件指針,格式字符串,輸出表列); fscanf(文件指針,格式字符串,輸出表列); 說明:這兩種函數(shù)對磁盤文件讀寫,使用方便,易理解. 但輸入輸出需要轉(zhuǎn)化,因此,在內(nèi)存與磁盤頻繁交換數(shù)據(jù)的情況下,最好用fread和fwrite函數(shù).例如:fscanf(fp,%d%s,&i,&s);/*從磁盤文件中將數(shù)據(jù)讀入到將整型變量i和實型變量s中*/ fprintf(fp,%d%c,j,ch);/*將整型變量i和字符型變量ch的值輸出到fp所指向的文件中*/【例10.7】從鍵盤輸入三個學生數(shù)據(jù),寫入一個文件中, 再讀出這三個學生的數(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文件的定位文件位置指針控制文件的順序讀寫。一般在文件打開時,位置指針在文件開頭,隨著讀寫的字節(jié)數(shù)向后移動。(按追加方式打開時,位置指針在文件的末尾。)11.5.1 rewind函數(shù)使位置指針重新返回文件的開 頭,此函數(shù)無返回值.例10.4 有一個磁盤文件,第一次將它的內(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ù)和隨機讀寫 fseek函數(shù)可以實現(xiàn)改變文件的位置指針. 調(diào)用方式: fseek(文件類型指針,位移量,起始點) 其中:“文件指針”指向被移動的文件。 “位移量”表示移動的字節(jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長度大于64K
18、B 時不會出錯。當用常量表示位移量時,要求加后綴“L”?!捌鹗键c”表示從何處開始計算位移量,規(guī)定的起始點有三種:文件首,當前位置和文件尾。其表示方法如表10.2。10-2 起始點表示方式表起始點表示符號數(shù)字表示文件首SEEKSET0當前位置SEEKCUR1文件末尾SEEKEND2例如:fseek(fp,10L,0);其意義是把位置指針移到離文件首10個字節(jié)處。fseek(fp,10L,1); 其意義是把位置指針移到離當前位置10個字節(jié)處。fseek(fp,-10L,2); 其意義是把位置指針從文件末尾處向后退10個字節(jié)。【例10.8】在學生文件c:file_3.txt中讀出第二個學生的數(shù)據(jù)。(
19、說明文件的隨機讀寫)#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ù):得到當前文件指針位置.其調(diào)用形式為:long ftell(文件指針);返回文件位置指針的當前位置(用相對于文件頭的位移量表示), 如果返回值為-1L,則表明調(diào)用出錯。例如: offset=ftell(fp); if(offset=-1L)printf(“ftell() errorn”);(1)文件結(jié)束檢測函數(shù)feof函數(shù)調(diào)用格式: feof(文件指針);功能:判斷文
21、件是否處于文件結(jié)束位置,如文件結(jié)束,則返回值為1,否則為0。(2)讀寫文件出錯檢測函數(shù)ferror函數(shù)在調(diào)用輸入輸出庫函數(shù)時,如果出錯,除了函數(shù)返回值有所反映外,也可利用ferror()函數(shù)來檢測。調(diào)用格式: ferror(文件指針);功能:檢查文件在用各種輸入輸出函數(shù)進行讀寫時是否出錯。如果函數(shù)返回值為0,表示未出錯;如果返回一個非0值,表示出錯。對同一文件,每次調(diào)用輸入輸出函數(shù)均產(chǎn)生一個新的ferror()函數(shù)值。因此在調(diào)用了輸入輸出函數(shù)后,應(yīng)立即檢測,否則出錯信息會丟失。在執(zhí)行fopen()函數(shù)時,系統(tǒng)將ferror()的值自動置為0。 11.6 出錯的檢測(3)文件出錯標志和文件結(jié)束標
22、志置0函數(shù)clearerr函數(shù)調(diào)用格式: clearerr(文件指針);功能:將文件錯誤標志(即ferror()函數(shù)的值)和文件結(jié)束標志(即feof()函數(shù)的值)置為0。 對同一文件,只要出錯就一直保留,直至遇到clearerr()函數(shù)或rewind()函數(shù),或其它任何一個輸入輸出庫函數(shù)?!纠?0.3】把一個磁盤文件中的信息復(fù)制到另一個磁盤文件中。方法一:在main()中完成磁盤文件名稱的輸入,然后處理。 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ù)中的前一個文件名標識的文件, 復(fù)制到后一個文件名標識的文件中, 如命令行中只有一個文件名則把該文件寫到標準輸出文件(顯示器)中。#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文件使用方式對照表文件使用方式意義rt 只讀。打開一個文本文件,只允許讀數(shù)據(jù)wt只寫。打開或建立一個文本文件,只允許寫數(shù)據(jù)at追加。打開一個文本文件,并在文件末尾寫數(shù)據(jù)rb只讀。打開一個二進制文件,只允許讀數(shù)據(jù)wb只寫。打開或建立一個二進制文件,只允許寫數(shù)據(jù)ab追加。打開一個二進制文件,并在文件末尾寫數(shù)據(jù)rt+讀寫。打開一個文本文件,允許讀和寫wt+讀寫。打開或建立一個文本文件,允許讀寫at+讀寫。打開一個文本文件,允許讀,或在文件末追加數(shù)據(jù)rb+讀寫。打開一個二進制文件,允許讀和寫wb+讀寫。打開或建立一個二進制文件,允許讀和寫ab+讀寫。打開一個二進制文件,允許讀,或在文件末追加數(shù)據(jù) 說明:(1)用“r”方式打開的文件必須已存在且只能讀出,不能打開并不存在的文件.(2)用“w”
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版農(nóng)貿(mào)場品牌形象設(shè)計合同4篇
- 2025年滬教版九年級歷史下冊月考試卷
- 2025年浙教版選擇性必修2生物下冊階段測試試卷
- 二零二五年度綠色農(nóng)業(yè)合作社股權(quán)投資合同4篇
- 二零二五年度木材產(chǎn)品出口退稅代理服務(wù)合同3篇
- 2025年度智能家居門系統(tǒng)安裝及售后服務(wù)合同范本4篇
- 二零二五年度鄉(xiāng)村旅游資源承包經(jīng)營合同4篇
- 2025年度密封膠產(chǎn)品回收與循環(huán)利用合同2篇
- 2025年度門頭房屋租賃合同附帶商業(yè)活動策劃執(zhí)行4篇
- 2025版智能鎖與木門集成系統(tǒng)銷售合同范本4篇
- 提高靜脈留置使用率品管圈課件
- GB/T 10739-2023紙、紙板和紙漿試樣處理和試驗的標準大氣條件
- 《心態(tài)與思維模式》課件
- 物流服務(wù)項目的投標書
- C語言程序設(shè)計(慕課版 第2版)PPT完整全套教學課件
- 行業(yè)會計比較(第三版)PPT完整全套教學課件
- 值機業(yè)務(wù)與行李運輸實務(wù)(第3版)高職PPT完整全套教學課件
- 高考英語語法填空專項訓練(含解析)
- 危險化學品企業(yè)安全生產(chǎn)標準化課件
- 《美的歷程》導(dǎo)讀課件
- 心電圖 (史上最完美)課件
評論
0/150
提交評論