我有一个文本文件,其中包含每条记录的名称,年龄和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;
}
答案 0 :(得分:0)
我试图写if if(IS&gt;&gt; field3)而不是if(IS&gt;&gt; field1&gt;&gt; field2&gt;&gt; field3)。
这不起作用,因为IS
会保留您在文件中读取的当前位置。执行if(IS>>field3)
时,提取失败,因为文件中的当前位置正在尝试提取field1。
您需要按照自己的方式保存代码,或者由于未使用field1
和field2
,请更改名称,表明它们是一次性变量(同样在while循环中移动if)正如评论中所建议的那样,因为一旦提取失败,while循环将为false):
string dummy1; int dummy2;
...
while (IS>>dummy1>>dummy2>>field3)
另一个选择是使用tellg和seekg来更改流指示器的当前位置,但如果您的线路长度不同,这可能不是一个好的解决方案。
另外,另一种选择是使用std::getline
并先提取每一行,然后使用它,但我认为你的方式很好。