2016-07-21 17 views
0

Ich bin ein Anfänger in C++ - Codierung und ich habe eine Frage zum Lesen von Zeilen aus einer Datei in bestimmte Klassenobjekte, von denen eines ein Array ist.Lesen von Datei zu verschiedenen Klassenobjekten

Mein Klassenobjekt:

const int SIZE_OF = 5; 

class Student 
{ 
public: 
    Student(); 
    Student(const Student &); 
    Student(string, int, int, int, int, int); 
    friend std::istream& operator >> (std::istream& in, Student& S); 
    void display(); 
private: 
    string lastName; 
    int grades[SIZE_OF]; 
}; 

CPP-Datei Funktionen zu definieren:

Student::Student() 
{ 
    int i; 
    string lastName = "default"; 
    for (i = 0; i < 5; i++) 
    { 
     grades[i] = 0; 
    } 
} 

Student::Student(const Student & S) 
{ 
    int i; 
    lastName = S.lastName; 
    for (i = 0; i < 5; i++) 
    { 
     grades[i] = S.grades[i]; 
    } 
} 

Student::Student(string S, int a, int b, int c, int d, int e) 
{ 
    lastName = S; 
    grades[0] = a; 
    grades[1] = b; 
    grades[2] = c; 
    grades[3] = d; 
    grades[4] = e; 
} 

std::istream& operator >> (std::istream& in, Student& S) 
{ 
    std::string line; 
    std::getline(in, line); 
    in >> S.lastName >> S.grades[0] >> S.grades[1] >> S.grades[2] >> S.grades[3] >> S.grades[4]; 
    getline(in, S.lastName); 
    return in; 
} 

void Student::display() 
{ 
    int i; 
    int sum = 0; 
    double average; 
    cout << "Last Name: " << lastName << endl; 
    cout << "Grades: " << endl; 
    for (i = 0; i < 5; i++) 
    { 
     cout << grades[i] << endl; 
    } 
    for (i = 0; i < 5; i++) 
    { 
     sum = sum + grades[i]; 
    } 
    average = sum/5; 
    cout << "Average: " << average;  
} 

Was ich tun müssen, um aus einer Datei gelesen wird und den Namen, unter dem lastName Ziel der Student Klasse speichern . Dann muss ich jeden Grad im Array-Objekt speichern. Dann muss ich ein neues Student Klassenobjekt für den nächsten Namen haben und den Prozess für 4 Namen wiederholen. Die Datei lese ich aus:

George 
75,85,95,100,44 
Peter 
100,100,100,100,100 
Frank 
44,55,66,77,88 
Alfred 
99,88,77,66,55 
+0

Was ich nicht verstehe, ist, wie man die Datei in verschiedene Klassenobjekte einliest. Zum Beispiel hätte ich 4 Objekte der Studentenklasse und die ersten 2 Zeilen müssten zum ersten Objekt gelesen werden, dann die nächsten beiden Zeilen sind das zweite Objekt und so weiter. –

Antwort

1

Ihre folgende Funktion scheint falsch zu sein:

std::istream& operator >> (std::istream& in, Student& S) 
{ 
    std::string line; 
    std::getline(in, line); 
    in >> S.lastName >> S.grades[0] >> S.grades[1] >> S.grades[2] >> S.grades[3] >> S.grades[4]; 
    getline(in, S.lastName); 
    return in; 
} 

Sie lesen Nachnamen zweimal, Sie ignorieren nicht den ‚‘ Charakter ... versuchen so etwas wie dies:

std::istream& operator >> (std::istream& in, Student& S) 
{ 
    char dummy; 
    in >> S.lastName >> S.grades[0] 
     >> dummy >> S.grades[1] 
     >> dummy >> S.grades[2] 
     >> dummy >> S.grades[3] 
     >> dummy >> S.grades[4]; 

    return in; 
} 

UPDATE: Wenn Sie Leerzeichen innerhalb nachName betrachten, sollten Sie die erste Zeile ändern müssen std :: getline wie folgt zu verwenden:

Dann
std::istream& operator >> (std::istream& in, Student& S) 
{ 
    char dummy; 
    std::getline(in, S.lastName) 
    in >> S.grades[0] 
     >> dummy >> S.grades[1] 
     >> dummy >> S.grades[2] 
     >> dummy >> S.grades[3] 
     >> dummy >> S.grades[4]; 
    in.ignore(); // remove last '\n' 
    return in; 
} 

:

int main() 
{ 
    Student s; 
    std::vector<Student> all; 

    while (cin>>s) 
     all.push_back(s); 
} 

... und ... genug Updates!

+0

danke, ich nehme an, ich brauche keine getline, da es keine Leerzeichen gibt. –

+0

Mehr entlang der Linie von Ihnen brauchen nicht "getline", weil Sie sich nicht für die Linien interessieren. Das Mischen von "getline" und ">>" ist problematisch, da '>>' Zeilenenden im Stream als Sprengfallen für "getline" hinterlassen kann. Denken Sie daran, den Status des 'istream 'zu testen, bevor Sie versuchen, den' Student 'zu verwenden, in den Sie gerade eingelesen haben. Wenn einer der Lesevorgänge fehlgeschlagen ist, können Sie dem 'Student' nicht vertrauen, und der'Istream' wird in einem unbrauchbaren Zustand sein. – user4581301

+0

Ich habe das behoben, aber was ich nicht zu verstehen glaube ist, wie man die Datei in verschiedene Klassenobjekte einliest. Zum Beispiel hätte ich 4 Objekte der Studentenklasse und die ersten 2 Zeilen müssten zum ersten Objekt gelesen werden, dann die nächsten beiden Zeilen sind das zweite Objekt und so weiter. –