2014-05-19 67 views
2

我应该声明一个结构,其中包含未知数量学生的姓名和成绩。这是我如何做的:使用从文件读取的结构的函数不返回输出?

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文件总是空的。任何关于我在做什么的错误?

+3

'而(!EOF)'永远是假的,因为'EOF'是一个常数非零值。相反,从文件中读取并检查这些读取中的错误。 –

+1

避免尽可能地忽略'{'和'}',它可以创建微妙的错误...苹果公司在他们的SSL实现(又称失败)中的错误是由开发人员没有注意到的缺失卷曲引起的。 –

回答

2

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

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

应该检查所有读取的故障,而不仅仅是第一次。 –

1

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

此外...

由于您使用C++,我认为你应该使用一个std::vector<student>容纳所有学生的信息。然后,您不必担心在nr_students中统计学生人数并跟踪他们。

然后你可以从

void avg_promovability(fstream &outFile,student *info, int nr_students) 

avg_promovability签名更改为

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

我会建议超载提取运算符>>,并赋值运算符,=,取之名和三年级的临时学生,并将其分配给阵列。

然后..

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

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

erip

0

尝试与替换这行代码

while(!EOF) { 

while(infile!=EOF) {