




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第十三章 文 件,13.1 概述,一、文件,定義:指存儲在磁盤、磁帶等外設(shè)上的數(shù)據(jù)的集合。,二、數(shù)據(jù)的輸入和輸出,1、終端 從鍵盤輸入數(shù)據(jù),運行結(jié)果在顯示器輸出 2、磁盤文件 從磁盤文件讀入數(shù)據(jù),結(jié)果寫入磁盤文件,三、C 語言文件,C 文件:是由一連串的字符(字節(jié))的數(shù)據(jù)組成(流式文件)。,數(shù)據(jù)組織形式:ASCII 文件(字節(jié)流) 二進(jìn)制文件(二進(jìn)制流) C語言對文件的存取是以字符(字節(jié))為單位,四、文件處理方法,1、緩沖文件系統(tǒng):指系統(tǒng)自動地在內(nèi)存區(qū)為每 一個正在使用的文件名開辟一個緩沖區(qū)。 ANSI C 標(biāo)準(zhǔn)采用 2、非緩沖文件系統(tǒng):指系統(tǒng)不自動開辟確定大小的緩沖區(qū),由程序為每個文件設(shè)定緩
2、沖區(qū)。,五、文件的讀寫,采用庫函數(shù)實現(xiàn),13.2 文件類型指針,一、文件的結(jié)構(gòu)體類型,系統(tǒng)定義的結(jié)構(gòu)體類型:(在stdio.h中) typedef struct int -fd; /* 文件號 */ int -cleft; /* 緩沖區(qū)中剩下的字符 */ int -mode; /* 文件操作模式 */ char * -nextc; /* 下一個字符模式 */ char * -buff; /* 文件緩沖區(qū)位置 */ FILE;,被使用文件的有關(guān)信息保存在文件的結(jié)構(gòu)體類型的變量中。,二、定義文件型指針變量,FILE *fp;,使fp指向某個文件的結(jié)構(gòu)體變量并訪問該文件,13.3 文件的打開與關(guān)閉,
3、文件讀寫前:打開文件 使用結(jié)束后:關(guān)閉文件,一、文件的打開 (fopen 函數(shù)),FILE *fp; fp = fopen(“A1”,“r”);,使用文件方式詳見表 12.1, P270 “r” 只讀文本文件(打開的文件必須已存在) “w” 只寫文本文件(若文件不存在則新建立) “rb” 只讀二進(jìn)制文件 “wb” 只寫二進(jìn)制文件 ,fopen函數(shù)若不能實現(xiàn)“打開”任務(wù),則返回一個出錯信息。常用方法: if ( (fp = fopen(“file1”,”r”) = NULL) printf(“ cannot open this file n”); exit (0); ,二、 文件的關(guān)閉 ( fc
4、lose 函數(shù)),fclose ( fp ); 關(guān)閉 fp 所指向的文件,12.4 文件的讀寫,一、fputc 函數(shù)和fgetc函數(shù) (putc函數(shù)和getc函數(shù)),例:從磁盤文件順序讀入字符并顯示在屏幕上 ch=fgetc(fp); 或 while ( ! feof(fp) ) while (ch!=EOF) ch=fgetc(fp); putchar(ch); putchar(ch); ch=fgetc(fp); ,例 13.1 從鍵盤輸入一些字符,并輸出到磁盤,直到輸入一個“#”為止。 #include “stdio.h” main() FILE *fp; char ch,filenam
5、e10; scanf(“%s”,filename); if(fp=fopen(filename,”w”)=NULL) printf(“cannot open filen”); exit(0); ,ch=getchar(); while(ch!=#) fputc(ch,fp);putchar(ch); ch=getchar(); fclose(fp); 運行如下: file1.c (輸入磁盤文件名) computer and c# (輸入一個字符串) computer and c (輸出一個字符串),驗證 file1.c文件中的內(nèi)容: C type file.c computer and c,例
6、13.2 將一個磁盤文件中的信息復(fù)制到另一個磁盤文件中。 #include “stdio.h” main( ) FILE *in, *out; char ch, infile10, outfile10; printf(“ Enter the infile name: n”); scanf(“ %s “,infile); printf(“Enter the outfile name: n”); scanf(“ %s “,outfile);,if ( in=fopen(infile, “r”)=NULL) printf (“cannot open infilen”); exit(0); if (o
7、ut=fopen(outfile, “w”)=NULL) printf (“cannot open outfilen”); exit(0); while ( !feof(in) fputc(fgetc(in),out); fclose (in); fclose(out); ,運行如下: Enter the infile name : file1.c (輸入原有磁盤文件名) Enter the outfile name : file2.c (輸入新復(fù)制的磁盤文件名) 驗證結(jié)果: C type file1.c computer and c (file1.c中的信息) C type file2.c
8、computer and c (file2.c中的信息),可利用main函數(shù)的參數(shù),在輸入命令行時輸入兩個文件名, 程序改為:,程序文件名:exam12_2.c #include “stdio.h” main( argc,argv) int argc; char *argv ; FILE *in, *out; char ch; if (argc!=3) printf(“You forgot to enter a filenamen”); exit(0); if (in=fopen(argv1,”r”)=NULL) printf(“ cannot open infilen”); exit(0);
9、 ,if (out=fopen(argv2,”w”)=NULL) printf(“ cannot open outfilen”); exit(0); while(!feof(in) fputc(fgetc (in),out); fclose(in); fclose(out); ,二、fread函數(shù)和 fwrite函數(shù),fread (buffer,size,count,fp); 從指定文件讀取數(shù)據(jù)項 fwrite (buffer,size,count,fp); 把數(shù)據(jù)項寫到指定文件,fread、fwrite調(diào)用成功 函數(shù)返回值=count的值,例 13.3 從鍵盤輸入4個學(xué)生的有關(guān)數(shù)據(jù),然后把它
10、 們轉(zhuǎn)存到磁盤文件上去。 #include “stdio.h” #define SIZE 4 struct student_type /* student_type結(jié)構(gòu)體變量 char name10; 的長度=29字節(jié) */ int num; int age; char addr15; stud SIZE; void save ( ) FILE *fp;,int i; if ( fp=fopen(“stu_list”,”wb”)=NULL) printf(“cannot open filen”); return; for (i=0;iSIZE;i+) if( fwrite( main( ),i
11、nt i; for(i=0;iSIZE;i+) scanf(“%s%d%d%s”,, 運行如下: 輸入4個學(xué)生的姓名、學(xué)號、年齡和地址: zhang 1001 19 room_101 fun 1002 20 room_102 tan 1003 21 room_103 ling 1004 21 room_104,驗證磁盤文件“stu_list”中數(shù)據(jù),程序如下: #include “stdio.h” #define SIZE 4 struct student_type char name10; int num; int age; char addr15; studSIZE;
12、main( ) int i;,FILE *fp; fp=fopen(“stu_list”,“rb”); for(i=0;iSIZE;i+) fread( 運行結(jié)果: zhang 1001 19 room_101 fun 1002 20 room_102 tan 1003 21 room_103 ling 1004 21 room_104,fread和fwrite是按數(shù)據(jù)塊的長度來處理,故一般用于二進(jìn)制文件的輸入輸出,三、fprintf函數(shù)和fscanf函數(shù),fprintf (文件指針,格式字符串,輸出列表); 按格式將數(shù)據(jù)輸出到指定文件 fscanf ( 文件指針,格式字符串,輸入列表); 從
13、指定文件按格式輸入數(shù)據(jù),如: fprintf( fp,”%d,%6.2f”,i,t);,fscanf( fp,”%d,%f ”,fscanf和fprintf是按數(shù)據(jù)格式處理,故一般 用于文本文件的輸入輸出,三、其它讀寫函數(shù),1、putw和getw函數(shù)(非ANSI C標(biāo)準(zhǔn)定義) 功能:對磁盤文件讀寫一個字(整數(shù)) 如: putw(10,fp); 將整數(shù)10輸出到fp所指的文件 i=getw(fp); 從fp所指文件讀一個整數(shù)賦給i,2、讀寫其它類型數(shù)據(jù) ANCI C提供的fread和fwrite函數(shù),可方便讀寫任何類型數(shù)據(jù)。 用戶也可自己定義所需函數(shù)。,例:定義函數(shù)putfloat : 向磁盤文
14、件寫一個實數(shù)(用二進(jìn)制方式) putfloat( num,fp) float num; FILE *fp; char *s; int count; s= 同理,可編寫讀寫任何類型數(shù)據(jù)的函數(shù),3、fgets函數(shù)和fputs函數(shù) fgets :從指定文件讀入一個字符串 fputs:向指定文件輸出一個字符串 如: fgets(str,n,fp); 從fp所指文件輸入n-1個字符,在最后 加一個0存入字符數(shù)組str中 fputs(“China”,fp); 將“China”輸出到fp所指文件,13.5 文件的定位,一、rewind 函數(shù),文件的位置指針:指向當(dāng)前讀寫的位置,例 12.4 將一磁盤文件顯示
15、在屏幕上,然后把它復(fù)制到另一文件中。 #include “stdio.h” main( ) FILE *fp1,*fp2; fp1=fopen(“file1.c”,”r”); fp2=fopen(“file2.c”,”w”); while(!feof(fp1) putchar(getc(fp1);,功能:使位置指針重新返回文件的開頭,rewind(fp1); /* 使file1.c位置指針重定位于文件頭*/ while(!feof(p1) putc(getc(fp1),fp2); fclose(fp1);fclose(fp2); ,二、fseek函數(shù)和隨機(jī)讀寫,fseek (文件類型指針,位移
16、量, 起始點),fseek函數(shù)一般用于二進(jìn)制文件,如: fseek(fp,100L,0); 位置指針移到離文件頭100個字節(jié)處 fseek(fp,50L,1);位置指針移到離當(dāng)前位置50個字節(jié)處 fseek(fp,-10L,2);位置指針從文件尾向后退10個字節(jié),例13.5 磁盤文件上存有10個學(xué)生的數(shù)據(jù)。要求將 第1、3、5、7、9個學(xué)生數(shù)據(jù)輸入計算機(jī),并在屏幕上顯示。 #include “stdio.h” struct student_type char name10; int num; int age; char sex; stud10;,main( ) int i; FILE *fp;
17、 if(fp=open(“stud_dat”,”rb”)=NULL) printf(“cannot open filen”); exit(0); for (i=0;i10;i+=2) fseek(fp,i*sizeof(struct student_type),0); fread( ,三、ftell函數(shù),如: i=ftell(fp); if(i=-1L) printf(“errorn”);,13.6 文件的出錯,一、ferror函數(shù),二、clearerr函數(shù),clearerr(fp); 使文件錯誤標(biāo)志和文件結(jié)束標(biāo)志 置為0 此時,ferror(fp)的值為0,13.7 非緩沖文件系統(tǒng),不屬于A
18、NSI C標(biāo)準(zhǔn),緩沖I/O系統(tǒng): 高級I/O系統(tǒng) 系統(tǒng)提供文件緩沖區(qū) 通過文件指針訪問文件,非緩沖I/O系統(tǒng): 低級I/O系統(tǒng) 自己設(shè)定緩沖區(qū) 用整數(shù)表示文件,一、 open函數(shù),open (“Li_1”,0); 打開Li_1文件且只用于輸入,一般用法: if(fd=open(“A”,1)= -1) printf(“cannot open filen”); exit(0); ,二、close 函數(shù),close (fp); 關(guān)閉已打開的文件,三、creat 函數(shù),fd=creat(“A”,1); 建立新文件,四、read 函數(shù),read(fd,buf,count);,例13.6 從“a1”文件中
19、讀50個字符到buffer 數(shù)組 并顯示該字符串。 main() int fd; char buffer50; /* bufffer為設(shè)定的緩沖區(qū) */ if(fd=open(“a1”,0)=-1) printf(“cannot open filen”); exit(0); if(read(fd,buffer,50)!=50) printf(“read error”); printf(“%sn”,buffer); close(fd); ,五、write 函數(shù),write(fd,buf,count);,例13.7 從終端鍵盤讀入50個字符,然后輸出到磁盤文件“a1”中。 main( ) int
20、fd; char buffer50; if(fd=creat(“a1”,1)=-1) /* 建立新文件“a1”*/ printf(“cannot open filen”); exit(0); gets(buffer); /* 從鍵盤讀入字符串*/ if(write(fd,buffer,50)!=50) printf(“write error”); close(fd); ,例13.8從鍵盤讀入若干行文字串,并將它們寫到磁盤文件中,然后再從文件讀入內(nèi)存,在屏幕上顯示。 #include “stdio.h” #define COUNT 80 main() /* 用非緩沖I/O系統(tǒng)輸入輸出 */ char bufCOUNT; int fd1,fd2; if(fd1=open(“A”,1)=-1) /*打開A文件,寫入*/ printf(“connot open filen”); exit(0); input(buf,fd1); /* 執(zhí)行input函數(shù),從鍵盤讀 入數(shù)據(jù)并寫到文件“A”中*/,close(fd1); if (fd2=open(“A”,0
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廠礦消防知識培訓(xùn)
- 云南省峨山彝族自治縣高中生物 第五章 細(xì)胞的能量供應(yīng)和利用 5.4.2 影響光合作用因素教學(xué)設(shè)計 新人教版必修1
- 隔物灸產(chǎn)品培訓(xùn)
- 多媒體信息技術(shù)與教學(xué)融合的培訓(xùn)成果
- 一年級語文上冊 第一單元 1 天地人配套教學(xué)設(shè)計 新人教版
- 九年級化學(xué)下冊:第10單元 課題1 常見的酸和堿教學(xué)設(shè)計
- 人教部編版七年級歷史上冊 第12課《漢武帝鞏固大一統(tǒng)王朝》教學(xué)設(shè)計
- 安全教育培訓(xùn)總結(jié)
- 藥理學(xué)練習(xí)試題及答案
- 2024分析技術(shù)考試-環(huán)保檢測練習(xí)卷附答案
- 2024年鄭州軌道工程職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫參考答案
- 2024年四川省成都市龍泉驛區(qū)中考數(shù)學(xué)二診試卷(含答案)
- (2024版)機(jī)動車查驗員理論知識考試題庫及答案
- 鐵路機(jī)務(wù)知識培訓(xùn)課件
- 人工智能在制造業(yè)中的應(yīng)用2024年智能工廠的新范式
- 2024智能AI中臺白皮書
- 《萬以內(nèi)數(shù)的認(rèn)識》大單元整體設(shè)計
- 鋁加工(深井鑄造)企業(yè)重點事項解讀(米)
- 幼兒游戲與社會性的發(fā)展
- (醫(yī)學(xué)課件)特應(yīng)性皮炎
- 2024年安徽合肥文旅博覽集團(tuán)招聘筆試參考題庫含答案解析
評論
0/150
提交評論