【问题标题】:Functions using structure read from file return no output?使用从文件读取的结构的函数不返回输出?
【发布时间】:2014-05-19 01:02:55
【问题描述】:

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

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(!EOF) 始终为 false,因为 EOF 是一个非零值的常量。相反,从文件中读取并检查这些读取是否有错误。
  • 尽可能避免省略{},这可能会产生微妙的错误... Apple 在其 SSL 实现中的错误(又名 goto 失败)是由缺少花括号引起的开发者没有注意到。

标签: c++ file structure average


【解决方案1】:

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

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

【讨论】:

  • 应该检查所有读取是否失败,而不仅仅是第一次。
【解决方案2】:

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

另外...

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

然后你可以将avg_promovability的签名从

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

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

【讨论】:

    【解决方案3】:

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

    那么..

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

    这将确保不会出现任何错误。 这可能是更好的做法,并且在出现 seg 错误时会使调试更容易。

    erip

    【讨论】:

      【解决方案4】:

      尝试替换这行代码

      while(!EOF) {
      

      有了这个

      while(infile!=EOF) {
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多