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

时间:2012-04-18 03:35:33

标签: c++ file field extract fstream

我有一个文本文件,其中包含每条记录的名称,年龄和gpa。我写了一个函数getgpa,它应该计算文件的平均gpa(整个类)。问题是当我提取field1(name),field2(age)和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;
}

1 个答案:

答案 0 :(得分:0)

  

我试图写if if(IS&gt;&gt; field3)而不是if(IS&gt;&gt; field1&gt;&gt; field2&gt;&gt; field3)。

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

您需要按照自己的方式保存代码,或者由于未使用field1field2,请更改名称,表明它们是一次性变量(同样在while循环中移动if)正如评论中所建议的那样,因为一旦提取失败,while循环将为false):

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

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

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