【问题标题】:I need to extract only one field of each record from a file, but it does not work我只需要从文件中提取每条记录的一个字段,但它不起作用
【发布时间】:2012-04-18 03:35:32
【问题描述】:

我有一个文本文件,其中包含每条记录的名称、年龄和 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;
}

【问题讨论】:

  • if(IS&gt;&gt;field1&gt;&gt;field2&gt;&gt;field3) //where the problem is! 你说提取所有 3 个字段都有效。问题出在哪里?
  • 我相信将IS&gt;&gt;field1&gt;&gt;field2&gt;&gt;field3 直接移动到while 循环中会比基于eof 更好。见parashift.com/c++-faq-lite/input-output.html#faq-15.5
  • 我试图只写 if(IS>>field3) 而不是 if(IS>>field1>>field2>>field3)。因为我只需要field3来计算班级的整体gpa。所以我不想提取所有三个字段,而只提取我计算所需的一个。但是当我这样做时它不起作用。

标签: c++ file field extract fstream


【解决方案1】:

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

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

您要么需要保持代码的原样,要么因为 field1field2 没有被使用,所以更改名称以表明它们是一次性变量(也将 if 移动到 while 循环中,如cmets,因为一旦提取失败,while循环就会为假):

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

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

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

【讨论】:

  • 现在我明白了,我认为我可以通过仅使用 field3 使这段代码更高效一些。既然您清楚地解释了 IS 的工作原理,我将保持原样。感谢您的帮助和时间。
猜你喜欢
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
相关资源
最近更新 更多