《数据库文件(数据库).ppt》由会员分享,可在线阅读,更多相关《数据库文件(数据库).ppt(26页珍藏版)》请在优知文库上搜索。
1、第十二章 文件掌握几个概念: 文件、文件操作的分类、顺序文件、索引文件、索引文件访问的过程、ISAM文件、VSAM文件、文件操作的步骤如下:1.首先用fopen函数打开文件。2.然后可以对文件进行读或写操作对文件的3.读或写操作完成后,应该及时用fclose函数关闭文件。注意:文件操作的所有文件均包含在stdio.h文件中。所以在程序的开始应有 #include 12.1 文件的打开与关闭 12.1.1 打开文件函数fopen 对文件进行读写之前应当“打开”该文件,读写完毕之后应当“关闭”该文件。 ANSI C规定使用fopen函数来打开文件。 fopen函数的原型为: FILE *fopen
2、(char *filename, char *mode); 其中,filename指定要打开的文件名,可以使用字符串常量,也可以使用指向字符串的指针变量;mode表示文件的使用方式使用方式 含义 文件类型说明“r”只读 文本文件将要从文件中读出数据而打开文件“w”只写 文本文件将要往文件中写入数据而打开文件“a”追加 文本文件将要往文件尾增加数据而打开文件“r+”读写 文本文件为读/写而打开文件“w+”读写 文本文件为读/写而建立新文件“a+”读写 文本文件为读/写而打开文件“rb”只读 二进制文件将要从文件中读出数据而打开文件“wb”只写 二进制文件将要往文件中写入数据而打开文件“ab”追加
3、 二进制文件将要往文件尾增加数据而打开文件“rb+”读写 二进制文件为读/写而打开文件“wb+”读写 二进制文件为读/写而建立新文件“ab+”读写 二进制文件为读/写而打开文件文件打开模式(mode)说明表 设有如下文件指针的定义:FILE *fp; 那么fp=fopen(“student.dat”,”w”); 表示以文本方式打开文件student.dat,打开后要往文件中写 入数据。 又如: fp=fopen(“score.dat”,”wb+”); 表示以二进制方式打开文件score.dat,向文件中写入数据后还可以读出文件中的数据。 如果打不开文件(原因很多),fopen会返回空指针NUL
4、L,我们常用下面的方法打开文件: if( ( fp=fopen(“文件名”, “文件使用方式”) )=NULL ) printf(“无法打开此文件!n”) exit(0); 1. 使用“r”和”r+”时,文件应已经存在。2. 使用“w”和”w+”时,新建一个文件,若磁盘上已有同名文件则被删除。3. 使用“a”和”a+”时,文件应已经存在,原有内容不被删除,位置指针移到文件末尾,可以添加内容。4. 在读文本文件时,遇到回车(r=13)换行(n=10)符,自动转换成一个换行符;写时,反过来,将一个换行符转换成一个回车符和一个换行符(为了可以使用TYPE命令显示其内容)。读写二进制文件则无此转换。5
5、. 在程序开始运行时,系统自动打开三个文件:标准输入设备(键盘)、标准输出设备(显示器)和标准错误输出设备(通常也是显示器),与之对应的文件指针为stdin、stdout和stderr。12.1.2 关闭文件函数 fclose使用完文件后应当关闭它,系统把缓冲区的内容写回文件,然后将文件指针变量与该文件“脱钩”。关闭文件使用函数fclose,它的原型为int fclose(FILE *fp);该函数关闭fp指向的文件。如果文件正常关闭将返回0值;如果关闭文件失败则返回非0值。例fp=fopen(“a:name.txt”,”w”); /*打开一个文本文件*/ /*对文件进行操作*/fclose(
6、fp); /*关闭该文件*/12.1.3 检测文件是否结束函数 feof feof的原型为:int feof(FILE *fp); 它用于检测位置指针是否到达了文件尾部。 返回0表示位置指针未到达文件尾。 返回非0表示位置指针已到达文件尾。12.2 向文件中写数据向文件中写入数据可以使用以下函数:1.fputc函数fputc的原型为int fputc(int ch, FILE *fp);此函数会将字符ch写入fp指向的文件。若操作成功则返回ch的值;若操作失败则返回EOF(-1)。通常用于将一个字符写入一个文本文件。2. fwrite函数函数原型:unsigned fwrite(void *b
7、uffer, unsigned size, unsigned count, FILE *fp);功能:将buffer所指向的内存单元开始的内存区中的每项长度为size字节的count个数据项写到fp指向的文件中。此函数主要用于二进制文件的写操作,可以将一个数组的数据写入文件中。例12.1建立一个文本文件letter.dat,将26个英文大写字母写到文件中。#include main() char ch; FILE *fp; fp=fopen(letter.dat,w); if(fp=NULL) printf(nCannot open letter.dat!); exit(0); for(ch=
8、A;ch=Z;ch+) fputc(ch,fp); fputc(n,fp); fclose(fp);建立一个二进制文件score.dat,存放某班32名同学某门课的成绩(每名同学要求有学号和成绩两个数据项。#include struct struct_name int number; int score;students32;main() FILE *fp; int i; if(fp=fopen(score.dat,wb)=NULL) printf(Cannot open file score.dat!n); exit(0); for(i=0;i32;i+) scanf(%d%d,&stude
9、ntsi.number,&studentsi.score);for(i=0;i32;i+) fwrite(&studentsi,sizeof(struct struct_name),1,fp);fclose(fp);12.3 往文件中追加数据若要往文件中追加数据,在打开文件时应将文件的使用方式设为“a”或”ab”,这样的话该文件的位置指针会指向最后一个数据的后面,再用fputc或fwrite即可将数据写到文件的后面。fputc和fwrite除了有写入数据的功能,还会将位置指针向后移动一个位置,为下一次读写操作做准备。设文件letter.dat(26个英文字母)已经由例10.1建立完毕,编写一个
10、程序,要求键盘输入一组字符(直到输入字符?时结束),将这些字符追加到文件的尾部。#include main() char ch; FILE *fp; if(fp=fopen(letter.dat,a)=NULL) printf(Cannot open this file!n); exit(0); scanf(%c,&ch); while(ch!=?) fputc(ch,fp); scanf(%c,&ch);fclose(fp);12.4 从文件中读取数据前面介绍了如何往文件中写数据,本节介绍如何从文件中读取数据。12.4.1 fgetc函数 fgetc的原型为int fgetc(FILE *f
11、p); 功能:从文件的当前位置读出一个字符将位置指针下移一个字符若读取成功则返回所读的字符;若发生错误或文件结束则返回EOF(-1)。12.4.2. fread函数 fread的原型为unsigned fread(void *buffer, unsigned size, unsigned count, FILE *fp); 功能:从文件中读取每项长度为size字节的count个数据项,存到buffer所指向的内存单元开始的内存区中。将letter.dat文件存放的所有字符从显示器上显示出来。由于我们不知道文件中目前的字符个数,因此可以用EOF作为循环的结束条件。#include main()
12、char ch; FILE *fp;if(fp=fopen(letter.dat,r)=NULL) printf(Cannot open letter.dat!n); exit(0); if(ch=fgetc(fp)=EOF) printf(Blank file!n);while(ch!=EOF) printf(%c,ch); ch=fgetc(fp); fclose(fp);求score.dat(例10.2建立的文件)的总成绩。#include struct node int number; int score; student;main()FILE *fp; int i;float sum
13、;fp=fopen(score.dat,rb)If(fp=NULL) printf(Cannot open score.dat!n); exit(0); sum=0; fread(&student,sizeof(struct node),1,fp);while(!feof(fp) sum=sum+student.score; fread(&student,sizeof(struct),1,fp); printf(sum=%fn,sum); fclose(fp);12.5 文件的定位我们使用文件定位函数改变位置指针的指向,从而实现对文件的随机读写。12.5.1 位置指针复位函数rewind re
14、wind函数的原型为void rewind(FILE *fp); 功能:将文件的位置指针指向文件的开头。清除错误标志和文件结束标志。12.5.2 位置指针的随机移动函数fseek fseek的原型为int fseek(FILE *fp, long offset, int base);功能:将文件的位置指针移到以base为起始点,offset为位移量的位置,同时清除文件结束标志base常用三个符号常量:SEEK_SET、SEEK_CUR和SEEK_END,分别表示文件开始、当前位置和文件末尾。 offset表示以起始点为基准,向前或向后移动的字节数。例如: fseek(fp, 2, SEEK_S
15、ET); 表示将位置指针从文件开始处向后移动2个字节。fseek(fp, 2, SEEK_CUR); 表示将位置指针从当前位置向后移动2个字节fseek(fp, -2, SEEK_END); 表示将位置指针从文件尾部向前移动2个字节。12.5.3 求文件位置指针当前位置的函数ftell有时我们需要知道位置指针的当前位置,这就用到了ftell函数。ftell的原型为 long ftell(FILE *fp);功能:返回位置指针相对于文件开头的位移量。若出错返回-1L。12.6 其它读写函数 12.6.1 格式化读写函数fprintf和fscanf 12.6.2 字读写函数putw和getw 12
16、.6.3 字符串读写函数fputs和fgets12.6.1 格式化读写函数fprintf和fscanffscanf和fprintf的原型为 int fscanf(FILE *fp, char fmt, ); int fprintf(FILE *fp, char fmt, ); 其中fp为文件指针,fmt为格式串,第三个及以后的参数为输入/输出列表。功能:fscanf按fmt指定的格式从文件中读取数据,并传递到输入列表所指向的内存单元;fprintf把输出列表中的值按fmt指定的格式写到文件中。 这两个函数的使用方法同scanf/printf类似。 例如fprintf(fp, “%5.2f,%d”,x,i);fscanf(fp, “%f,%d”,&x,&i);12.6.2 字读写函数putw和getw1、putw函数: 使用putw函数可以往指定文件写入一个字(2个字节),即一个整数;而使用getw可以从文件中读出一个整数。 putw的原型为 int putw(int w, FILE *fp); 功能:向文件中写入一个字(整数)。 例如,向文件中写入一个整数20:putw(20,fp);