《C语言》实验报告
一、实验题目:
文件的应用
二、实验目的:
1.进一步掌握与文件有关的概念。
2.熟悉对文件进行各种操作的函数的使用方法。
三、实验内容:
1.有n个学生,每个学生数据包括学号、姓名、性别、3门成绩、总成绩、平均成绩。从键盘输入n和n个学生的数据(总成绩和平均成绩可通过3门成绩算出),输入的n个学生的数据放入结构体数组a中。然后将学生数n和这n个学生的数据存储到名为stud.dat的二进制文件中。之后读入文件中的数据放到变量n1和结构体数组b中,输出数组b中的学生数据。编写源程序,给出注释及运行结果。
#include
/*包含头文件*/ struct student
/*声明一个结构体student*/ {
int num;
/*结构体中包含整型变量num*/ char name[16];
/*结构体中包含长度为16字符串型变量name*/ char sex;
/*结构体中包含字符型变量sex*/ int s[3];
/*结构体中包含长度为3的整型数组s*/ int total;
/*结构体中包含整型变量total*/ double aver;
/*结构体中包含浮点型的变量aver*/ };
void main ()
/*空类型的无参主函数*/ {
void input ( struct student *p , int *pn ) ;
- 1 -
《C语言》实验报告
/*声明空类型函数input函数包含一个指向结构体的指针变量p和一个指向整型变量的指针变量pn*/
void savef (struct student a[] , int n);
/*声明空类型函数savef函数包含一个结构体变量a[]和整型变量n*/ void readf (struct student b[] ,int *pn);
/*声明空类型函数readf函数包含一个结构体变量b[]和一个指向整型变量的指针变量pn*/
void print( struct student *p , int n );
/*声明空类型函数print函数包含一个指向结构体的指针变量p和整型变量n*/
struct student a[100],b[100];
/*定义student类型的长度为100数组变量a和b*/ int n,n1;
/*定义整型变量n和n1*/ input ( a , &n );
/*调用函数input其实参为a和n的地址*/ savef (a,n);
/*调用函数savef其实参为a和n*/ readf (b,&n1);
/*调用函数readf其实参为b和n1的地址*/ print (a,n1);
/*调用函数print其实参为a和n1*/ }
void input ( struct student *p,int *pn)
/*定义空类型的函数input其形参为一个指向结构体的指针变量p和一个指向整型变量的指针变量pn*/
{
int i;
/*定义整型变量i*/ char c;
/*定义字符型变量c*/
printf ( \
/*标准输出函数,屏幕上输出\ scanf ( \
/*标准输入函数,从键盘以整型输入一个数存到pn中*/ for( i = 0 ;i < *pn ;i++ )
/*当 i = 0 且i < *pn 时i自加一*/ {
printf (\ /*标准输出函数,屏幕上输出\其中\以整型输出最后换行 */
scanf (\
/*标准输入函数,从从键盘以整形和字符串输入2个数分别存到p[i].num和p[i].name中*/
- 2 -
《C语言》实验报告
while(c=getchar( ),c!='f'&&c!='m');
/*从键盘输入一个数存到c当c不等于f且c不等于m*/ p[i].sex=c;
/*把c赋值给p[i].sex*/
scanf (\
/*标准输入函数,以整型从键盘输入三个数存到p[i].s[0]和p[i].s[1]和p[i].s[2]中*/
p[i].total=p[i].s[0]+p[i].s[1]+p[i].s[2];
/*把p[i].s[0] + p[i].s[1] + p[i].s[2]赋值给p[i].total*/ p[i].aver=p[i].total/3.0;
/*把p[i].total / 3.0赋值给p[i].aver*/ } }
void savef(struct student a[],int n)
/*定义函数savef函数包含一个结构体变量a[]和整型变量n*/ {
FILE *fp;
/*定义一个指向文件的指针变量fp*/ int i;
/*定义整型变量i*/
fp = fopen(\
/*打开名字为stud.dat的文件,打开方式二进制读写*/ fwrite (&n,2,1,fp);
/*从n所指向的内存中,读入1个大小为2个字节的数据块写入到fp指向的文件*/
for (i=0;i /* 当i=0且i fwrite (&a[i],sizeof(struct student),1,fp); /*从a[i]所指向的内存中,读入一个大小为student大小的数据块写入到fp指向的文件*/ fflush(fp); /*将文件缓存中的数据刷到磁盘*/ } fclose(fp); /*关闭文件*/ } void readf(struct student b[] int*pn1) /*定义空类型的函数readf函数包含一个结构体变量b[]和一个指向整型变量的指针变量pn*/ { FILE *fp; /*定义一个指向文件的指针变量fp*/ int i; - 3 - 《C语言》实验报告 /*定义整型变量i*/ fp=fopen (\ /*打开名字为stud.dat的文件,打开方式二进制读*/ fread(pn1, 2,1,fp); /*从fp所指向的文件读入1个2个字节的数据,存到数组pn1中*/ for (i =0;i<*pn1;i++ ) /* 当i =0且i<*pn1时i自加一 */ fread(&b[i],sizeof(struct student),1,fp); /*从fp所指向的文件中读入1个大小为student大小的数据,存到b[i]中*/ fclose (fp); /*关闭文件*/ } void print(struct student*p,int n) /*定义空类型函数print函数包含一个指向结构体的指针变量p和整型变量n*/ { int i; /*定义整型变量i*/ printf(\标准输出函数No. name sex score1 score2 score3 total average\\n\ /*输出\ SEX SUBJECT1 SUBJECT2 SUBJECT3 TOTAL AVERAGE\并换行*/ for(i=0;i /*当 i=0且i printf(\ /*标准输出函数,以整型占4列宽度靠右侧从屏幕上输出p[i].num,以字符串型型占16列宽度靠右侧从屏幕上输出p[i].name,以字符型型占2列宽度靠左侧从屏幕上输出p[i].sex*/ printf(\ /*标准输出函数,以整型占8列宽度靠左侧从屏幕上输出p[i].s[0],p[i].s[1],p[i].s[2]*/ printf(\ /*标准输出函数,以整型占8列宽度靠左侧从屏幕上输出p[i].total,以浮点型占10列宽度保留2位小数靠左侧从屏幕上输出p[i].aver最后换行*/ } } 2.有6个学生,每个学生数据包括学号、姓名、3门课程的成绩和换行标志。可定义一个结构体数组存放这6个学生的数据: struct student { - 4 -