2017-02-15 11 views
0

問題の説明がファイルは、最初の行のみを読み込み、その後

を終了し、基本的に、私の「Roster.h」ヘッダファイルの内部では、私は、学生のクラス(から「学生」オブジェクトの配列を持っています関数changeScore、SetID、setTotal、setLetterGrade)を呼び出します。下に添付される関数では、データの最初の行を読み込み、その後while条件で終了します。私は今この問題を何時間も見つめており、2番目(または3番目)の目を使用することができます。私が最も効果的なプログラマーではないことを知っているので、どんな批評も高く評価されています。 "m_studentnum"は、コンストラクターで0に初期化されるプライベートデータです。前もって感謝します!

コード

void Roster::readStudentRecord(string file) 
{ 
    ifstream in; 
    string studentID; 
    string line; 
    int ola, cla, quiz, homework, exam, bonus, total, final = 0; 

    in.open(file.c_str()); 

    getline(in, line); 
    while (in >> studentID) { 
     in >> cla >> ola >> quiz >> homework >> exam >> bonus >> total >> final; 
     m_students[m_studentNum].Student::setID(studentID); 
     m_students[m_studentNum].Student::changeScore(Student::CLA, cla); 
     m_students[m_studentNum].Student::changeScore(Student::OLA, ola); 
     m_students[m_studentNum].Student::changeScore(Student::QUIZ, quiz); 
     m_students[m_studentNum].Student::changeScore(Student::HOMEWORK, homework); 
     m_students[m_studentNum].Student::changeScore(Student::EXAM, exam); 
     m_students[m_studentNum].Student::changeScore(Student::BONUS, bonus); 
     total = cla + ola + quiz + homework + exam + bonus; 
     m_students[m_studentNum].Student::setTotal(total); 
     if (total >= 90) { 
      m_students[m_studentNum].Student::setLetterGrade('A'); 
     } 
     else if (total >= 80 && total < 90) { 
      m_students[m_studentNum].Student::setLetterGrade('B'); 
     } 
     else if (total >= 70 && total < 80) { 
      m_students[m_studentNum].Student::setLetterGrade('C'); 
     } 
     else if (total >= 60 && total < 70) { 
      m_students[m_studentNum].Student::setLetterGrade('D'); 
     } 
     else { 
      m_students[m_studentNum].Student::setLetterGrade('F'); 
     } 
     m_studentNum++; 
    } 
} 

私はgetl​​ineのをやっている -NOTEは、「データ列の

ID   CLA OLA Quiz Homework Exam Bonus Total FinalGrade 
c088801 10 15  4   15  56  5 
c088802  9 12  2   11  46  2 
c088803  8 10  3   12  50  1 
c088804  5  5  3   10  53  3 
c088805  3 11  1   10  45  0 
c088806  8 14  2   11  40  -1 
c088807  4 12  2   12  48  -2 
c088808 10 10  3   11  36  0 
c088809  8  8  3   11  39  0 
c088810  6  9  4   9  47  3 
c088811  8  7  3   13  41  3 
c088812  4 11  3   11  37  1 
+0

あなたはこのファイルの最初の数行を表示してください。もちろん –

+0

!ごめんなさい!私はそのhahaを含めることを意味しました – gavsta707

+0

あなたは今すぐ編集する必要があります@Someprogrammerdude – gavsta707

答えて

1

"合計" との見出しで読み取る取得するデータファイルFinalGrade "の列は空であり、無条件にそれらを読み込もうとします。

これを実行しようとすると、入力には次の行からの「ID」が含まれ、それは整数ではないため、ループ条件がfalseになるようにストリームにfailbitフラグが設定されますループを終了します。

可能な解決策の1つは、while行を文字列に読み込み、その文字列をstd::istringstreamオブジェクトに置き、今度は空でない列を読み取ることです。次に、入力文字列ストリームから空の列を読み込もうとします。

これらの列がであるとすると、もう1つの解決策は、が空であると仮定すると、単純にそれらを読み取らないことです。

+0

ええ、私はそれらを読んでいたことに気付かなかったとは思えません!しかし、私は残念ながらエラーを受け取りました。OLA1.exeの0x508F4B19(vcruntime140d.dll)の未処理の例外:0xC0000005:0xCCCCCCCCという場所にアクセス違反を書き込んでいます。 – gavsta707

+0

私の問題は、オブジェクトの配列で宣言されたオブジェクトの数をファイルの量に応じて変えることを忘れたことでした。すべては今修正されました! – gavsta707

+0

@ gavsta707だから、固定サイズの配列ではなく、代わりに 'std :: vector'を使うべきです。要素を追加すると、動的に成長します。 :) –

関連する問題