2012-04-18 1 views
0

各レコードの名前、年齢、GPAを含むテキストファイルがあります。私はファイルの平均gpa(クラス全体)を計算する関数getgpaを作成しました。問題は、field1(name)、field2(age)およびfield3(gpa)を抽出すると、クラス全体の平均gpaを簡単に計算できることです。しかし、フィールド3のみを抽出しようとすると、結果はありません。各レコードのfield3(gpa)のみをどのように抽出できますか?私の抽出機能はすぐ下にあります。私はDev-C++を使用しています。あなたの助けは非常に高く評価されます。ありがとう。ファイルから各レコードのフィールドを1つだけ抽出する必要がありますが、機能しません。

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

'if(IS >> field1 >> field2 >> field3)//問題がどこにあるのですか?あなたは3つのフィールドをすべて抽出すると言っています。問題はどこですか? –

+0

私は 'IS >> field1 >> field2 >> field3'をwhileループに移動することは' eof'を基にするよりもうまくいくと考えています。 http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.5 – chris

+0

を参照してくださいif(IS >> field1 >>)の代わりに(IS >> field3)フィールド2 >>フィールド3)。私はクラスの全体的なGPAを計算するためにfield3しか必要ないからです。だから私は3つのフィールドすべてを抽出するのではなく、計算に必要なものだけを抽出したいと思う。しかし、私はそうしても機能しません。 – T4000

答えて

0

私はちょうど場合記述しようとしています(IS >>フィールド3)の代わりにifの(IS >>フィールド1フィールド2 >> >>フィールド3)。

ISはファイル内の現在の位置を保持するため、これは機能しません。 if(IS>>field3)を実行すると、ファイルの現在の位置がfield1を抽出しようとしているため、抽出が失敗します。なぜなら、コメントで提案されているように

あなたはどちらか(コードにあなたがそれを持って道を維持するために、またはfield1field2以来使用されていない、彼らは使い捨ての変数であることを示す名前を変更する必要もwhileループの内側であれば移動抽出に失敗したように、ループ)は、すぐにfalseになりながら:

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

別のオプションは、ストリームインジケータの現在の位置を変更するtellgseekgを使用することですが、あなたのラインの長さが異なる場合、これはおそらく」にISN良い解決策です。

また、別のオプションはstd::getlineを使用し、各行を最初に抽出してから作業することですが、それはうまくいくと思います。

+0

今、私はそれを得ました、私はフィールド3を使用することで、このコードを少し効率的にすることができたと思いました。あなたはISの仕組みをはっきりと説明してきたので、私はそれをそのまま保ちます。ご協力いただきありがとうございます。 – T4000

関連する問題