Czytanie pliku binarnego do struktury (C ++)

Mam więc pewien problem z brakiem możliwości poprawnego odczytania pliku binarnego w mojej strukturze. Struktura jest taka:

struct Student
{
    char name[25];
    int quiz1;
    int quiz2;
    int quiz3;
};

Ma 37 bajtów (25 bajtów z tablicy znaków i 4 bajty na liczbę całkowitą). Mój plik .dat ma 185 bajtów. To 5 uczniów z 3 stopniami całkowitymi. Każdy uczeń zajmuje 37 bajtów (37 * 5 = 185).

Wygląda mniej więcej tak w formacie zwykłego tekstu:

Bart Simpson          75   65   70
Ralph Wiggum          35   60   44
Lisa Simpson          100  98   91
Martin Prince         99   98   99
Milhouse Van Houten   80   87   79

Jestem w stanie czytać każdy rekord osobno, używając tego kodu:

Student stud;

fstream file;
file.open("quizzes.dat", ios::in | ios::out | ios::binary);

if (file.fail())
{
    cout << "ERROR: Cannot open the file..." << endl;
    exit(0);
}

file.read(stud.name, sizeof(stud.name));
file.read(reinterpret_cast<char *>(&stud.quiz1), sizeof(stud.quiz1));
file.read(reinterpret_cast<char *>(&stud.quiz2), sizeof(stud.quiz2));
file.read(reinterpret_cast<char *>(&stud.quiz3), sizeof(stud.quiz3));

while(!file.eof())
{
    cout << left 
         << setw(25) << stud.name
         << setw(5)  << stud.quiz1
         << setw(5)  << stud.quiz2
         << setw(5)  << stud.quiz3
         << endl;

    // Reading the next record
    file.read(stud.name, sizeof(stud.name));
    file.read(reinterpret_cast<char *>(&stud.quiz1), sizeof(stud.quiz1));
    file.read(reinterpret_cast<char *>(&stud.quiz2), sizeof(stud.quiz2));
    file.read(reinterpret_cast<char *>(&stud.quiz3), sizeof(stud.quiz3));
}

Dostaję ładnie wyglądające dane wyjściowe, ale chcę być w stanie odczytywać jedną strukturę jednocześnie, a nie tylko pojedyncze elementy każdej struktury naraz. Uważam, że ten kod jest potrzebny do wykonania zadania, ale ... to nie działa (pokażę dane wyjściowe po nim):

* nie obejmuje podobnych części, jeśli chodzi o otwarcie deklaracji pliku i struktury itp.

file.read(reinterpret_cast<char *>(&stud), sizeof(stud));

while(!file.eof())
{
    cout << left 
         << setw(25) << stud.name
         << setw(5)  << stud.quiz1
         << setw(5)  << stud.quiz2
         << setw(5)  << stud.quiz3
         << endl;

    file.read(reinterpret_cast<char *>(&stud), sizeof(stud));
}

WYDAJNOŚĆ:

Bart Simpson             16640179201818317312
ph Wiggum                288358417665884161394631027
impson                   129184563217692391371917853806
ince                     175193530917020655191851872800

Jedyną częścią, która się nie zepsuła, jest imię, potem jest na wzgórzu ... Próbowałem wszystkiego i nie mam pojęcia, co jest nie tak. Przeszukałem nawet książki, które mam i nic nie znalazłem. Rzeczy tam wyglądają jak to, co mam i działają, ale z jakiegoś dziwnego powodu mój nie. Zrobiłem plik.get (ch) (ch będący char) w bajcie 25 i zwrócił K, który jest ASCII dla 75 .. który jest pierwszym wynikiem testu, więc wszystko jest tam, gdzie powinno być. Po prostu nie czyta poprawnie w moich strukturach.

Każda pomoc byłaby bardzo mile widziana, po prostu utknąłem z tym.

EDYTOWAĆ: Po otrzymaniu tak dużej ilości niespodziewanych i niesamowitych informacji od was, postanowiłem skorzystać z waszej rady i trzymać się czytania jednego członka naraz. Uczyniłem rzeczy czystszymi i mniejszymi za pomocą funkcji.Jeszcze raz dziękuję za dostarczenie tak szybkiego i pouczającego wkładu. To bardzo doceniane.

Jeśli jesteś zainteresowany w obejściu, które nie jest zalecane przez większość, przewiń w dół, do trzeciej odpowiedzi użytkownika1654209. To obejście działa bez zarzutu, ale przeczytaj wszystkie komentarze, aby zobaczyć, dlaczego nie jest to faworyzowane.

questionAnswers(5)

yourAnswerToTheQuestion