我应该宣布一个结构,其中包含未知数量学生的姓名和成绩。我是这样做的:
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文件总是空的。关于我做错什么的任何建议?
答案 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) {