《大学计算机C语言.ppt》由会员分享,可在线阅读,更多相关《大学计算机C语言.ppt(28页珍藏版)》请在装配图网上搜索。
1、-2- 第 9章 文件 本 章 内 容 1.C文件概述 2.文件类型指针 3.文件的打开和关闭 4.文件的读写 5.文件的定位 6.出错的检测 -3- 第 9章 文件 9.1 C文件概述 文件 文件 是存储在外部介质上的数据的集合 。 操作系统是以文件为单位对数据进行管理的 。 文件 程序 数据区 输出文件缓冲区 输入文件缓冲区 -4- 第 9章 文件 9.1 C文件概述 文件类型 从用户观点 特殊文件 (标准输入输出文件或标准设备文件 )。 普通文件 (磁盘文件 )。 从操作系统的角度 每一个与主机相连的输入输出设备看作是一个文件 。 例如:输入文件:终端键盘 , 输出文件:显示屏和打印机 。
2、。 从数据的组织形式 ASCII文件 (文本文件 ) 每一个字节放一个 ASCII代码 。 便于对字符进行逐个处理 , 也便于输出字符 。 但一般占存 储空间较多 , 而且要花费转换时间 。 二进制文件 把内存中的数据按其在内存中的存储形式原样输出到磁盘 上存放 。 可以节省外存空间和转换时间 , 但一个字节并不对应一个 字符 , 不能直接输出字符形式 。 -5- 第 9章 文件 9.1 C文件概述 C语言对文件的处理方法 缓冲文件系统 系统自动地在内存区为每一个正在使用的文件开辟一个缓冲 区 。 用缓冲文件系统进行的输入输出又称为高级磁盘输入输出 。 非缓冲文件系统 系统不自动开辟确定大小的。
3、缓冲区 , 而由程序为每个文件设 定缓冲区 。 用非缓冲文件系统进行的输入输出又称为低级输入输出系统 。 ANSI C标准用缓冲文件系统来处理文本文件和二进制文件 。 C语言中对文件的操作是用库函数来实现的 。 -6- 第 9章 文件 9.2 文件类型指针 结构体文件类型 FILE typedef struct shortlevel; /*缓冲区 满 或 空 的程度 */ unsignedflags; /*文件状态标志 */ charfd; /*文件描述符 */ unsignedcharhold; /*如无缓冲区不读取字符 */ shortbsize; /*缓冲区的大小 */ unsigned。
4、char*buffer; /*数据缓冲区的位置 */ unsignedar*curp; /*指针 , 当前的指向 */ unsignedistemp; /*临时文件 , 指示器 */ shorttoken; /*用于有效性检查 */ FILE; -7- 第 9章 文件 9.2 文件类型指针 在缓冲文件系统中 , 每个被使用的文件都在内存中开辟一个区域 , 用 来存放文件的有关信息 ( 名字 、 状态 、 当前位置等 ) , 这些信息存放 在一个结构体变量中 。 FILE类型的数组 FILE f5 ; 文件型指针变量 FILE *fp; -8- 第 9章 文件 9.3 文件的打开和关闭 文件的打。
5、开 ( fopen()函数 ) 调用方式: FILE *fp; fp=fopen(文件名 , 使用文件方式 ); 使用文件方式: r, w, a, +, b 函数的返回值: 正常打开则返回文件指针 。 出错则返回 0( NULL)。 文件的关闭 ( fclose()函数 ) 调用形式: fclose(文件指针 ) ; 函数的返回值: 正常关闭则返回 0值 。 否则返回 EOF。 -9- 第 9章 文件 9.3 文件的打开和关闭 符号 方式 含义 r 只读 为输入打开一个文本文件 w 只写 为输出打开一个文本文件 a 追加 向文本文件尾增加数据 rb 只读 为输入打开一个二进制文件 wb 只写 。
6、为输出打开一个二进制文件 ab 追加 向二进制文件尾增加数据 r+ 读写 为读 /写打开一个文本文件 w+ 读写 为读 /写建立一个新的文本文件 a+ 读写 为读 /写打开一个文本文件 rb+ 读写 为读 /写打开一个二进制文件 wb+ 读写 为读 /写建立一个新的二进制文件 ab+ 读写 为读 /写打开一个二进制文件 -10- 第 9章 文件 9.3 文件的打开和关闭 几个相关的函数和符号常量 函数 exit(0) 关闭所有文件 符号常量 NULL 空值 ( 0) 符号常量 EOF 文件结束符 ( -1) 函数 feof(文件指针 ) 判断文件结束否 ( 非 0结束 ) -11- 第 9章 。
7、文件 9.4 文件的读写 fputc函数和 fgetc函数 将一个字符写到磁盘文件中 调用形式: fputc(ch,fp); 输出成功返回该字符 , 失败返回 EOF。 从指定文件读入一个字符 调用形式: ch=fgetc(fp); 输出成功返回得到的字符 , 失败返回 EOF。 使用举例 P336337: 例 9.1, 例 9.2 -12- 第 9章 文件 9.4 文件的读写 常见的读取字符操作 从一个二进制文件顺序读入字符: while( ! feof( fp) ch = fgetc( fp) ; 注意事项 ANSI C提供一个 feof( ) 函数来判断文件是否真的结束 。 如果是文件结。
8、束 , 函数 feof( fp) 的值为 ( 真 ) ;否则为 ( 假 ) 。 也适用于文本文件的读取 。 -13- 第 9章 文件 9.4 文件的读写 fread函数和函数 fwrite 一次读写一组数据 ( 一个实数或一个结构体变量的值 ) 。 调用形式 fread(buffer,size,count,fp); fwrite (buffer,size,count,fp); 参数说明: fp:文件型指针 count:读写多少个 size字节 size:要读写的字节数 buffer:指针 , 读入 ( 输出 ) 数据的存放地址 使用举例 若文件以二进制形式打开: fread(f,4,2,fp)。
9、; 功能:此函数从 fp所指向的文件中读入 2个 4个字节的数据 , 存储 到数组 f中 。 -14- 第 9章 文件 9.4 文件的读写 若有如下结构类型: struct student_type char name10; int num; int age; char addr30; stud40; 可以用 fread和 fwrite来进行数据的操作: for(i=0; i40; i+) fread( for(i=0; i40; i+) fwrite( -15- 第 9章 文件 9.4 文件的读写 例 9.3: 从键盘输入个学生的有关数据 , 然后把它们转存到磁盘 文件上去 。 #inclu。
10、de #define SIZE 4 struct student_type char name10; int num; int age; char addr15; studSIZE; -16- 第 9章 文件 9.4 文件的读写 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( fclose(fp); -17- 第 9章 文件 9.4 文件的读写 main() int i; for(i=0;iSI。
11、ZE;i+) scanf(%s%d%d%s, studi.name, save( ); -18- 第 9章 文件 9.4 文件的读写 从 stu_list文件中读入数据 , 然后在屏幕上输出 。 main( ) int i; FILE *fp; fp=fopen(stu-list,rb); for(i=0; iSIZE; i+) fread( printf(%-10s %4d %4d %-15sn, studi.name, studi.num,studi. age, studi.addr); fclose (fp); -19- 第 9章 文件 9.4 文件的读写 fprintf函数和 fsca。
12、nf函数 对磁盘文件进行格式化读写 。 调用形式: fprintf(文件指针 , 格式字符串 , 输出表列 ); fscanf(文件指针 , 格式字符串 , 输出表列 ); 例如: fprintf(fp,%d,%6.2f,i,t); fscanf (fp,%d,%f, 注意事项 由于在输入时要将 ASCII码转换为二进制形式 , 在输出时又 要将二进制形式转换成字符 , 花费时间比较多 。 因此 , 在内存与磁盘频繁交换数据的情况下 , 最好不用 fprintf和 fscanf函数 , 而用 fread和 fwrite函数 。 -20- 第 9章 文件 9.4 文件的读写 其他读写函数 字 字。
13、 由若干个字节构成 , 字的位数叫做字长 , 不同档次的机 器有不同的字长 。 例如一台 8位机 , 它的 1个字就等于 1个字节 , 字长为 8位; 如果是一台 16位机 , 那么 , 它的 1个字就由 2个字节构成 , 字 长为 16位 。 字是计算机进行数据处理和运算的单位 。 -21- 第 9章 文件 9.4 文件的读写 putw函数 功能:将一个字 ( 整数 ) 写到 fp指向的文件中 。 调用形式: putw(整数 , fp); 返回值为输出的整数 , 出错则返回 EOF。 putw函数定义: putw(int i,FILE *fp) char *s; s= putc(s0,fp)。
14、; /* s0为 i的第 1字节 */ putc(s1,fp); return i; -22- 第 9章 文件 9.4 文件的读写 getw函数 功能:从 fp所指向的文件读取下一个字 。 调用形式: i=getw(fp); 返回值为输入的整数 , 出错则返回 EOF。 getw函数定义: getw(FILE *fp) char *s; int i; s=char * s0 = getc(fp); s1 = getc(fp); return i; -23- 第 9章 文件 9.4 文件的读写 fgets函数 fgets(字符数组 ,字符个数 ,文件指针 ); 功能:从指定文件读入一个字符串 。。
15、 返回字符数组的首地址 。 例如: fgets(str, n, fp); 从 fp指向的文件输入 n-1个字符 , 在最后加一个 0。 返回值: str的首地址 。 fputs函数 fputs(字符串 , 文件指针 ) ; 功能:向指定文件输出一个字符串 , 0不输出 。 字符串 :字符串常量 、 字符数组名或字符型指针 。 输出成功函数值为 0, 失败为 EOF。 例如: fgets(China, fp); -24- 第 9章 文件 9.5 文件的定位 rewind函数 作用:使位置指针重新返回文件开头 。 调用形式: rewind( 文件类型指针 ) ; 无返回值 。 fseek函数和随机。
16、读写 顺序读写:指只能按字节顺序读写文件中的字节 。 随机读写:指可以读写文件中任意位置上所需要的字节 。 调用形式 ( 位移量为 long型数据 ) : fseek( 文件类型指针 , 位移量 , 起始点 ) ; 返回值:成功为当前位置 , 否则返回 -1。 起始点 名字 用数字代表 文件开始 SEEK_SET 0 文件当前位置 SEEK_CUR 1 文件末尾 SEEK_END 2 -25- 第 9章 文件 9.5 文件的定位 例 9.5:在磁盘文件上存有 10个学生的数据 。 要求将第 1、 3、 5、 7、 9个学生数据输入计算机 , 并在屏幕上显示出来 。 struct student。
17、_type int num; int age; stud10; void main() int I, FILE *fp; if(fp=fopen(stud_dat, rb)=NULL) exit(0); for(i=0; i10; i+=2) fseek(fp, i*sizeof(struct student_type), 0); fread( printf(%d %d n, studi.num, studi.age); -26- 第 9章 文件 9.5 文件的定位 ftell函数 作用:得到流式文件当前位置 , 用相对于文件开头的位移量来表 示 。 调用形式: ftell( 文件类型指针 )。
18、 ; 返回值:成功时为文件的当前位置 , 出错时为 -1L。 例如: long i; i = ftell(fp); if(i = -1L) printf(errorn); -27- 第 9章 文件 9.6 出错的检测 ferror函数 作用:检查输入输出函数调用中的错误 。 在执行 fopen函数时 , ferror函数的初始值自动置为 。 调用形式 : ferror( 文件类型指针 ) ; 返回值:为 0表示未出错 , 非 0表示出错 。 对同一个文件每一次调用输入输出函数 , 均产生一个新的 ferror 函数值 。 应即时检查 。 clearerr函数 作用:使文件错误标志和文件结束标志置为 0。 调用形式: clearerr( 文件类型指针 ) ; 返回值:无 。 -28- 第 9章 文件 作 业 习题九: 一 、 二 、 四 ( 1, 3, 6, 8, 9)。