[英]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.