2016-07-21 46 views
0

我是C++編程的初學者,我有一個關於從文件讀入特定類對象的問題,其中一個是數組。從文件讀取到不同的類對象

我的類對象:

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文件來定義功能:

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;  
} 

我需要做的是從文件中讀取並保存Student類的lastName對象下的叫什麼名字。然後我需要將每個等級保存在數組對象中。然後,我需要爲下一個名稱創建一個新的Student類對象,併爲4個名稱重複該過程。我從閱讀的文件:

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

我似乎不明白的是如何將文件讀入不同的類對象。例如,我將有4個學生類的對象,前兩行將被讀取到第一個對象,然後接下來的兩行是第二個對象,依此類推。 –

回答

1

您的以下功能似乎是錯誤的:

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; 
} 

你讀的lastName兩次,你不要忽略「」性格...你可以試試這樣的:

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: 如果考慮內lastName的空間,你應該有改變的第一行使用std ::函數getline如下:

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); 
} 

... ...和足夠的更新!

+0

謝謝,我假設我不需要getline,因爲沒有空格。 –

+0

更多沿着你的線不需要'getline',因爲你不關心線條。混合'getline'和'>>'是有問題的,因爲'>>'可以在流中留下行結尾作爲getline的陷阱。請記住在嘗試使用剛剛讀入的「學生」之前測試'istream'的狀態。如果任何讀取失敗,則不能相信「Student」,「istream」將處於不可用狀態。 – user4581301

+0

我解決了這個問題,但是我似乎不明白的是如何將文件讀入不同的類對象。例如,我將有4個學生類的對象,前兩行將被讀到第一個對象,然後接下來的兩行是第二個對象,依此類推。 –