C++ 我只需要从文件中提取每条记录的一个字段,但它不起作用

C++ 我只需要从文件中提取每条记录的一个字段,但它不起作用,c++,file,field,extract,fstream,C++,File,Field,Extract,Fstream,我有一个文本文件,其中包含每个记录的名称、年龄和gpa。我编写了一个函数getgpa,它应该计算文件(整个类)的平均gpa。问题是,当我提取field1(name)、field2(age)和field3(gpa)时,我可以很容易地计算出整个类的平均gpa。但是当我试图只提取字段3时,我没有结果。如何仅提取每条记录的字段3(gpa)?我要提取的函数就在下面。我正在使用Dev-C++。非常感谢你的帮助。谢谢 int student::getgpa() { double field3, gpa;

我有一个文本文件,其中包含每个记录的名称、年龄和gpa。我编写了一个函数getgpa,它应该计算文件(整个类)的平均gpa。问题是,当我提取field1(name)、field2(age)和field3(gpa)时,我可以很容易地计算出整个类的平均gpa。但是当我试图只提取字段3时,我没有结果。如何仅提取每条记录的字段3(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;
}
int student::getgpa()
{
双字段3,gpa;双sumGPA=0;整数计数=0;
字符串字段1;int字段2;
字符行[256];
coutfield2>>字段3)//问题出在哪里!
{     
sumGPA=sumGPA+field3;
计数++;
}
}
IS.close();
if(count>0)//只是为了使sur不被零除!!
库特
我试图编写just if(IS>>field3)而不是if(IS>>field1>>field2>>field3)

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

您需要保持代码的原有方式,或者由于未使用
field1
field2
,请更改指示它们是一次性变量的名称(也可以按照注释中的建议在while循环中移动if,因为一旦提取失败,while循环将为false):

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


另外,另一个选项是使用
std::getline
并首先提取每一行,然后使用该行,但我认为这样做很好。

if(is>>field1>>field2>>field3)//问题出在哪里您说过提取所有3个字段都有效。问题出在哪里?我相信将
IS>>字段1>>字段2>>字段3
直接移动到while循环中比将其基于
eof
效果更好。请看,我正在尝试编写just if(IS>>field3)而不是if(IS>>field1>>field2>>field3)。因为我只需要field3来计算班级的总平均成绩。所以我不想提取所有三个字段,只提取我计算所需的一个字段。但是当我这样做的时候,它就不起作用了。现在我明白了,我想我可以通过只使用field3来提高代码的效率。既然你清楚地解释了它是如何工作的,我就保持原样。谢谢你的帮助和时间。
string dummy1; int dummy2;
...
while (IS>>dummy1>>dummy2>>field3)