使用从文件读取的结构的函数返回没有输出?

时间:2014-05-19 01:02:55

标签: c++ file structure average

我应该宣布一个结构,其中包含未知数量学生的姓名和成绩。我是这样做的:

struct student {
    char name[30];
    int grade1, grade2, grade3;
};

然后,我有一个文本文件,其中包含不同行上每个学生的信息。我这样读了。

student info[20];
int nr_students,i=0,k=0;
fstream inFile;
inFile.open("in.txt");
fstream outFile;
outFile.open("out.txt");

while(!EOF) {
    inFile>>info[i].name;
    inFile>>info[i].grade1;
    inFile>>info[i].grade2;
    inFile>>info[i].grade3;
    i++;

}
nr_students=i;
avg_promovability(outFile,info, nr_students);

我认为这不正常,因为nr_students显然是0。另外,第一个功能:

void avg_promovability(fstream &outFile,student *info, int nr_students)
{
    int i;
    float sum=0,j=0,avg;
    for (i=0;i<nr_students;i++)
        if(info[i].grade1 >=5 && info[i].grade2>=5 && info[i].grade3>=5 ) {
            sum=sum + info[i].grade1 + info[i].grade2 + info[i].grade3;
            j++;
        }
    avg=sum/(3*j);
    outFile<<avg;

}

它应该计算已经过的学生的平均成绩(也就是说,他们的所有成绩都是> = 5)。它并没有真正做到这一点,out.txt文件总是空的。关于我做错什么的任何建议?

4 个答案:

答案 0 :(得分:2)

这不是您检查文件末尾的方式。尝试

while (inFile>>info[i].name) {
     inFile>>info[i].grade1;
     inFile>>info[i].grade2;
     inFile>>info[i].grade3;
     i++;
}

答案 1 :(得分:1)

@VaughnCato的回答指出了不读取学生信息的核心问题。

此外...

由于您使用的是C ++,我认为您应该使用std::vector<student>来保存所有学生的信息。然后,您无需担心计算学生人数并在nr_students中跟踪他们。

然后您可以从

更改avg_promovability的签名
void avg_promovability(fstream &outFile,student *info, int nr_students) 

void avg_promovability(fstream &outFile, std::vector<student> const& info) 

答案 2 :(得分:0)

我建议重载提取运算符&gt;&gt;和赋值运算符=,以获取临时学生的名称和三个等级并将其分配给数组。

然后..

while(inFile >> student) {
   info[i] = student;
   i++;
}

这将确保没有任何错误。 这可能是更好的做法,并且在seg故障的情况下将使调试更容易。

erip

答案 3 :(得分:0)

尝试替换此行代码

while(!EOF) {

用这个

while(infile!=EOF) {