0

各記録の名前、年齢、GPA を含むテキスト ファイルがあります。ファイル (クラス全体) の平均 gpa を計算する関数 getgpa を作成しました。問題は、フィールド 1 (名前)、フィールド 2 (年齢)、フィールド 3 (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>>field1>>field2>>field3) の代わりに if(IS>>field3) だけを書こうとしています。

ISファイル内の現在の位置を保持しているため、これは機能しません。を実行するif(IS>>field3)と、ファイル内の現在の位置が field1 を抽出しようとしているため、抽出は失敗します。

コードをそのままにしておく必要があるか、使用されfield1field2いないため、それらが使い捨て変数であることを示す名前を変更します (また、while ループが false になるため、コメントで提案されているように、while ループ内に if を移動します)。抽出に失敗するとすぐに):

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

別のオプションは、tellgseekgを使用してストリーム インジケーターの現在の位置を変更することですが、行の長さが異なる場合、これはおそらく適切な解決策ではありません。

また、別のオプションは、std::getline最初に各行を使用して抽出してから、それを操作することですが、あなたのやり方で問題ないと思います。

于 2012-04-18T04:20:06.467 に答える