去掉len,不在接收read_datas函数的返回值,read_datas函数不在返回整形类型的值
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 19
typedef struct
{
int id; //球员的编号
char fname[LEN]; //球员的名;
char lname[LEN]; //球员的姓;
int stage_num; //球员的上场次数;
int hit_num; //球员的击中数;
int base_num; //球员的走垒数;
int rbi; //球员的打点;
float hit_rate; //球员的安打率;
} TEAM;
void clean_trash(TEAM players[], int n);
void read_datas(TEAM players[], int n, FILE *fp);
void count_hit_rate(TEAM players[], int n);
void show_messages(TEAM players[], int n);
void main(void)
{
FILE *fp;
//int len;
TEAM players[LEN];
if ((fp = fopen("1.txt", "r")) == NULL)
{
fprintf(stderr, "Can't open file datas.txt.\n");
exit(EXIT_FAILURE);
}
clean_trash(players, LEN); //为累计数据之和做准备,清理内存;
//int TCH = 0;
//len = read_datas(players, LEN, fp,TCH); //统计文件中不同球员的数量;
//TCH = 0;
read_datas(players, LEN, fp);
count_hit_rate(players, LEN);
show_messages(players, LEN);
if (fclose(fp) != 0)
{
fprintf(stderr, "Can't close file datas.txt.\n");
exit(EXIT_FAILURE);
}
}
void clean_trash(TEAM players[], int n)
{
int i;
for (i = 0; i < n; i++) //原数组内容全部清零
{
players[i].id = 0;
players[i].stage_num = 0;
players[i].hit_num = 0;
players[i].base_num = 0;
players[i].rbi = 0;
memset(players[i].fname, 0, LEN);
memset(players[i].lname, 0, LEN);
}
}
void read_datas(TEAM players[], int n, FILE *fp)
{
int ch = 0;
int count = 0;
float hit_rate;
char fname[LEN], lname[LEN];
int m, stage_num, hit_num, base_num, rbi;
//fscanf如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
//这里会把.txt文件里的数据读取一行,来给while添加条件判断(确认文本中有7个数据)
count = fscanf(fp, "%d %18s %18s %d %d %d %d",
&m, fname, lname, &stage_num, &hit_num, &base_num, &rbi);
rewind(fp);//新定位到文件的开始,否则会从文本的第二行开始读取
while ((count == 7) && !feof(fp) && (ch < n))
{
if (players[m].stage_num == 0)//球员上场次数为0,就去访问下一个有效的球员信息数组
{
ch++;
}
//开始读取文本数据,放到定义的变量地址里
fscanf(fp, "%d %18s %18s %d %d %d %d",
&m, fname, lname, &stage_num, &hit_num, &base_num, &rbi);
players[m].id = m;
strcpy(players[m].fname, fname); //把文本中的球员信息赋给m这个有效数组里去
strcpy(players[m].lname, lname);
players[m].stage_num += stage_num;
players[m].hit_num += hit_num;
players[m].base_num += base_num;
players[m].rbi += rbi;
}
}
void count_hit_rate(TEAM players[], int n)
{
int i;
for (i = 0; i < n; i++)
{
players[i].hit_rate = (float)players[i].hit_num / (float)players[i].stage_num;
//计算每个运动员的安打率;
}
return;
}
void show_messages(TEAM players[], int n)
{
int i;
printf("Datas for all players:\n");
printf("Id First_name Last_name Stage Hit_rate Base_num RBI Hit_rate\n");
for (i = 0; i < n; i++) //把数组按照从0-19进行遍历输出
{
printf("%d %12s %10s %5d %7d %11d %8d %8.2f\n",
players[i].id, players[i].fname, players[i].lname,
players[i].stage_num, players[i].hit_num, players[i].base_num,
players[i].rbi, players[i].hit_rate);
}
return;
}