繁体   English   中英

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

[英]Functions using structure read from file return no output?

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

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文件始终为空。 关于我在做什么错的任何建议吗?

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

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

@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) 

我建议重载提取运算符>>和赋值运算符=,以输入临时学生的姓名和三年级并将其分配给数组。

然后..

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

这将确保不会遗漏任何错误。 这可能是更好的做法,如果出现段错误,将使调试更加容易。

erip

尝试替换此行代码

while(!EOF) {

有了这个

while(infile!=EOF) {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM