c++中类对象数组如何读取文件?

如学生管理系统,将学生定义成类,再定义学生数组后,如何读取外部的txt文件中相应数据给student[1],[2]....比如能不能这样infile>>student[i].getnumber()>>student[i].getname();

用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 ;
}

输入文件格式: 学号 姓名 语文分数 英文分数

计算总分,平均,名次,等级后输出全部结果

温馨提示:内容为网友见解,仅供参考
无其他回答