2017-02-15 7 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 플래그가 스트림에 설정되어 루프 조건이 false가됩니다 그리고 루프를 끝내야합니다.

가능한 해결 방법은 while 행을 문자열로 읽어 들이고 해당 문자열을 std::istringstream 객체에 넣은 다음 비어 있지 않은 열을 지금 읽는 것입니다. 그런 다음 입력 문자열 스트림에서 빈 열을 읽을 수 있습니다.

또 다른 해결 방법은 해당 열이 이고 비어 있다고 가정하면을 단순히 읽지 않는 것입니다.

+0

그래, 나는 내가 그 사람들을 읽고 있다는 것을 몰랐다는 것을 믿을 수 없다! 하지만 지금, 불행히도 오류가 발생했습니다 : 0x508F4B19 (vcruntime140d.dll)에서 처리되지 않은 예외 OLA1.exe : 0xC0000005 : 0xCCCCCCCC 위치를 작성하는 액세스 위반. – gavsta707

+0

Nevermind, 내 문제는 내가 개체의 배열에 선언 된 개체의 수를 파일의 양을 반영하기 위해 다양하게 만드는 것을 잊었다는 것입니다! 모두 이제 해결되었습니다! – gavsta707

+0

@ gavsta707 그렇기 때문에 고정 크기 배열을 사용하지 말고 대신'std :: vector'를 사용해야합니다. 요소를 추가 할 때 동적으로 커집니다. :) –