第13章 文件3.ppt_第1頁
第13章 文件3.ppt_第2頁
第13章 文件3.ppt_第3頁
第13章 文件3.ppt_第4頁
第13章 文件3.ppt_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第十三章 文 件,13.1 概述,一、文件,定義:指存儲(chǔ)在磁盤、磁帶等外設(shè)上的數(shù)據(jù)的集合。,二、數(shù)據(jù)的輸入和輸出,1、終端 從鍵盤輸入數(shù)據(jù),運(yùn)行結(jié)果在顯示器輸出 2、磁盤文件 從磁盤文件讀入數(shù)據(jù),結(jié)果寫入磁盤文件,三、C 語言文件,C 文件:是由一連串的字符(字節(jié))的數(shù)據(jù)組成(流式文件)。,數(shù)據(jù)組織形式:ASCII 文件(字節(jié)流) 二進(jìn)制文件(二進(jìn)制流) C語言對(duì)文件的存取是以字符(字節(jié))為單位,四、文件處理方法,1、緩沖文件系統(tǒng):指系統(tǒng)自動(dòng)地在內(nèi)存區(qū)為每 一個(gè)正在使用的文件名開辟一個(gè)緩沖區(qū)。 ANSI C 標(biāo)準(zhǔn)采用 2、非緩沖文件系統(tǒng):指系統(tǒng)不自動(dòng)開辟確定大小的緩沖區(qū),由程序?yàn)槊總€(gè)文件設(shè)定緩

2、沖區(qū)。,五、文件的讀寫,采用庫函數(shù)實(shí)現(xiàn),13.2 文件類型指針,一、文件的結(jié)構(gòu)體類型,系統(tǒng)定義的結(jié)構(gòu)體類型:(在stdio.h中) typedef struct int -fd; /* 文件號(hào) */ int -cleft; /* 緩沖區(qū)中剩下的字符 */ int -mode; /* 文件操作模式 */ char * -nextc; /* 下一個(gè)字符模式 */ char * -buff; /* 文件緩沖區(qū)位置 */ FILE;,被使用文件的有關(guān)信息保存在文件的結(jié)構(gòu)體類型的變量中。,二、定義文件型指針變量,FILE *fp;,使fp指向某個(gè)文件的結(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ù)若不能實(shí)現(xiàn)“打開”任務(wù),則返回一個(gè)出錯(cuò)信息。常用方法: 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 從鍵盤輸入一些字符,并輸出到磁盤,直到輸入一個(gè)“#”為止。 #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); 運(yùn)行如下: file1.c (輸入磁盤文件名) computer and c# (輸入一個(gè)字符串) computer and c (輸出一個(gè)字符串),驗(yàn)證 file1.c文件中的內(nèi)容: C type file.c computer and c,例

6、13.2 將一個(gè)磁盤文件中的信息復(fù)制到另一個(gè)磁盤文件中。 #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); ,運(yùn)行如下: Enter the infile name : file1.c (輸入原有磁盤文件名) Enter the outfile name : file2.c (輸入新復(fù)制的磁盤文件名) 驗(yàn)證結(jié)果: C type file1.c computer and c (file1.c中的信息) C type file2.c

8、computer and c (file2.c中的信息),可利用main函數(shù)的參數(shù),在輸入命令行時(shí)輸入兩個(gè)文件名, 程序改為:,程序文件名: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ù)項(xiàng) fwrite (buffer,size,count,fp); 把數(shù)據(jù)項(xiàng)寫到指定文件,fread、fwrite調(diào)用成功 函數(shù)返回值=count的值,例 13.3 從鍵盤輸入4個(gè)學(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”,, 運(yùn)行如下: 輸入4個(gè)學(xué)生的姓名、學(xué)號(hào)、年齡和地址: zhang 1001 19 room_101 fun 1002 20 room_102 tan 1003 21 room_103 ling 1004 21 room_104,驗(yàn)證磁盤文件“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( 運(yùn)行結(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)定義) 功能:對(duì)磁盤文件讀寫一個(gè)字(整數(shù)) 如: putw(10,fp); 將整數(shù)10輸出到fp所指的文件 i=getw(fp); 從fp所指文件讀一個(gè)整數(shù)賦給i,2、讀寫其它類型數(shù)據(jù) ANCI C提供的fread和fwrite函數(shù),可方便讀寫任何類型數(shù)據(jù)。 用戶也可自己定義所需函數(shù)。,例:定義函數(shù)putfloat : 向磁盤文

14、件寫一個(gè)實(shí)數(shù)(用二進(jìn)制方式) putfloat( num,fp) float num; FILE *fp; char *s; int count; s= 同理,可編寫讀寫任何類型數(shù)據(jù)的函數(shù),3、fgets函數(shù)和fputs函數(shù) fgets :從指定文件讀入一個(gè)字符串 fputs:向指定文件輸出一個(gè)字符串 如: fgets(str,n,fp); 從fp所指文件輸入n-1個(gè)字符,在最后 加一個(gè)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、量, 起始點(diǎn)),fseek函數(shù)一般用于二進(jìn)制文件,如: fseek(fp,100L,0); 位置指針移到離文件頭100個(gè)字節(jié)處 fseek(fp,50L,1);位置指針移到離當(dāng)前位置50個(gè)字節(jié)處 fseek(fp,-10L,2);位置指針從文件尾向后退10個(gè)字節(jié),例13.5 磁盤文件上存有10個(gè)學(xué)生的數(shù)據(jù)。要求將 第1、3、5、7、9個(gè)學(xué)生數(shù)據(jù)輸入計(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 文件的出錯(cuò),一、ferror函數(shù),二、clearerr函數(shù),clearerr(fp); 使文件錯(cuò)誤標(biāo)志和文件結(jié)束標(biāo)志 置為0 此時(shí),ferror(fp)的值為0,13.7 非緩沖文件系統(tǒng),不屬于A

18、NSI C標(biāo)準(zhǔn),緩沖I/O系統(tǒng): 高級(jí)I/O系統(tǒng) 系統(tǒng)提供文件緩沖區(qū) 通過文件指針訪問文件,非緩沖I/O系統(tǒng): 低級(jí)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個(gè)字符到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個(gè)字符,然后輸出到磁盤文件“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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論