第10章文件
10.5文件的定位
文件中有一个位置指针,指向当前读写的位置。 每当进行一次读写后,该指针自动指向下一个字 符的位置。可以用ftell()函数获得当前的位置指 针,也可以用rewind()/fseek()函数改变位置 指针,使其指向需要读写的位置。 10.5.1 rewind函数 一般的使用形式为:void rewind(FILE *fp) 作用:将fp指示的文件中的位置指针重新置于文 件的开头。
10.2.3 C语言的设备文件
在C语言中,把与主机相连的各种外部设备,如显示器、打印机、键盘等 外部设备也看作是一个文件,把向显示器和打印机的输出看作是对该设备文 件的写操作,而将从键盘的输入看作是对该设备文件的读操作。 在C语言中,显示器被定义为标准输出文件,键盘被定义为标准输入文件。在 前面常用的printf是向标准输出设备显示器输出数据,而scanf是从标准输入 文件上输入数据。 对用户使用的普通数据文件需要使用文件指针才能实现对文件的操作。
成功,返回该字符,否则返回0。
ch, FILE *fp)
【例10-1】 从键盘输入一些字符,逐个把它们送到磁盘上去,直到 输入一个“#”为止。 源程序 #include “stdio.h” # include “stdlib.h” void main() {FILE *fp;char ch,filename[10]; scanf(“%s”,filename); if ((fp=fopen(filename, ” w ”))==NULL) {printf(“cannot open this file\n”); exit(0); } ch=getchar();/*用于接收前一个回车符*/ ch=getchar(); while(ch!=„#‟) {fputc(ch,fp);putchar(ch); ch=getchar();} fclose(fp); }
10.6文件操作综合应用举例
【例10-8】有一个磁盘文件,先将它的内容显示在屏幕上,再将它复制到另 一个文件上。 源程序 #include “stdio.h” # include “stdlib.h” main() {FILE *fpr,*fpw;char frname[10],fwname[10]; printf(“Input the filenames!\n”); scanf(“%s%s”,frname,fwname); if ((fpr=fopen(frname, “r”))==NULL) {printf(“cannot open this file\n”);exit(0);} if ((fpw=fopen(fwname, “w”))==NULL) {printf(“cannot open this file\n”);exit(0);} while(!feof(fpr)) putchar(fgetc(fpr)); rewind(fpr); /*重绕*/ while(!feof(fpr)) fputc(fgetc(fpr),fpw); fclose(fpr);fclose(fpw); }
第10章
文件
文件(file)是程序设计中的一个重要的概念,是按一 定的规则存储在外部介质上的数据的集合。
10.1 10.2 10.3 10.4 10.5 10.6
问题的提出与程序示例 文件概述 文件的打开与关闭 文件的读写操作 文件的定位 文件操作综合应用举例
10.1问题的提出与程序示例
10.4.5 文件的随机读写 1. fread函数 格式: fread (buffer,size,count,fp) buffer:用于存放读入数据的缓冲区首指针. size:读入的每个数据项的字节数. count:读入数据项的个数. fp:文件指针. 2. fwrite函数 格式: fwrite (buffer,size,count,fp) buffer:用于存放输出数据的缓冲区首指针. size:输出的每个数据项的字节数. count:输出数据项的个数. fp:文件指针.
【例10-4】将一个磁盘文件中的信息复制到另一个磁盘文中。 源程序 #include “stdio.h” # include “stdlib.h” main(int argc,char *argv[]) {FILE *in,*out;char ch; if(argc!=3) /*要求命令后带有2个参数*/ {printf(“You forgot to enter the infile name:\n”); exit(0);} if ((in=fopen(argv[1], ”r ”))==NULL) {printf(“cannot open this file\n”);exit(0);} if ((out=fopen(argv[2], ”w ”))==NULL) {printf(“cannot open this file\n”); exit(0);} while(!feof(in))fputc(fgetc(in),out); fclose(in); fclose(out); }
10.4.3 字符串读写函数
调用字符串写函数fputs的语法格式为: fputs(字符串,文件指针); fputs函数的作用是向指定的文件输出一个字符串。 例如: fputs(str,fp) /* 把字符串str写入fp */ 调用字符串读函数fgets的语法格式为: fgets(字符数组名,n,文件指针); fgets函数的作用是从指定文件读入一个字符串。 例如: fgets(str, n,fp) /* 从文件fp读n-1个字节到str, str最后一个字节加'\0'*/
【例10-6】编一程序,从文件file2.dat读入100个整数,并 显示出来。 源程序 #include “stdio.h” # include “stdlib.h” #define N 100 main() {FILE *fp; int data[N],i; if((fp=fopen("c:\\file2.dat ",“r"))==NULL) printf("Can not open file idata.dat!"); else{ fread(data, sizeof(int),N,fp); fclose(fp); for(i=0;i<N;i++) printf(“%d”,data[i]); }}
二、定义格式
FILE *文件指针变量名; 如:FILE *fp; 通过文件指针变量(文件信息区的起始地址)能够找到与它相关 的文件。
10.3.2文件的打开(fopen函数)
格式:FILE *fopen(char *filename, char *mode) 功能:以mode指定的方式打开名为 filename的文件。 返回值:成功,返回一个文件指针,否则返回0。 mode 文件打开方式见P312 表13.1 如:FILE *fp; if ((fp=fopen(“file1.c”, ” r ”))= =NULL) {printf(“cannot open this file\n”); exit(0);}
10.3.2文件的关闭(fclose函数)
格式: int fclose(FILE *fp) 返回值:成功,返回0, 否则返回非0(通常是EOF(-1)。
10.4 文件的读写操作
10.4.1 文件读写概念 读,从外存到内存;写,从内存tc函数
格式:int fputc(char
10.4.4 格式化读写函数
fscanf(文件指针,格式字符串,输入表列); fprintf(文件指针,格式字符串,输出表列);
例如: fprintf(fp,"%d,%6.2f",i,t); 它的作用是将整型变量i和实型变量t的值按%d和 %6.2f的格式输出到fp所指向的文件中。如果 i=3,t=4.5,则输出到磁盘文件上的是以下字符串: 3,4.50 同样,用fscanf函数可以从磁盘文件上读入ASCII字符: fscanf(fp,"%d,%f",&i,&t); 磁盘文件上如果有以下字符:3,4.5 则将磁盘文件的 数据3送给变量i,4.5送给变量t。
10.5.2 fseek函数和随机读写 对流式文件可以进行顺序读写,也可以进行随机 读写,关键在于控制文件的位置指针。 用fseek函数可以实现改变文件的位置指针。 fseek函数的调用形式为: fseek (文件类型指针,位移量,起始点); 功能:把文件的位置指针从起始点开始,移动指 定位移量的字节数。成功返回0,失败返回非0。 其中位移量参数含义如表10-2。 10.5.3 ftell函数 ftell函数的作用是得到流式文件中的当前位置, 用相对于文件开头的位移量来表示。若失败则返 回值为-1L。
10.2.2 文件的存取方式
ANSI C 标准采用缓冲文件系统来处理文件,即由系统自动地在内存区为 每一个正在使用的文件开辟一个缓冲区,缓冲区的大小由具体的C版本确定, 一般为512字节。 使用缓冲文件系统可以大大提高文件操作的速度及延长外部设备的寿命。 注意:文件是保存在磁盘上的,而磁盘数据的组织方式按扇区进行,每个 扇区的大小为512字节,缓冲文件系统把缓冲区大小定为512字节,恰恰与磁 盘扇区的大小相同,从而可以保证磁盘操作的高效率。
10.2
C文件概述
10.2.1 文件的基本概念与文件的存储
操作系统是以文件为单位对数据进行管理的,而从操 作系统的角度看,每一个与主机相连的输入输出设备都看 作是一个文件。 C语言把文件看成是一个字符(字节)的序列,即由一 个一个字符的数据顺序组成。根据数据的组织形式,可分 成ASCII文件和二进制文件。区别如下图:整数10000
【例10-5】编一程序,从键盘输入100个整数,并存入 c:\file2.dat文件中。 源程序 #include “stdio.h” # include “stdlib.h” #define N 100 main() {FILE *fp;int data[N],i; for(i=0;i<N;i++) scanf("%d",&data[i]); if((fp=fopen("file2.dat","w+"))==NULL) printf("Can not open file idata.dat!"); else{ fwrite(data, sizeof(int),N,fp); fclose(fp); }}