Задачка по C++ Таблица студентов с отличными оценками

нужна помощь по задачке на c++, не получается выполнить. Нужно вывести таблицу, содержащую номера, фамилии, оценки студентов, которые имеют только отличные оценки.

Данные: Иванчук С.О. (оценки 4 3 3 4) Панченко И.А.(5 4 4 5) Заец О.М. (3 4 4 4) Вельбицький П.О(4 3 3 3) Сидоренко В.Р.(2 3 3 2) Кравченко З.И.(3 5 4 5) Якубов Р.Н.(5 4 4 3) Зоренко П.М.(4 2 3 3) Берестяк Г.С.(4 5 5 5) Дячик Н.С. (5 5 4 4)

Пробовал вручную всё прописывать, пробовал с помощью 2 файлов, но всё никак не получается(

Попытка:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
 
using namespace std;
 
int end(int ret = 0){cout << "\nEND\n"; return ret;}
 
template <typename T>
ostream& operator<<(ostream& out, vector<T>& vT)
{
    for(int i = 0; i < vT.size(); i++)
        out << vT[i] << ' ';
    return out;
}
 
class student
{
    string name, sname;
    vector<int> marks;
public:
    student();
    void get_marks(vector<int>&);
    void chng_mark(int, int);
    bool is_good_boy();
    friend ifstream& operator>>(ifstream&, student&);
    friend ostream& operator<<(ostream&, student&);
};
 
student::student(){}
void student::get_marks(vector<int>& in)
{
    marks = in;
}
void student::chng_mark(int wh, int tw)
{
    marks[wh] = tw;
}
bool student::is_good_boy()
{
    for(int i = 0; i < marks.size(); i++)
        if(marks[i] < 4)
            return false;
    return true;
}
ifstream& operator>>(ifstream& fin, student& s)
{
    fin >> s.name;
    fin >> s.sname;
    return fin;
}
ostream& operator<<(ostream& out, student& s)
{
    out << "Student: " << s.name << ' ' << s.sname << endl
        << "Marks[" << s.marks.size() << "]: " << s.marks << endl; 
    return out;
}
 
ostream& operator<<(ostream& out, vector<student>& vec)
{
    for(int i = 0; i < vec.size(); i++)
        out << vec[i] << endl;
    return out;
}
 
int main()
{
    vector<student> data;
    ifstream fin("ffam.txt");
 
    while(fin)
    {
        data.push_back(student());
        fin >> data.back();
    }
    data.pop_back();
    fin.close();
 
    fin.open("fnote.txt");
 
    vector<int> tm;
    int i = 0;
    while(fin)
    {
        tm.clear();
        while(fin && fin.peek() != '\n')
        {
            tm.push_back(int());
            fin >> tm.back();
        }
        fin.get();
        data[i].get_marks(tm);
        i++;
    }
    fin.close();
 
    cout << "All students:\n" << data;
    cout << "Only good boys:\n";
    for(int i = 0; i < data.size(); i++)
        if(data[i].is_good_boy())
            cout << data[i] << endl;
 
    return end();
}

Далее файл с фамилиями студентов:

Иванчук С.О.
Панченко И.А.
Заец О.М.
Вельбицький П.О.
Сидоренко В.Р.
Кравченко З.И.
Якубов Р.Н.
Зоренко П.М.
Берестяк Г.С.
Дячик Н.С.

И файл с оценками:

4 3 3 4
5 4 4 5
3 4 4 4
4 3 3 3
2 3 3 2
3 5 4 5
5 4 4 3
4 2 3 3
4 5 5 5
5 5 4 4

Компилятор же выдает это:

All students:
Student: Иванчук С.О.
Marks[41]: 4 3 3 4 5 4 4 5 3 4 4 4 4 3 3 3 2 3 3 2 3 5 4 5 5 4 4 3 4 2 3 3 4 5 5 5 5 5 4 4 0 

Student: Панченко И.А.
Marks[0]: 

Student: Заец О.М.
Marks[0]: 

Student: Вельбицький П.О.
Marks[0]: 

Student: Сидоренко В.Р.
Marks[0]: 

Student: Кравченко З.И.
Marks[0]: 

Student: Якубов Р.Н.
Marks[0]: 

Student: Зоренко П.М.
Marks[0]: 

Student: Берестяк Г.С.
Marks[0]: 

Student: Дячик Н.С.
Marks[0]: 

Only good boys:
Student: Панченко И.А.
Marks[0]: 

Student: Заец О.М.
Marks[0]: 

Student: Вельбицький П.О.
Marks[0]: 

Student: Сидоренко В.Р.
Marks[0]: 

Student: Кравченко З.И.
Marks[0]: 

Student: Якубов Р.Н.
Marks[0]: 

Student: Зоренко П.М.
Marks[0]: 

Student: Берестяк Г.С.
Marks[0]: 

Student: Дячик Н.С.
Marks[0]: 


END


** Process exited - Return Code: 0 **`**

Ответы (1 шт):

Автор решения: DmitryK

Ну если пройдетесь дебаггером то увидите, что все оценки из файла вводятся за один цикл и попадают 1 ученику в списке. Потому что условие цикла fin.peek() != '\n' не срабатывает.

        while(fin && fin.peek() != '\n')
        {
            tm.push_back(int());
            fin >> tm.back();
        }

У меня сработало условие fin.peek() != '\r' - это зависит от системы и входного файла. Вообще такой принцип детектирования конца строки наверное не самый лучший. Раз у вас оценки одного ученика находятся в одной строке - считайте строку. Она всегда считается до корректного разделителя в системе. И потом разбирайте строку на отдельные оценки.

→ Ссылка