Чтение двоичного файла в структуру (C ++)

Так что у меня возникла небольшая проблема: я не могу правильно читать двоичный файл в моей структуре. Структура такова:

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

Это 37 байтов (25 байтов из массива символов и 4 байта на целое число). Мой файл .dat имеет размер 185 байт. Это 5 студентов с 3 целыми классами. Таким образом, каждый студент занимает 37 байтов (37 * 5 = 185).

Это выглядит примерно так в текстовом формате:

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

Я могу прочитать каждую из записей в отдельности, используя этот код:

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

И я получаю красивый вывод, но я хочу иметь возможность читать по одной целой структуре за раз, а не только по отдельным членам каждой структуры за один раз. Этот код, как мне кажется, необходим для выполнения задачи, но ... он не работает (я покажу вывод после него):

* не включая подобные части, такие как открытие файла и описание структуры и т. д.

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

ВЫХОД:

Bart Simpson             16640179201818317312
ph Wiggum                288358417665884161394631027
impson                   129184563217692391371917853806
ince                     175193530917020655191851872800

Единственная часть, которая не испортила это имя, после этого она спускается с горы ... Я перепробовал все и не знаю, что случилось. Я даже просмотрел свои книги и ничего не смог найти. Вещи там похожи на то, что у меня есть, и они работают, но по какой-то странной причине моя - нет. Я сделал file.get (ch) (ch - символ) в байте 25, и он возвратил K, который является ASCII для 75 ... это 1-й результат теста, так что все должно быть. Это просто не читает в моих структурах должным образом.

Любая помощь будет принята с благодарностью, я просто застрял с этим.

РЕДАКТИРОВАТЬ:&nbsp;После того, как вы, ребята, получили такое большое количество неожиданных и удивительных отзывов, я решил воспользоваться вашим советом и продолжать читать по одному участнику за раз. Я сделал вещи чище и меньше, используя функции.Спасибо еще раз за предоставление такой быстрой и полезной информации. Это высоко ценится.

Если тебе интересно&nbsp;в обходном пути, который не рекомендуется большинством, прокрутите вниз, к третьему ответу пользователя 1654209. Этот обходной путь работает безупречно, но прочитайте все комментарии, чтобы понять, почему он не одобрен.