Leyendo un archivo binario en una estructura (C ++)

Por lo tanto, tengo un pequeño problema de no poder leer correctamente un archivo binario en mi estructura. La estructura es esta:

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

Tiene 37 bytes (25 bytes de la matriz de caracteres y 4 bytes por entero). Mi archivo .dat es de 185 bytes. Son 5 estudiantes con 3 grados enteros. Así que cada estudiante ocupa 37 bytes (37 * 5 = 185).

Se ve algo como esto en formato de texto plano:

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

Puedo leer cada uno de los 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));
}

Y obtengo un buen resultado, pero quiero poder leer en una estructura completa a la vez, no solo en los miembros individuales de cada estructura a la vez. Este código es lo que creo que necesitaba para realizar la tarea, pero ... no funciona (después mostraré el resultado):

* sin incluir las partes similares en cuanto a apertura de archivo y declaración de estructura, 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));
}

SALIDA:

Bart Simpson             16640179201818317312
ph Wiggum                288358417665884161394631027
impson                   129184563217692391371917853806
ince                     175193530917020655191851872800

La única parte que no arruina es el primer nombre, después de eso está bajando la colina ... Lo he intentado todo y no tengo idea de lo que está mal. Incluso he buscado en los libros que tengo y no pude encontrar nada. Las cosas allí parecen lo que tengo y funcionan, pero por alguna extraña razón la mía no. Hice el archivo.get (ch) (ch siendo un char) en el byte 25 y devolví K, que es ASCII para 75 ... que es la puntuación de la primera prueba, así que, todo está donde debería estar. Simplemente no está leyendo en mis estructuras correctamente.

Cualquier ayuda sería muy apreciada, solo me quedo con esta.

EDITAR: Después de recibir una gran cantidad de comentarios inesperados y asombrosos de ustedes, decidí seguir su consejo y seguir leyendo en un miembro a la vez. Hice las cosas más limpias y pequeñas usando funciones.Gracias una vez más por proporcionar una entrada tan rápida y esclarecedora. Es muy apreciado

Si te interesa En una solución que no es la más recomendada por la mayoría, desplácese hacia la parte inferior hasta la tercera respuesta del usuario 1654209. Esa solución funciona a la perfección, pero lea todos los comentarios para ver por qué no está favorecida.

Respuestas a la pregunta(5)

Su respuesta a la pregunta