Lendo Arquivo Binário em uma Estrutura (C ++)

Então, estou tendo um problema de não conseguir ler corretamente um arquivo binário em minha estrutura. A estrutura é esta:

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

São 37 bytes (25 bytes da matriz char e 4 bytes por inteiro). Meu arquivo .dat é de 185 bytes. São 5 alunos com 3 séries inteiras. Então, cada aluno ocupa 37 bytes (37 * 5 = 185).

Parece algo assim em formato de texto simples:

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

Eu sou capaz de ler cada um dos registros individualmente usando este código:

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

E eu recebo uma boa aparência, mas eu quero ser capaz de ler em uma estrutura inteira de cada vez, não apenas membros individuais de cada estrutura de cada vez. Este código é o que eu acredito necessário para realizar a tarefa, mas ... não funciona (mostrarei a saída depois):

* não incluindo as partes similares quanto à abertura da declaração de arquivo e estrutura, etc.

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

SAÍDA:

Bart Simpson             16640179201818317312
ph Wiggum                288358417665884161394631027
impson                   129184563217692391371917853806
ince                     175193530917020655191851872800

A única parte que não atrapalha é o primeiro nome, depois disso é tudo. Eu já tentei de tudo e não tenho ideia do que está errado. Eu até procurei pelos livros que tenho e não consegui encontrar nada. As coisas parecem o que eu tenho e elas funcionam, mas por alguma razão estranha, o meu não. Eu fiz o arquivo .get (ch) (ch sendo um char) no byte 25 e ele retornou K, que é ASCII para 75. que é a 1ª pontuação do teste, então, tudo é onde deveria estar. Apenas não está lendo em minhas estruturas corretamente.

Qualquer ajuda seria muito apreciada, estou preso a esta.

EDITAR: Depois de receber uma quantidade tão grande de informações inesperadas e impressionantes de vocês, decidi seguir o seu conselho e continuar lendo em um membro de cada vez. Eu tornei as coisas mais limpas e menores usando funções.Obrigado mais uma vez por fornecer informações tão rápidas e esclarecedoras. É muito apreciado.

Se você está interessado em uma solução alternativa que não seja recomendada pela maioria, role para baixo até a terceira resposta do usuário1654209. Essa solução funciona perfeitamente, mas leia todos os comentários para ver por que não é favorecida.

questionAnswers(5)

yourAnswerToTheQuestion