2016-07-21 5 views
0

私はC++コードの初心者です。ファイルから特定のクラスオブジェクトへの行の読み込みに関する質問があります。そのうちの1つは配列です。 ファイルから別のクラスオブジェクトへの読み込み

私のクラスオブジェクト:関数を定義する

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クラスの lastNameオブジェクトの下に名前を保存するために必要なもの
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クラスオブジェクトを追加し、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つのオブジェクトを持ち、最初の2行は最初のオブジェクトに読み込まれなければならず、次の2行は2番目のオブジェクトとなります。 –

答えて

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

ありがとうございます、スペースがないので私はgetl​​ineは必要ないと思っています。 –

+0

あなたは行を気にしないので、 'getline'は必要ありません。 'getline'と' >>'を混在させることは、 '>>'が 'getline'のブービートラップとしてストリームの行末を残すことができるので問題です。読み込んだ 'Student'を使う前に' istream'の状態をテストすることを忘れないでください。いずれかの読み込みに失敗した場合、 'Student'を信頼できず、' istream'は使用できなくなります。 – user4581301

+0

私はそれを修正しましたが、私が理解していないように見えるのは、ファイルを異なるクラスオブジェクトに読み込む方法です。例えば、私は学生クラスの4つのオブジェクトを持ち、最初の2行は最初のオブジェクトに読み込まれなければならず、次の2行は2番目のオブジェクトとなります。 –

関連する問題