《C语言》课内实验报告8

更新时间:2023-12-16 18:56:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《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 -

《C语言》实验报告

int num; char name[20]; int score[3]; char flag; }a[6];

从键盘输入6个学生的数据,其中flag的值应为‘\\n’。然后将这6个学生的数据分别写入名为stud1.txt的文本文件和名为stud2.dat的二进制文件中。编写源程序,给出注释及运行结果。

#include /*包含头文件*/ struct student /*声明结构体student*/ {

int num;

/*结构体中包含整型变量num*/ char name[20] ;

/*结构体中包含长度为20字符串型变量name*/ int score[3];

/*结构体中包含长度为3的整型数组score[3]*/ char flag;

/*结构体中包含字符型变量flag*/ }a[6];

/*在结构体中定义长度为6的student变量a*/ void main()

/*空类型的无参主函数*/ {

void input(struct student *p); /*声明空类型函数input函数包含一个指向结构体的指针变量p*/ void print(struct student *p,int n); /*声明空类型函数print函数包含一个指向结构体的指针变量p和整型变量n*/

FILE *fp ;

/*定义一个指向文件的指针变量fp*/ int n=6;

/*定义整型变量n并赋初值6*/ input(a);

/*调用函数input其实参为a*/ print(a,n);

/*调用函数print其实参为a和n*/ fp=fopen(\

/*打开名字为stud1.txt的文件,打开方式为只写,并将fopen带回的

- 5 -

《C语言》实验报告

指针赋给fp*/

fwrite(a,sizeof(struct student),6,fp); /*从a所指向的内存中,读入6个大小为student大小的数据块写入到fp所指向的文件中*/

fclose(fp); /*关闭文件*/

fp=fopen(\ /*打开名为stud2.dat的文件,打开方式为二进制只写,并将fopen带回的指针赋给fp*/

fwrite(a,sizeof(struct student ),6,fp); /*从a所指向的内存中,读入6个大小为student大小的数据块写入到fp所指向的文件中*/

fclose(fp); /*关闭文件*/ }

void input(struct student *p)

/*定义空类型的函数input其形参为一个指向结构体的指针变量p*/ { int i;

/*定义整型变量i*/ for(i =0;i<6;i++) /*i从0到5进行循环*/ { printf(\请输入 第%d名同学 数字,姓名,三门成绩:\\n\+ 1 ) ;

/*标准输出函数,屏幕上输出\请输入 第%d名同学 数字,姓名,三门成绩:\其中\以整型输出最后换行 */

scanf(\ /*标准输入函数,从从键盘以整形和字符串输入2个数分别存到p[i].num和p[i].name中*/

scanf(\ /*标准输入函数,以整型从键盘输入三个数存到p[i].score[0]和p[i].score[1]和p[i].score[2]中*/

p[i].flag=getchar(); /*把数的一个字符赋给p[i].flag*/ } }

void print(struct student *p,int n)

/*定义空类型函数print函数包含一个指向结构体的指针变量p和整型变量n*/

{

int i;

/*定义整型变量i*/

- 6 -

《C语言》实验报告

printf(\数字 姓名 课程1 课程2 课程3 \\n\

/*标准输出函数,输出\数字 姓名 课程1 课程2 课程3 \并换行*/

for(i=0;i

printf(\ /*标准输出函数,以整型占8列宽度靠左侧从屏幕上输出p[i].score[0],p[i].score[1],p[i].score[2]*/

} }

四、实验结果:

1、输出结果:

2、输出结果:

- 7 -

《C语言》实验报告

五、实验体会或遇到问题:

1、还需要继续看书,多看,多做。

2、虽然做课内实验很麻烦,但能收获很多,使知识得到运用。 3、当真正自己去敲代码时才能发现许多细节上的问题。 4、对于文件存储,读取,及其所在位置理解掌握不够。 5、还需努力。

- 8 -

《C语言》实验报告

- 9 -

本文来源:https://www.bwwdw.com/article/wid5.html

Top