摘要:运用C语言的读写技术,可将磁盘文件中的数据读入到计算机内存,处理完后的数据或中间结果依然可以输出到磁盘文件中永久保存。该文以“评分处理程序”的实现为例,阐述了C语言文件处理的一般流程和方法。
关键词:C语言;文件处理;程序
中图分类号:TP312文献标识码:A文章编号:1009-3044(2010)17-4711-03
Based on C Language Program of the Realization of File Processing and Analysis
YU Min
(Changzhou Liu Guojun Vocational Technology College,Changzhou 213000, China)
Abstract: Using read and write technical of C language, you can read data from a disk file to the computer memory, after processing the data or intermediate results still can output to disk file permanent preservation. This article by "rating of handling procedures" as an example, this paper expounds the C language file processing method and process of the general.
Key words: C language; file handling; program
C语言具有较强的文件处理功能。C文件是典型的流式文件。在c语言中,文件被视为一个字符的序列,是由一个一个字符的数据顺序组成,而文件的存取是以字符为单位。根据数据的组织形式,C文件可分为文本文件(ASCⅡ文件)和二进制文件。
运用C语言,可以编制程序实现对一个已经存在的记录文件中的数据进行处理,结果信息既可显示到屏幕终端,也可再次保存到磁盘文件中去。本文以“评分处理程序”的实现为例,阐述了C语言文件处理的一般流程和方法。
1 需求分析
某竞赛活动,聘请十位专家作为评委为八位参赛选手进行现场打分,现已将选手的评分存于文本文档score.txt中,试以此为原始数据,去掉一个最高分和一个最低分后取余下分数的平均分,作为每位选手的最终得分并按此由高到低排名后存入文本文档result.txt中。
1.1 处理流程
事务处理流程(不包括数据处理的具体过程)如图1所示。
1.2 具体任务
1) 从文本文件score.txt中(如图2所示),按格式读出原始数据显示到屏幕,求出每位选手的总分存total数组中并显示到屏幕。
2) 找出每位选手的最高分和最低分后显示到屏幕。
3) 总分去掉一个最高分和一个最低分后取余下分数的平均分作为每位选手的最终得分仍存total数组中并显示到屏幕。
4) 按最终得分由高到低排名后存入文本文件result.txt中(如图3所示)。
2 源文件分析
在文本文件score.txt中,以记录的形式存放了十位评委对八位参赛选手的打分。每行记录均按选手编号,选手姓名和十位评委的打分依次存放,且编号和姓名为字符,评委打分为保留二位小数的实数。如何将数据从文件读取到内存中?如何存放?根据前面介绍,C文件可视为由一个个字符数据顺序组成的字符序列。则可选用fscanf函数,从此文件流中执行格式化输入,将编号、姓名和分数按不同的格式读入到内存。读入后,可将八位选手的编号(三位字符)存放在二维字符数组number[8][4],姓名(不超过四个汉字即八个字符)存放在二维字符数组name[8][9],十位评委的打分则存放在二维实型数组score[8][10]中待处理。为方便读者理解数据读入前后在文件与内存中的存放形式,将score.txt文件内容划分成三大块对应内存中的number,name和score数组。
3 程序设计与实现
用C语言实现评分处理程序,使其具有读源数据文件、求总分、平均分、最高分、最低分、排序和写结果文件等功能。
3.1 序设计思路
C语言是面向结构的程序设计语言,且C程序是由函数构成的。根据功能设计本程序的函数包括:主函数main( )、读文件函数readfile( ) 、数据处理函数dealscore( ) 、求最高分函数max( ) 、求最低分函数min( ) 、排序函数getorder( )和写文件函数writefile( )。各函数间通过函数调用实现功能的整合,其中主函数分别调用读文件函数、数据处理函数、排序函数和写文件函数;数据处理函数再分别调用求最高分函数和求最低分函数。
3.2 程序流程图
本程序的执行流程如图4所示。
3.3 程序实现方法
1) 主函数:按一定顺序调用各功能函数,串起整个程序,实现本程序功能。
2) 读文件函数:主要实现从给定文件中读取数据存数组并按格式显示到屏幕。首先定义文件指针fpscore,再利用fopen函数打开文件,由于score.txt为文本文件,则选用“r”方式打开。然后读文件存相应数组,C语言中读文件的函数较多,有读入单个字符函数fgetc、读入字符串函数fgets、读入数据块函数fread(一般适用于二进制文件)和格式化读入函数fscanf。根据前面介绍的源文件分析及数据处理的要求,选择使用fscanf函数进行格式化读入,并且存入不同类型和大小的数组:number,name和score。fscnaf函数的原型是:fscanf(文件指针,格式字符串,输入表列);其中文件指针即为fpscore,格式字符串中依次为%s,%s和十个%f及\n,分别控制输入表列中的number[k],name[k]和score[k][0]~ score[k][9],按行循环地读入,其中k指第k位选手,每读完一行选手的数据,变量k就累加一次,故当本程序段执行完后,k正好为选手的人数。循环可利用while语句实现,只要不到文件末尾就读文件,关于是否已读到文本文件末尾,可用EOF判断或feof函数测试,此处用feof函数测试实现较为方便。最后利用fclose函数关闭该文件。
3) 数据处理函数:主要实现求每位选手的最终得分。首先利用for循环求出每位选手的十位评委的评分之和存入total数组,再调用max( ) 和min( )函数求出每位选手的最高分和最低分,最后按总分去掉一个最高分和去掉一个最低分后求平均的方法求出每位选手的最终得分。并将这些中间结果显示到屏幕,如图5所示。
4) 求最高分函数:主要实现求某位选手的最高分。函数为有参函数,形式参数为minscore[10],接收dealscore( )函数中实际参数score[i]的值,两者类型一致,且score[i]其实表示第i位选手的十个评分,故大小也一致,可以实现数据的传递。然后利用比较法求出一组数中的最大值即为最高分。最后用return语句返回最高分给主调函数待处理。实现代码如下:
/*求最高分函数*/
float max(float maxscore[10])
{int i;
float max=maxscore[0];
for(i=1;i
if(maxscore[i]>max) max=maxscore[i];
return(max);}
5) 求最低分函数:主要实现求某位选手的最低分。方法与求最高分类似,就不做说明。
6) 排序函数:主要实现将数据按最终得分由高到低排序。排序算法选用冒泡算法,算法中数据交换的条件是前一最终得分小于后一最终得分,值得注意的是:编号和姓名均为字符串,C语言中字符串的交换必须使用字符串处理函数strcpy()实现。另外,除了交换编号、姓名、最终得分外还需依次同时交换该相邻两位选手的十个评分,否则score数组中的数据将混乱。
实现代码如下:
/*排序函数*/
void getorder(char num[100][4],char xm[100][9],float cj[100][10],float sum[100],int t)
{int i,m,n;
char x[4],y[9];
float s,f;
for(m=1;m
{for(n=0;n
if(sum[n]
{strcpy(x,num[n]);strcpy(num[n],num[n+1]);strcpy(num[n+1],x);
strcpy(y,xm[n]);strcpy(xm[n],xm[n+1]);strcpy(xm[n+1],y);
for(i=0;i
{f=cj[n][i];cj[n][i]=cj[n+1][i];cj[n+1][i]=f;}
s=sum[n];sum[n]=sum[n+1];sum[n+1]=s; }}}
7) 写文件函数:主要实现将最终结果写入文本文件result.txt中。首先定义文件指针fpdkdz,再利用fopen函数打开文件,由于result.txt为文本文件,则选用“w”方式打开。然后将名次、编号、姓名、得分依次写入文件,C语言中写文件的函数也较多,有写入单个字符函数fputc、写入字符串函数fputs、写入数据块函数fwrite(一般适用于二进制文件)和格式化写入函数fprintf。根据要求选择使用fprintf函数进行格式化写入,每写完一位选手的结果就换一行。其中名次可用计数器i依次累加实现。最后利用fclose函数关闭该文件。
4 结论与分析
C语言中文件处理的一般步骤可归纳为:先利用fopen()函数配合恰当的使用方式打开文件,再选择适当的读写函数读写文件,最后切记一定要利用fclose()函数关闭该文件,以避免意外的发生。
笔者认为C语言文件操作时还应特别注意区分文本文件与二进制文件,根据文件类型和具体要求选择合适的文件使用方式。另外,在读写文件尤其是读文件时还应关注文件的位置指针,必要时可使用rewind()函数重定位或fseek()函数移动位置指针,进行随机读写。
C语言文件处理较为实用,许多可供实际使用的C程序中都包含文件处理,掌握好文件的使用,还需更多的实践和探索。
参考文献:
[1] 谭浩强.C语言程序设计[M].北京:清华大学出版社,2005.
[2] 向华.C语言程序设计[M].北京:清华大学出版社,2008.
[3] 周启海.C语言程序设计教程[M].北京:机械工业出版社,2004.