C语言程序设计文件操作.docx
C语言程序设计文件操作第八章 文件操作 一、概述 1.概述 文件是指存储在外部介质上数据的集合。操作系统是以文件为单位对数据进行管理的。对I/O设备的管理也是看做一个文件,而且都有特殊的名字。如com,lpt,prn,con等。 C语言把文件看作是一个字符的序列,即有一个一个字符的数据顺序组成。根据数据的组织形式,可分为ASCII码文件和二进制文件。 ASCII码文件又称文本文件,它的每一个字节存放一个ASCII代码,代表一个字符。 二进制文件是把内存中的数据按其在内存中的存放形式原样输出到磁盘上存放。 如:一个整数12345,在内存中占2个字节。按ASCII码形式保存占5个字节,按二进制形式保存只需要2个字节。 很显然采用ASCII码的形式便于输出字符,但需占用较多的存储空间;而采用二进制的形式可以节省存储空间,但不能直接输出字符。 在C语言中对文件的存取是以字节为单位的。 2.文件指针 每一个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息。这些信息是保存在一个结构体类型变量中的。该结构体类型的名称为FILE,其定义如下: Typedef struct Int _fd; 文件号 Int _cleft; 缓冲区中剩下的字符 Int _mode; 文件操作模式 Char _*_nextc;下一个字符位置 Char *_buff; 文件缓冲区位置 FILE; 有了FILE 类型之后,我们就可以用它来定义文件类型的变量、数组和指针。如: FILE fp256;定义了一个结构体数组fp,包含256个元素。 FILE *fp; 定义了一个指向FILE类型结构体的指针变量fp。有了这个定义之后,就可以用它指向一个文件,然后通过它来实现对文件的访问。 3.文件操作对文件的操作无非是:文件的打开文件的关闭文件的读文件的写这四个操作。在C语言中使用专门的库函数来完成。 (1)文件的打开 使用fopen函数实现打开文件,而且在调用fopen之前,需先定义一个FILE类型的指针。一般使用格式如下: FILE *fp; Fp=fopen(“文件名”,”打开方式”); 通过这一条语句,就使得fp与“文件名”所指定的文件建立起了联系。 说明:1.文件名必须是文件的全名。2.打开方式如下表所示: R 只读 为输入打开一个文本文件 W 只写 为输出打开一个文本文件 A 追加 向文本文件尾增加数据 Rb 只读 为输入打开一个二进制文件 Wb 只写 为输出打开一个二进制文件 Ab 追加 向二进制文件尾增加数据 R+ 读写 为读/写打开一个文本文件 W+ 读写 为读/写建立一个新的文本文件 A+ 读写 为读/写打开一个文本文件 Rb+ 读写 为读/写打开一个二进制文件 Wb+读写 为读/写建立一个新的二进制文件 Ab+ 读写 为读/写打开一个二进制文件 在上述列出的打开方式中,并非所有的C语言版本都完全提供。因此在使用时要注意所使用的版本的规定。 3.在使用fopen时,如果打开不成功,将会返回一个错误信息,即空指针值,在stdio.h文件中被定义为0. 造成错误的原因很多:用“r”方式打开一个不存在的文件;磁盘出故障;磁盘写保护或已满无法建立新文件等。因此常用下面的方法进行检测。 If(fp=fopen(“lx.doc”,”r”)=NULL) Printf(“can not open this file!n”); Exit(0); 二、文件的关闭 在使用完一个文件之后,要养成关闭文件的习惯,否则将会造成数据丢失。因为在向文件写数据时,是先将数据输出到缓冲区,待缓冲区满后才正式输出到外存中的文件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。 在C语言中使用fclose函数来关闭文件。其含义就是切断文件指针和文件之间的联系。 Fclose函数也有返回值:当成功地执行了关闭操作时,返回值为0,如果返回值为非0值,则表示关闭时有错误。 三、文件的读写 当一个文件打开之后,就可以对它进行读写了。 常用的函数如下: 1.fgetc和fputc Fputc:把一个字符写到磁盘文件上去。 一般使用形式为:fputc(ch,fp); 其中:ch要输出的字符变量 Fp已定义的文件指针 当fputc返回EOF时,表明输出失败;否则返回要输出的字符。 Fgetc:从指定的文件中读入一个字符。 一般使用形式为:ch=fgetc(fp); 其中ch已定义的字符变量 Fp已定义的文件指针 当使用fgetc顺序地读一个文件时,最终会碰到文件结束符。此时,该函数会返回一个文件结束标志EOF。在实际应用中通常是使用feof函数来进行测试是否到了文件末尾。 如:while Ch=fgetc(fp); Putchar(ch); 应用举例:用C语言编程实现操作系统中的文件复制命令。 Copy源文件名 目标文件名 #include <stdio.h> Main(argc,argv) Char ch; If(argc!=3) Printf(“please enter file name!n”); Exit(0); If(in=fopen(argv1,”r”)=NULL) printf(“source file is not existn”); Exit(0); if(out=fopen(argv2,”w”)=NULL) printf(“ target file can not createn”); exit(0); while(!feof(in) ch=fgetc(in); fputc(ch,out); fclose(in); fclose(out); 2.fread函数和fwrite函数 Fread函数和fwrite函数是用来实现读写一个数据块。它们的一般使用格式为: Fread; Fwrite; 其中: Buffer:是一个指针。对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。 Size:要读写的字节数。 Count:要进行读写多少个size字节的数据。 Fp:文件型指针。 如果文件以二进制形式打开,用fread和fwrite函数就可以读写任何类型的信息。如fread; 其中f是一个实型数组名。一个实型变量占4个字节。Fread;的意义就是从fp所指向的文件读入两次的数据,存储到数组f中。 值得注意的是:fread和fwrite函数一般用于二进制文件的输入和输出。因为它们是按数据块的长度来处理输入输出的,在字符发生转换的情况下很可能出现与原设想的情况不同。 举例:编程实现某班40个学生成绩数据库管理的程序。假设学生的信息包含如下字段:姓名、学号,班级,C语言、组成原理、高数、线代。 #include <stdio.h> #define SIZE 40 struct student char name10; int num; int class; flaot cyy; flaot zcyl; float gs; float xd; studSIZE; void read int i; printf(“ name xuehao banji c zcyl gaoshu xiandain”); for(i=0;i<SIZE;i+) scanf(“%s%d%d%f%f%f%f”,studi.name,&studi.num,&studi.class, studi.cyy,studi.zcyl,studi.gs,studi.xd); void save FILE *fp; int i; if (fp=fopen(“list.txt”,”wb”)=NULL) printf(“cannot create list file!n”); exit(0); for (i=0;i<SIZE;i+) if (fwrite(&studi,sizeof(struct student),1,fp)!=1) printf(“file write error!n”); void disp FILE *fp; int i; if (fp=fopen(“list.txt”,”rb”)=NULL) printf(“cannot open list file!n”); return; for (i=0;i<SIZE;i+) if (fread(&studi,sizeof(struct student),1,fp)!=1) if (feof(fp)return ; printf(“file read error!n”); else printf(“%-10s%5d%5d%5.1f%5.1f%5.1f%5.1fn”,studi.name, studi.num,studi.class,studi.cyy,studi.zcyl,studi.gs,studi.xd); main read; save; disp; 3.fprintf和fscanf 格式化读写文件的函数。其使用格式如下: Fprintf; Fscanf; 如:fprintf; 将变量i和x的值分别按整型和单精度型写入fp所指向的文件。 Fscanf; 读入一个整型数据和一个单精度型数据分别赋给变量i和x。 值得注意的是:使用这两个函数读写文件时要进行ASCII码和二进制形式之间的转换,从而导致花费的时间较多。 4.putw和getw:是用来对磁盘文件读写一个字或整数。 如:putw;n=getw; 5.fgets和fputs:是用来对磁盘文件读写一个字符串。 使用格式如下:fgets; 从指向的文件读入n-1个字符,并把它放到字符数组str中,而且自动在最后加一个字符串结束标志0。在读入的过程中如果碰到换行符或EOF,读入结束。 Fputs; Fputs(“name sex age addr Tel ”,fp); 输出成功,函数值为0,否则为非零值。 四、文件指针的定位 1.rewind;是文件的位置指针返回到文件的开头。 Rewind(fp); 2.fseek; 其中: “起始点”为下列三个常量的一个。 SEEK_SET 文件开头 SEEK_CUR 当前位置 SEEK_END 文件末尾 “位移量”是指相对于七点向前或向后移动的字节数。 Fseek; Fseek; Fseek; 3.ftell 测试文件位置指针当前的位置。其返回值是相对于文件开头的偏移量来表示的。 I=ftell; 二、文件指针 三、文件操作