0

我有一个文本文件,其中包含每条记录的名称、年龄和 gpa。我写了一个函数 getgpa 应该计算文件(整个类)的平均 gpa。问题是当我提取field1(姓名)、field2(年龄)和field3(gpa)时,我可以很容易地计算出全班的平均gpa。但是当我尝试只提取 field3 时,我没有任何结果。如何仅提取每条记录的 field3 (gpa)?我要提取的功能就在下面。我正在使用 Dev-C++。您的帮助将不胜感激。谢谢。

int student::getgpa()
{
  double field3, gpa; double sumGPA=0; int count=0;
  string field1; int field2;
  char line[256];
  cout<<"call of the function 'getgpa' " <<endl;   
  ifstream IS ("student.dat", ios::in);

  while (!IS.eof())
   {
     if(IS>>field1>>field2>>field3)  //where the problem is!
     {     
       sumGPA=sumGPA+field3;
       count++;
     }
   }
   IS.close();

    if (count>0)  //just to make sur not to divide by zero!!
    cout<<"gpa of the students:" <<sumGPA/count<<endl;
}
4

1 回答 1

0

我试图只写 if(IS>>field3) 而不是 if(IS>>field1>>field2>>field3)。

这将不起作用,因为IS将您正在读取的当前位置保留在文件中。当您这样做时if(IS>>field3),提取失败,因为文件中的当前位置正在尝试提取 field1。

您要么需要按照您的方式保留代码,要么因为field1并且field2未使用,更改名称以指示它们是一次性变量(也按照注释中的建议将 if 移动到 while 循环内,因为 while 循环将是错误的一旦提取失败):

string dummy1; int dummy2;
...
while (IS>>dummy1>>dummy2>>field3)  

另一种选择是使用tellgseekg来更改流指示器的当前位置,但如果您的行长度不同,这可能不是一个好的解决方案。

此外,另一种选择是先使用std::getline并提取每一行,然后再使用它,但我认为你拥有它的方式很好。

于 2012-04-18T04:20:06.467 回答