1、C程序设计实验文件实验报告贵州大学C程序设计实验 实验报告实验名称:文件专 业电子信息科学与技术班 级 姓 名学 号教 师贵州大学理学院2010年 一、实验目的:(1)、掌握文件以及缓冲文件系统、文件指针的概念;(2)、学会使用文件打开、关闭、读、写等文件操作函数;(3)、学会用缓冲文件系统对文件进行简单的操作。二、实验环境:Windows 7、Microsoft Visual Studio 2010 三、实验内容:编写程序并上机调试运行。(1)有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号、姓名、3门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件st
2、ud中。 设5名学生的学号、姓名和3门课成绩如下: 99101 Wang 89, 98, 67.5 99103 Li 60, 80, 90 99106 Fun 75.5,91.5,99 99110 Ling 100, 50, 62.5 99113 Yuan 58, 68, 71在向文件stud写入数据后,应检查验证stud文件中的内容是否正确。程序如下:#include#define SIZE 5struct student char name10; long int num; float score3; float ave;studSIZE;void main() void save(voi
3、d); int i; float sumSIZE; FILE *fp1; printf(Please input five students names, numbers and three scores like this:nname num score1 score2 score3nn); for(i=0;iSIZE;i+) scanf(%s%ld%f%f%f,studi.name,&studi.num,&studi.score0,&studi.score1,&studi.score2); sumi=studi.score0+studi.score1+studi.score2; studi
4、.ave=sumi/3; save();fp1=fopen(stud.dat,rb);printf(n name No. score1 score2 score3 aven);printf(-n);for(i=0;iSIZE;i+) fread(&studi,sizeof(struct student),1,fp1); printf(%-10s %5ld %8.1f %9.1f %9.1f %8.2fn,studi.name,studi.num,studi.score0,studi.score1,studi.score2,studi.ave); fclose(fp1);getch();void
5、 save(void) FILE *fp; int i; if(fp=fopen(stud.dat,wb)=NULL) printf(The file can not open!n); return; for(i=0;iSIZE;i+) if(fwrite(&studi,sizeof(struct student),1,fp)!=1) printf(file write error!n); return; fclose(fp); 运行结果如下所示: (2)将上题stud文件中的学生数据按平均分进行排序处理,将已排序的学生数据存在一个新文件stu_sort中。在向文件stud_sort写入数据后
6、,应检查验证stu_sort文件中的内容是否正确。程序如下:#include#include#define SIZE 5struct student char name10; long int num; float score3; float ave;studSIZE,work;void main() void sort(void); int i; FILE *fp1,*fp2;fp2=fopen(stu_sort.dat,rb);printf(nunsorted students scores list is as followsn);printf(-n);printf( name No.
7、score1 score2 score3 aven);printf(-n);for(i=0;iSIZE;i+) fread(&studi,sizeof(struct student),1,fp2); printf(%-10s %5ld %8.1f %9.1f %9.1f %8.2fn,studi.name,studi.num,studi.score0,studi.score1,studi.score2,studi.ave); fclose(fp2);getch();void sort(void) FILE *fp1,*fp2; int i,j; if(fp1=fopen(stud.dat,rb
8、)=NULL) printf(The file can not open!nn); exit(0); if(fp2=fopen(stu_sort.dat,wb)=NULL) printf(The file write error!n); exit(0); for(i=0;iSIZE;i+) if(fread(&studi,sizeof(struct student),1,fp1)!=1) printf(file read error!n); exit(0); for(i=0;iSIZE;i+) for(j=i+i;jSIZE;j+) if(studi.avestudj.ave) work=st
9、udi; studi=studj; studj=work; fwrite(&studi,sizeof(struct student),1,fp2); fclose(fp1); fclose(fp2); 运行结果如下所示: (3)将上题中已排序的学生成绩文件进行插入处理。插入一个学生的3门课成绩。程序先计算新插入学生的平均成绩,然后将它按成绩高低顺序插入,插入后建立一个文件。 要插入的学生数据为: 99108 Xin 90,95,60 在向新文件stu_new写入数据后,应检查验证sru_new文件中的内容是否正确。程序如下:#include#includestruct student char
10、 name10; long int num; float score3; float ave;stud10,s;void main()printf(nPlease input your want to add data:n); scanf(%s%ld%f%f%f,s.name,&s.num,&s.score0,&s.score1,&s.score2); s.ave=(s.score0+s.score1+s.score2)/3;n=i; printf(nafter add sorted students scores list is as followsn); printf(-n); print
11、f( name No. score1 score2 score3 aven); printf(-n); fp2=fopen(stu_new,rb); for(t=0;studt.aves.ave&tn;t+); for(i=0;it;i+) fwrite(&studi,sizeof(struct student),1,fp2); printf(%-10s %5ld %8.1f %9.1f %9.1f %8.2fn,studi.name,studi.num,studi.score0,studi.score1,studi.score2,studi.ave); fwrite(&s,sizeof(st
12、ruct student),1,fp2); printf(%-10s %5ld %8.1f %9.1f %9.1f %8.2fn,s.name,s.num,s.score0,s.score1,s.score2,s.ave); for(i=t;in;i+) fwrite(&studi,sizeof(struct student),1,fp2); printf(%-10s %5ld %8.1f %9.1f %9.1f %8.2fn,studi.name,studi.num,studi.score0,studi.score1,studi.score2,studi.ave); printf(n);fc
13、lose(fp1);fclose(fp2);getch();运行结果如下所示:四、实验总结。文件是程序设计中十分重要的概念。所谓“文件”,是指存储在外部存储介质上的一组具有名字的数据的集合。一批数据是以文件的形式存放在外部存储介质(如磁盘)上的,操作系统以文件为单位对数据进行管理,即如果要找到外部存储介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据;如果要向外部存储介质上存储数据也必须先建立一个文件,然后才能向它输入数据。 C 语言把文件看成是一个字符(字节)的序列,即文件由一个个字符(字节)的数据顺序组成,根据数据的组织形式,可分为 ASCII 文件和二进制文件。 AS
14、CII 文件又称文本(text)文件,它的每个字节存放一个 ASCII 代码,代表一个字符。二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。这类文件可以节省外存空间。如有一个文件元素为整数 127,则二进制代码表示为 01010101,只需占用一个字节,而用 ASCII 码形式存放 127,由于 ASCII 码与字符一一对应,一个字节代表一个字符,因此需三个字节存放 127 所对应的三个内部码 49(1 的 ASCII 码)、50(2 的ASCII 码)、55(7 的 ASCII 码),显然,ASCII 文件便于对字符进行输出或逐个处理,节省二进制与 ASCII 之间的转
15、换时间,但它要占用较多的存储空间。 在 C 语言中一个 C 文件可看成是一连串的字符(字节)流,对文件的存取是以字符(字节)为单位的,输入输出的数据流的开始和结束仅受程序控制而不受物理符号(回车换行符)控制,一般把这种文件称为流式文件。C 语言允许对文件存取一个字符,这就增加了处理的灵活性。 C 语言没有提供对文件进行操作的语句,所有的文件操作都是利用 C 编译系统所提供的库函数来实现。多数 C 编译系统都提供两种文件处理方式,即“缓冲文件系统”和“非缓冲文件系统”。 缓冲文件系统,是指系统自动地在内存区为每一个正在使用的文件名开辟一个缓冲区。从内存向磁盘输出数据,必须先送到内存缓冲区,装满缓
16、冲区后再送到磁盘。如果从磁盘向内存读入数据,则一次从磁盘文件中将一批数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区,如图 12.1 所示。缓冲区的大小由各个具体的 C 语言版本确定,一般为 512 个字节。 非缓冲文件系统,是指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。 用缓冲文件系统进行的输入输出又称为高级(或高层)磁盘输入输出,用非缓冲文件系统进行的输入输出又称为低级(或低层)输入输出,非缓冲文件系统所提供的函数依赖所使用的操作系统,通用性较差。本章重点介绍缓冲文件系统的文件操作函数。 无论是使用缓冲文件系统还是非缓冲文件系统,在对文件进行操作时,一般包括以下几个步骤: 打开文件; 文件处理,包括文件读写操作等; 关闭文件。 每个文件在读写之前都必须先打开,只有在打开文件之后,才能进行文件的读写操作,当一个文件操作完之后,都必须关闭该文件。 每一个文件被打开或创建之后,都有一个唯一确定该文件的文件标识,以后对该文件的处理都是通过该文件标识进行的。 2010年 月 日
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2