用fscanf 按固定格式读,比较好
也可以考虑读一行,然后用string类的查找函数(或C语言里的strtok函数)去找分隔符,然后分割
下面这个例子是用的strtok函数:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define lineLength 256
struct student
{
int number;
char name[64];
int score_A;
int score_B;
int total;
float ave;
int rank;
char level;
};
void main()
{
FILE *fp=fopen("d:/ex9.txt","rb");
if(fp==NULL)
{
printf("error in open file!");
return ;
}
int row=0;
char line[lineLength];
// how many students in the file
while((fgets(line,lineLength,fp))!=NULL) row++;
student *classroom=(struct student*)malloc(row*sizeof(struct student));
// read score of students
rewind(fp);
for(int i=0;i<row;i++)
{
fgets(line,lineLength,fp);
char*p;
p=strtok(line," \n");
classroom[i].number=atoi(p);
p=strtok(NULL," \n");
strcpy(classroom[i].name,p);
p=strtok(NULL," \n");
classroom[i].score_A=atoi(p);
p=strtok(NULL," \n");
classroom[i].score_B=atoi(p);
classroom[i].total=classroom[i].score_A+classroom[i].score_B;
classroom[i].ave=classroom[i].total/2.0f;
if (classroom[i].ave>=90) classroom[i].level='A';
else if(classroom[i].ave>=80) classroom[i].level='B';
else if(classroom[i].ave>=70) classroom[i].level='C';
else if(classroom[i].ave>=60) classroom[i].level='D';
else classroom[i].level='E';
}
// compute rank
float *avescore=(float*)malloc(row*sizeof(float));
for(int i=0;i<row;i++) avescore[i]=classroom[i].ave;
for(int i=0;i<row;i++)
for(int j=i;j<row;j++)
{
if (avescore[i]<avescore[j])
{
float temp=avescore[i];
avescore[i]=avescore[j];
avescore[j]=temp;
}
}
for(int i=0;i<row;i++)
for(int j=0;j<row;j++)
if(avescore[i]==classroom[j].ave) classroom[j].rank=i+1;
//output
for(int i=0;i<row;i++)
{
printf("%d ",classroom[i].number);
printf("%s ",classroom[i].name);
printf("%d ",classroom[i].score_A);
printf("%d ",classroom[i].score_B);
printf("%d ",classroom[i].total);
printf("%f ",classroom[i].ave);
printf("%d ",classroom[i].rank);
printf("%c\n",classroom[i].level);
}
return ;
}
输入文件格式: 学号 姓名 语文分数 英文分数
计算总分,平均,名次,等级后输出全部结果