1、第九章 文 件,9.1 文件的概念,文件概念: 文件是一组存储在外部介质上的数据的集合,用文件名标识。广义地讲,输入/出设备都可理解成文件。分为磁盘文件(用户命名)和设备文件(系统命名。见p259表9-2)。,文件优点: 输入和保存大容量数据(可超过内存容量)。 数据永久保存在外存中成为共享数据。,磁盘文件的操作步骤,打开文件,指向由系统自动建立的一个该文件基本信息的结构变量。,读写文件,关闭文件,释放文件所占的资源。,定义文件指针,读写方式:,顺序读写:按顺序向后读写。随机读写:给定位置读写。,1、文件的分类:,存储形式:,二进制文件:按数据在内存存储形式。文本 (ASCII)文件:一个字符
2、占一个字节。,处理方法:,缓冲文件。非缓冲文件。,Device,内存,Buffer,匹配主机与外设速度,提高数据传送效率。,例:整数123: ASCII码:00110001 00110010 00110011 1 (49) 2 ( 50) 3 (51)二进制码:00000000 01111011 123 (二进制补码),在缓冲文件系统中,每个被使用的文件的信息(如文件名、文件存放地址、字节数、状态等)都保存在一个结构类型的变量中(由系统定义) 。该结构用户定义名为:FILE,可以定义一个指向FILE类型的结构指针,打开文件是让该指针指向文件对应的结构变量,通过指针对文件进行操作。,文件指针定义
3、格式: FILE *fp;,9.2 文件类型指针,typedef struct int _fd; /*文件号 */ int _mode; /*文件读写方式 */ char *_buff; /*文件存放位置 */ FILE,9.3 文件的打开与关闭,文件的打开函数 fopen( ),文件打开和关闭函数的原型均包含在头文件stdio.h中。,格式:,FILE *fp ;fp = fopen( filename , mode ) ;,字符型指针,要打开的文件名或设备名。,字符型指针,文件的读写方式。,文件信息结构的指针。,fp=fopen(“e:wang.dat”,”r+”);,说明:,函数返回文件
4、的起始地址。fopen失败,则返回空指针NULL;,当文件打开失败时,程序无法执行,一般以下列方式打开文件:,if ( fp=fopen( filename , mode ) =NULL ) printf ( “File Open Error! n” ) ;exit (1) ;,终止程序,返回操作系统。,文件的读写方式(mode)说明(见p256表9-1):, 文件的关闭函数 fclose( ),文件使用完必须关闭,关闭文件的目的是:,保证文件的数据不丢失,将buffer的数据回写文件。,释放buffer。,格式:,fclose(文件指针);,FILE *fp;fp=fopen(“a:d.da
5、t”,”w+”);/* 文件的读写 */fclose(fp);,如果关闭正确fclose返回0;关闭失败fclose 返回非0。,断开指针与文件的联系。,9.4 文件的读写,文件打开后,可通过 系统定义的标准函数对文件进行读/写。该函数的原型均包含在头文件stdio.h中。,9.4.1 字符输入/输出函数,1、字符输出函数 fputc( ),格式: fputc (ch , fp ) ;,功能:将字符ch写入文件指针对应的文件的当前位置。,返回值:写入正确返回ch的值;失败返回EOF(系统定义的宏,在stdio.h中定义为-1)。,2、字符输入函数 fgetc( ),格式: ch = fgetc
6、 ( fp ) ; /*ch为字符型变量*/,功能:从文件指针fp对应的可读文件的当前位置读一个字符。 返回值:正确读出值赋ch。出错或读到文件尾,返回EOF。,3、文件结束函数 feof( ),格式:i=feof (fp) ;,功能:判断文件是否结束。,返回值:1 代表文件结束; 0 代表文件未结束。,见 L91.c、 P2181.c 、 L111.c,例:将一个文件中的数据拷贝到另一个文件中去(简化L91),常用设备文件:stdprn 打印机;stdin 键盘; stdout 显示器。,#include #include void main() char ch; FILE *in,*out
7、; in=fopen(e3-2.c,r); out=fopen(e333.c,w); while( feof(in)=0 ) ch=fgetc(in); fputc(ch,out); /*putchar(ch)*/ fclose(in); fclose(out);,#include void main ( int argc,char *argv ) FILE *in , *out ; if(argc!=3)printf(“Command format error!n”);exit(0); if ( in=fopen ( argv1 , “r” ) = NULL ) printf (“canno
8、t open the infile n ”) ; exit (0) ; if ( ( out = fopen (argv2 , “w” ) = NULL ) printf (“cannot open the outfile n”) ; exit (0) ; while ( !feof (in) fputc (fgetc(in) , out ) ; fclose (in) ; fclose (out) ;,打开源文件,打开目标文件,若源文件不是结束标志,读一个字符写入目标文件。,关闭文件,chp8ex1,举例:将一个磁盘文件中的内容复制到另一个文件中。,见L91.c、 P2181.c 、 L11
9、1.c,9.4.2 文件的字符串的输入和输出函数,1、字符串输入函数 fgets( ),使用方法: fgets(str , n , fp);,功能:从fp所对应的文件的当前位置读n-1 个字符到str所指向的内存单元。并在结束处加0表示字符串结束。,三种情况可以使输入结束:输入完n-1个字符;输入时遇到n;输入时遇到文件结束标志。,2、字符串输出函数 fputs( ),使用方法: fputs(str , fp);,功能:将str指向的字符串输出到fp所对应的文件中,并忽略输出字符串结束标志0。 返回值:调用成功,返回值为0,调用失败,返回EOF,返回值:调用成功,返回str首址,调用失败或遇文
10、件结束标志,返回NULL。,#include #include #define SIZE 256void main ( int argc , char *argv ) char buffSIZE ; FILE *fpr,*fpw ; fpw=stdprn ; if( fpr = fopen ( argv1 , “r” ) = NULL ) printf ( “File open error!n ” ) ; exit (0) ; while (fgets (buff , SIZE , fpr) != NULL ) fputs (buff , fpw ) ;fclose (fpr) ;,打开文件,
11、循环输入字符串到buff。,输出到打印机。,文件指针执行设备:stdprn 打印机;stdaux 串口;stdin 键盘 ; stdout 显示器。,举例:从文件中输入字符串,并打印其内容。,9.4.3 文件的格式化输入和输出函数,fp文件指针format ,格式说明字符串,取%d、%x、%f、%c等;说明输入转化的格式。&arg1&argn,接收输入变量的地址列表。,1、格式化输入函数 fscanf,使用方法: fscanf (fp , format , ,功能:从fp对应的文件的当前位置,顺序读入一个字符序列,按format说明的格式和类型进行转换并存放到对应变量单元。,#include
12、#include void main (void) char s80 ; int a ; FILE *fp ; if ( fp=fopen ( “text.txt” , “r” ) = NULL) printf (“cannot open file “ ) ; exit (0) ; fscanf ( fp , “%s %d “ , s ,chp8ex2,打开文件,输入数据。,例:从text.txt中读字符串和一个十进制数,输出到显示器。,fp文件指针;format ,格式说明字符串,取%d、%x、%f、%c等;说明输出转化的格式。arg1argn,输出量列表。,使用方法: fprintf (
13、fp , format , arg1, arg n ) ;,功能: 以指定的格式(format),将arg1arg n的值,转换为字符序列,写入fp 文件的当前位置。,FILE *fp;fp=fopen(“s.dat”,”w”);fprint(fp,”%d%c”,123,c);fclose(fp);,2、格式化输出函数 fprintf( ),9.4.4 文件的数据块输入/输出函数,buf(空类型指针)接收数据的地址;size(整型)一次读取数据的字节数;count(整型)读取次数;fp对应输入文件的文件指针。,1、fread( )函数,使用方法: fread(buf,size,count,fp
14、);,功能:从 fp 指向的文件的当前位置,每次读取size个字节,共读count 次读入数据,存放到buf指向的内存处。,返回值:,调用正确,返回输入的项数;,调用错误,返回-1(EOF)。,FILE *fp;char str80;fp=fopen(“s.dat”,”r”);fread(str,20,3,fp);,2、fwrite函数,buf(空类型指针)数据的地址;size(整型)一次输出数据的字节数;count(整型)输出次数;fp对应输出文件的文件指针。,使用方法: fwrite(buf,size,count,fp);,功能:从buf 开始,分count次,每次size个字节,向fp对
15、应文件的当前位置写数据。,返回值:,调用正确时,返回 count。,调用错误时,返回 -1(EOF)。,举例:,#include #include void main(void) FILE *stream; char msg = “This is a test“,buf20; stream = fopen(TEST1.DAT, w+); fwrite(msg, strlen(msg)+1, 1, stream); fseek(stream, SEEK_SET, 0); fread(buf, strlen(msg)+1, 1, stream); printf(%sn, buf); fclose(
16、stream);,打开文件。,写数据到文件。,重新定位到文件头。,chp8ex3,9.5 文件的定位操作,以上的所有文件的读写都是顺序的,完成一次读写操作后,文件的记录位置自动指向下一位置,因而称为顺序的流式文件。用户想使用任意的读写 位置,可以通过定位函数实现。,取文件当前位置 ftell函数,long n;n=ftell(fp);,功能:取文件的当前的读写位置(从文件头到当前的字节数)。,返回值(long):,调用正确,返回当前位置域文件都相差的字节数;,调用错误,返回 -1L。,改变文件指针的当前位置 fseek函数,fp文件指针;offset(long int),以from为起点移动的
17、偏移量;from为移动的起始位置。,使用方法: fseek( fp , offset , from) ;,from 在stdio.h中定义了如下常量:,fseek( fp , 50L, SEEK_SET),fp对应文件的当前位置移到文件头50字节处。,置文件于开头位置 rewind( ) 函数,使用方法: rewind(fp);,#include#include#define N 30struct student char name10 ; int no ; int score ; stud N ;void main (void ) int i; FILE *fp ; fp=fopen(“st
18、d.lst” , “rb” ); for ( i=0 ; iN ; i+) fseek ( fp, i*sizeof( struct student ) , 0 ) ; fread (,举例:已知30 个学生的一门课的分数,打印学号为单号学生的分数。,9.6 文件的错误检测,文件读写错误检测函数 ferror。,使用方法: ferror(fp);,功 能:检测文件读写错误。,如果返回值为0,表示无错误。,如果返回值非0,表示有错误。,该标志一旦置位,必须通过清除函数清除!,清除文件错误标志函数 clearerr,使用方法: clearerr(fp);,功 能:清除文件读写错误标志。,举例:,#include void main(void) FILE *stream; stream = fopen(DUMMY.FIL, w); (void) getc(stream); if (ferror(stream) printf(Error reading from DUMMY.FILn); clearerr(stream); fclose(stream);,思考题:,作业题:,p217习题一、选择题 1、2、3、4。二、填空题 1、2。三、程序设计题 1、2。,对文件的打开与关闭的含义是什么?为什么要打开和关闭文件?,