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