2017-02-15 97 views
0

问题描述文件读出功能仅读取然后第一行退出

基本上,内部我的“Roster.h”头文件,我有来自学生类“学生”对象的数组(其包括函数changeScore,SetID,setTotal,setLetterGrade)。在下面将要附加的函数中,它只读取第一行数据,然后在while条件下退出。我一直盯着这个问题几个小时,可以使用第二(或第三)双眼睛。任何批评也是值得赞赏的,因为我知道我不是最有效的程序员。应该指出,“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++; 
    } 
} 

数据文件,以获得阅读 - 注意,我在做一个函数getline在标题为数据列的

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

!抱歉!我的意思是包括那个哈哈 – gavsta707

+0

你现在应该会看到编辑@Someprogrammerdude – gavsta707

回答

1

“总” 和“ FinalGrade“列是空的,你无条件地尝试阅读它们。

当您尝试这样做时,输入将包含来自下一行的“ID”,并且因为它不是整数,所以导致为流设置failbit标志,导致循环条件为假和循环结束。

一种可能的解决方案是将while行读入字符串,将该字符串放入std::istringstream对象中,然后像现在这样读取非空列。然后尝试从输入字符串流中读取可能的空列。

另一种解决方案,如果那些列是假设是空的,就是根本不读它们。

+0

是的,我不能相信我没有注意到我正在阅读那些!但我现在,不幸得到错误:OLA1.exe中的0x508F4B19(vcruntime140d.dll)未处理的异常:0xC0000005:访问冲突写入位置0xCCCCCCCC。 – gavsta707

+0

没关系,看来我的问题是,我忘记使对象数组中声明的对象数量不同,以反映文件中的数量!现在全部修好了! – gavsta707

+0

@ gavsta707这就是为什么你不应该使用固定大小的数组,而是'std :: vector'。它们在向它们添加元素时动态增长。 :) –

相关问题