1、12022-5-2422022-5-2432022-5-2442022-5-245例如将整数例如将整数19491949分别存储在这两种数据文件中。分别存储在这两种数据文件中。ASCII文件:文件:ASCII码码二进制文件:补码二进制文件:补码占用占用4个字节个字节占用占用2个字节个字节00000111100111012022-5-246l按按照对文件的处理方照对文件的处理方式式 缓冲文件缓冲文件利用缓冲文件系统处理的文件称为缓冲文件。系统利用缓冲文件系统处理的文件称为缓冲文件。系统处理方法是在内存中处理方法是在内存中为每个正在使用的缓冲文件开辟一为每个正在使用的缓冲文件开辟一个缓冲区个缓冲区,
2、其大小是其大小是512512个字节。现在的标准个字节。现在的标准C C对文件读对文件读写大都采用缓冲文件系统处理。写大都采用缓冲文件系统处理。 非缓冲文件非缓冲文件 利用非缓冲文件系统处理的文件称为非缓冲文件。利用非缓冲文件系统处理的文件称为非缓冲文件。系统处理非缓冲文件时,不为文件开辟缓冲区,需要程系统处理非缓冲文件时,不为文件开辟缓冲区,需要程序员自行设计并管理缓冲区。序员自行设计并管理缓冲区。 2022-5-247 磁盘文件磁盘文件 输出输出 输入输入图图10.2 系统对缓冲文件的处理系统对缓冲文件的处理 输入输入 输出输出程序区程序区数据区数据区文件文件缓冲区缓冲区外存外存内存内存20
3、22-5-248l3 3文件类型指针文件类型指针在在缓冲文件系统缓冲文件系统中,对每个正在使用的文件中,对每个正在使用的文件都自动分配一个都自动分配一个FILEFILE类型的类型的结构体变量结构体变量,用于,用于存放文件的有关信息,如文件号、文件状态、存放文件的有关信息,如文件号、文件状态、缓冲区地址和大小等。缓冲区地址和大小等。ltypedef struct int fd; /*文件描述符文件描述符*/ int cleft; /*缓冲区中剩下的字符缓冲区中剩下的字符*/ int mode; /*文件操作模式文件操作模式*/ char *nextc; /*下一个字符位置下一个字符位置*/ ch
4、ar *buff; /*文件缓冲区位置文件缓冲区位置*/ FILE;2022-5-249l在在C语言中,无论对磁盘文件操作,还是语言中,无论对磁盘文件操作,还是对设备文件的读对设备文件的读/写都要通过写都要通过FILE类型的类型的结构体变量进行。结构体变量进行。l因此对于每个使用中的磁盘文件必须先定因此对于每个使用中的磁盘文件必须先定义一个义一个FILE类型的文件指针变量。类型的文件指针变量。l 文件型指针的定义格式如下:文件型指针的定义格式如下:l FILE *文件指针变量名文件指针变量名;l例:例: FILE *fp1; 或或 FILE *fp5; 2022-5-2410常用的调用形式常用
5、的调用形式: FILE * *fpfp; fp = fopen( fp = fopen(文件名文件名, , 文件使用方式文件使用方式) );文件名文件名:需要打开的文件名称:需要打开的文件名称( (字符串字符串) )。文件使用方式文件使用方式:是具有特定含义的:是具有特定含义的符号符号。函数功能函数功能: 按指定的按指定的文件使用方式文件使用方式打开指定的打开指定的文件文件。 若文件打开若文件打开成功成功,为该文件分配一个文件缓冲区和一个为该文件分配一个文件缓冲区和一个FILEFILE类型变量,类型变量,返回返回一个一个FILEFILE类型类型指针指针; 若文件打开若文件打开失败失败,返回,返
6、回NULL。2022-5-2411l文本文件的三种基本使用方式文本文件的三种基本使用方式”r”:只读方式只读方式 打开一个已存在的打开一个已存在的文本文件。只能读取数据。文本文件。只能读取数据。”w”:只写方式只写方式 打开一个打开一个文本文件。只能写入数据。若文件不存在,文本文件。只能写入数据。若文件不存在,则自动建立一个新文件接收写入的数据;若则自动建立一个新文件接收写入的数据;若文件已存文件已存在在,则,则删除旧文件,删除旧文件,建立一个同名的新文件建立一个同名的新文件 ,接收写,接收写入的数据。入的数据。”a”a”:追加方式追加方式 打开一个已存在的打开一个已存在的文本文件。只能写入数
7、据并追加文本文件。只能写入数据并追加在文件尾部在文件尾部。2022-5-2412”r+r+”:读读写方式写方式 打开一个已存在的文本文件。可以读取数据。也可以写入数打开一个已存在的文本文件。可以读取数据。也可以写入数据。据。”w+w+”:读读写方式写方式 打开一个已存在的文本文件。可以读取数打开一个已存在的文本文件。可以读取数 据。也可以写入据。也可以写入数据。数据。 若文件不存在,则自动建立一个新文件接收写入的数据;若若文件不存在,则自动建立一个新文件接收写入的数据;若文件存在文件存在,则,则删除旧文件,删除旧文件,建立一个同名的新文件建立一个同名的新文件 ,接收写,接收写入的数据。入的数据
8、。”a+a+”:读读写方式写方式 打开一个已存在的文本文件。可以读取数据。也可以追加在打开一个已存在的文本文件。可以读取数据。也可以追加在文件尾部文件尾部。2022-5-2413”rbrb”:读读写方式写方式 打开一个已存在的二进制文件。只能读取数据。打开一个已存在的二进制文件。只能读取数据。l”wbwb”:只写方式只写方式l 打开一个二进制文件。只能写入数据。若文打开一个二进制文件。只能写入数据。若文件不存在,则自动建立一个新文件接收写入的件不存在,则自动建立一个新文件接收写入的数据;若数据;若文件已存在文件已存在,则,则删除旧文件,删除旧文件,建立一建立一个同名的新文件个同名的新文件 ,接
9、收写入的数据。,接收写入的数据。l”abab”:追加方式追加方式l 打开一个已存在的二进制文件。只能写入数打开一个已存在的二进制文件。只能写入数据并追加在文件尾部据并追加在文件尾部。2022-5-2414l二进制文件的三种基本使用方式二进制文件的三种基本使用方式”rb+rb+”:打开一个已存在的二进制文件。可以读取数据。打开一个已存在的二进制文件。可以读取数据。也可以写入数据。也可以写入数据。”wb+wb+”:读写方式读写方式打开一个二进制文件。可以读取数据。也可以写入数据。打开一个二进制文件。可以读取数据。也可以写入数据。 若文件不存在,则自动建立一个新文件接收写入的数据;若文件不存在,则自
10、动建立一个新文件接收写入的数据;若若文件存在文件存在,则,则删除旧文件,删除旧文件,建立一个同名的新文件建立一个同名的新文件 ,接收写入的数据。接收写入的数据。”ab+ab+”:读写方式读写方式打开一个已存在的二进制文件。可以读取数据。也可以追加打开一个已存在的二进制文件。可以读取数据。也可以追加数据到文件尾部数据到文件尾部。2022-5-2415l操作文件的一般步骤操作文件的一般步骤 打开文件打开文件 读写文件读写文件 关闭文件关闭文件打开文件打开文件:建立建立用户程序与文件的用户程序与文件的联系联系,为文件,为文件分分 配配一个文件缓冲区。一个文件缓冲区。读写文件读写文件:是指对文件的:是
11、指对文件的读、写、追加读、写、追加和和定位定位操作。操作。关闭文件关闭文件:切断切断文件与程序的文件与程序的联系联系,释放释放文件缓冲文件缓冲 区。区。 C语言的输入输出函数库中提供了大量的函数,语言的输入输出函数库中提供了大量的函数,用于完成对数据文件的建立、数据的读写、数据的用于完成对数据文件的建立、数据的读写、数据的追加等操作。追加等操作。 在程序中在程序中调用调用这些这些函数函数时,必须先用时,必须先用include命命令包含令包含stdio.h文件。文件。 2022-5-2416 标准文件标准文件是外部设备中的三个特殊的设备文件。它们是外部设备中的三个特殊的设备文件。它们的文件指针是
12、系统定义的,并由系统的文件指针是系统定义的,并由系统自动打开和关闭自动打开和关闭。这。这三个标准文件分别是:三个标准文件分别是: 标准输入文件,文件指针为标准输入文件,文件指针为stdin,系统指定为系统指定为键盘键盘。 标准输出文件,文件指针为标准输出文件,文件指针为stdout,系统指定为系统指定为显示器显示器。 标准错误输出文件,文件指针为标准错误输出文件,文件指针为stderr,系统指系统指定为定为显示器显示器,输出错误信息。,输出错误信息。9.1 文件的概述文件的概述 9.1.1 文件和文件指针文件和文件指针 4. 标准文件标准文件 2022-5-2417l检查文件打开操作是否成功检
13、查文件打开操作是否成功 ifif( ( (fp = fopen(fp = fopen(filenamefilename, , r r) ) = = NULL)NULL) printf (”Cannot open file.n”); printf (”Cannot open file.n”); exit(0);exit(0); 检查以检查以只读只读方式打开文件名为方式打开文件名为filenamefilename的文件是的文件是否成功。否成功。exitexit函数的作用:函数的作用:结束程序的执行结束程序的执行,并将实参,并将实参0 0作作为函数返回值传给操作系统。为函数返回值传给操作系统。202
14、2-5-2418常用的调用形式常用的调用形式: FILE * *fpfp; fclose( fclose( fpfp ) ); fp fp:已经打开的文件指针。:已经打开的文件指针。函数功能函数功能: 关闭关闭fpfp指定的文件,释放该文件的缓冲区、指定的文件,释放该文件的缓冲区、FILEFILE类型变量及文件指针。类型变量及文件指针。 若文件关闭成功,则返回若文件关闭成功,则返回0; 若文件关闭失败,则返回若文件关闭失败,则返回非非0值。值。2022-5-24192022-5-2420系统定义的文本文件结系统定义的文本文件结束标志,其值为束标志,其值为 (-1)。 2022-5-242120
15、22-5-2422【例【例9.1】利用利用fputc和和fgetc函数建立一个文本文件,并显示文函数建立一个文本文件,并显示文件中的内容。件中的内容。#include main( ) FILE *fp; /* 定义一个文件指针变量定义一个文件指针变量fp fp */ int c; /* c为存放字符的变量为存放字符的变量 */ char filename40; /* filename用于存放数据文件名用于存放数据文件名 */ printf(filename: ); /* 提示输入磁盘文件名提示输入磁盘文件名 */ gets(filename); if (fp=fopen(filename,w)
16、=NULL) printf(Cant open the %sn, filename); exit(0); 测试打开文件测试打开文件是否成功是否成功2022-5-2423while (c=getchar( )!=EOF) /*键盘文件结束标志:输入键盘文件结束标志:输入Ctrl+z,显示显示Z后回车后回车*/ putc(c, fp); /* 将键盘输入的字符写到文件中将键盘输入的字符写到文件中 */fclose(fp); /* 建立文件结束,关闭文件建立文件结束,关闭文件 */printf(outfile:n);fp=fopen(filename,r); /* 以读方式打开文本文件以读方式打开文
17、本文件 */while (c=getc(fp)!=EOF) /* 未读到文件结束标志时未读到文件结束标志时 */ putchar(c); /* 在显示器显示读出的字符在显示器显示读出的字符 */fclose(fp); /* 读文件结束,关闭文件读文件结束,关闭文件 */2022-5-24242022-5-2425 2022-5-24262022-5-24272022-5-2428【例例9.3】应用应用fputs和和fgets函数,建立和读取文本文件。函数,建立和读取文本文件。#include stdio.h#include string.hmain( ) FILE *fp; /* 定义一个文件
18、指针变量定义一个文件指针变量fp */ char filename40,str81; printf(filename: ); /* 提示输入磁盘文件名提示输入磁盘文件名 */ gets(filename); if (fp=fopen(filename,w)=NULL) /* 在磁盘中新建并打开一个文本文件,同时测试是否成功在磁盘中新建并打开一个文本文件,同时测试是否成功 */ printf(Can t open the %sn,filename); exit(0); 2022-5-2429while (strlen(gets(str)0) /* 键盘输入空串(即仅输入回车)则输入全部结束键盘输
19、入空串(即仅输入回车)则输入全部结束 */ fputs(str,fp); /* 将键盘输入的字符串写到文件中将键盘输入的字符串写到文件中 */ fputc(n,fp); /* 在文件中加入换行符作为字符串分隔符在文件中加入换行符作为字符串分隔符 */ fclose(fp); /* 建立文件结束,关闭文件建立文件结束,关闭文件 */printf(outfile:n);fp=fopen(filename,r); /* 以读方式打开文本文件以读方式打开文本文件 */while (fgets(str,81,fp)!=NULL) /* 从文件读取字符串并测试文件是否已读完从文件读取字符串并测试文件是否已
20、读完 */ printf(%s,str); /* 将文件中读取的字符串分行显示将文件中读取的字符串分行显示 */fclose(fp); /* 读文件结束,关闭文件读文件结束,关闭文件 */2022-5-24302022-5-24312022-5-2432 由于由于EOF(-1)是一个合法的整是一个合法的整数,因此应该用数,因此应该用ferror函数检测函数检测函数调用是否出错。函数调用是否出错。 2022-5-2433 EOF(-1)是是getw函数可能返函数可能返回的合法值,所以应该用回的合法值,所以应该用feof函数或函数或ferror函数检测文件是函数检测文件是否结束或调用失败。否结束或
21、调用失败。 2022-5-24342022-5-24352022-5-2436【例【例9.5】应用应用putw和和getw函数建立二进制整型数据文件函数建立二进制整型数据文件并读取其中的数据。并读取其中的数据。#include stdio.hmain( ) FILE *fp; /* 定义一个文件指针变量定义一个文件指针变量fp */ char filename40; /* filename用于存放数据文件名用于存放数据文件名 */ int i,n1=5,n2,x5=10,22,36,48,59,y5; printf(filename: ); gets(filename); if (fp=fop
22、en(filename,wb)=NULL) /* 新建并打开一个二进制文件,并测试是否成功新建并打开一个二进制文件,并测试是否成功 */ printf(Can t open the %sn,filename); exit(0); 2022-5-2437putw(n1,fp); /* 向二进制文件写入一个整数向二进制文件写入一个整数 */ for (i=0; in1; i+) putw(xi,fp); /* 将将x数组的数组的5个整数写入二进制文件个整数写入二进制文件 */ fclose(fp); /* 建立文件结束,关闭文件建立文件结束,关闭文件 */ printf(outfile:n); f
23、p=fopen(filename,rb); /* 以读方式打开二进制文件以读方式打开二进制文件 */ n2=getw(fp); /* 从二进制文件读取一个整数从二进制文件读取一个整数 */ for (i=0; in2; i+) yi=getw(fp); /* 从文件读取一个整数赋给从文件读取一个整数赋给y y数组元素数组元素 */ printf(%d ,yi); printf(n); fclose(fp); /* 读文件结束,关闭文件读文件结束,关闭文件 */ 2022-5-24382022-5-24392022-5-2440【例【例9.6】应用应用fwrite与与fread函数建立一个存放学
24、生电话簿函数建立一个存放学生电话簿的二进制数据文件并读取其中的数据。的二进制数据文件并读取其中的数据。#include stdio.hmain( ) FILE *fp; int i; char filename40; /* filename用于存放数据文件名用于存放数据文件名 */ struct tel char name20, tel9; in5, out5; printf(filename: ); gets(filename); if (fp=fopen(filename,wb)=NULL) printf(Cant open the %sn,filename); exit (0); 新建并
25、打开一个二进制新建并打开一个二进制文件,并测试是否成功文件,并测试是否成功 2022-5-2441for(i=0; i5; i+) printf(name: ); gets(ini.name); printf(tel: ); gets(ini.tel); fwrite(in, sizeof(struct tel), 5, fp); /* 文件中写入文件中写入5 5个学生的电话个学生的电话 */ fclose(fp); /* 建立文件结束,关闭文件建立文件结束,关闭文件 */ printf(outfile:n); fp=fopen(filename,rb); /* 以读方式打开二进制文件以读方式
26、打开二进制文件 */ fread(out,sizeof(struct tel),5,fp); /* 从文件读取从文件读取5 5个结构体数据个结构体数据 */ printf(name telephonen); for(i=0; i5; i+) printf(%-20s%-8sn,outi.name,outi.tel); fclose(fp); /* 读文件结束,关闭文件读文件结束,关闭文件 */ 2022-5-2442文件的读写是通过文件系统内部的文件的读写是通过文件系统内部的“”进行的。进行的。当当一个文件时,系统自动为该文件分配的一个文件时,系统自动为该文件分配的FILEFILE结构体结构体变量中有一个变量中有一个成员,对该文件的读写操作均通成员,对该文件的读写操作均通过过进行。进行。后后指向文件中指向文件中( () )字节。字节。时,时,指向文件指向文件的的。2022-5-2443是是正正数,文件数,文件读写指针读写指针向文件向文件尾部尾部方向移动;方向移动;是是负负数向文件数向文件头部头部移动移动 该函数仅适用于二进制文件。该函数仅适用于二进制文件。 2022-5-2444该函数适用于二进制文件和文本文件。该函数适用于二进制文件和文本文件。 2022-5-2445该函数适用于二进制文件和文本文件。该函数适用于二进制文件和文本文件。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。