Binärdatei in eine Struktur einlesen (C ++)

Ich habe also ein Problem damit, dass ich eine Binärdatei nicht richtig in meine Struktur einlesen kann. Die Struktur ist folgende:

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

Es sind 37 Bytes (25 Bytes aus dem Char-Array und 4 Bytes pro Ganzzahl). Meine DAT-Datei ist 185 Bytes. Es sind 5 Schüler mit 3 ganzzahligen Noten. Jeder Schüler belegt also 37 Bytes (37 * 5 = 185).

Es sieht ungefähr so ​​aus im Nur-Text-Format:

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

Ich kann jeden Datensatz einzeln lesen, indem ich diesen Code verwende:

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

Und ich bekomme eine gut aussehende Ausgabe, aber ich möchte in der Lage sein, jeweils eine ganze Struktur einzulesen, nicht nur einzelne Mitglieder jeder Struktur gleichzeitig. Ich glaube, dieser Code wird benötigt, um die Aufgabe zu erfüllen, aber ... er funktioniert nicht (ich zeige die Ausgabe danach):

* ohne die ähnlichen Teile bis zum Öffnen der Datei und der Strukturdeklaration usw.

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

AUSGABE:

Bart Simpson             16640179201818317312
ph Wiggum                288358417665884161394631027
impson                   129184563217692391371917853806
ince                     175193530917020655191851872800

Der einzige Teil, den es nicht vermasselt, ist der Vorname, danach ist es bergab. Ich habe alles versucht und ich habe keine Ahnung, was los ist. Ich habe sogar die Bücher durchsucht und nichts gefunden. Die Dinge dort sehen so aus, wie ich sie habe und sie funktionieren, aber aus irgendeinem Grund funktioniert meine nicht. Ich habe die Datei file.get (ch) (ch ist ein Zeichen) bei Byte 25 erstellt und es wurde K zurückgegeben, das für 75 ASCII ist. Dies ist das erste Testergebnis, also ist alles dort, wo es sein sollte. Es liest einfach nicht richtig in meinen Strukturen.

Jede Hilfe wäre sehr dankbar, ich bleibe nur bei dieser.

BEARBEITEN: Nachdem Sie so viele unerwartete und großartige Beiträge geliefert haben, habe ich mich entschlossen, Ihren Rat zu befolgen und immer nur ein Mitglied nach dem anderen zu lesen. Ich habe die Dinge sauberer und kleiner gemacht, indem ich Funktionen verwendet habe.Nochmals vielen Dank für die schnelle und aufschlussreiche Eingabe. Es wird sehr geschätzt.

Wenn Sie interessiert sind Scrollen Sie in einer von den meisten nicht empfohlenen Problemumgehung nach unten zur dritten Antwort von user1654209. Diese Problemumgehung funktioniert einwandfrei, aber lesen Sie alle Kommentare, um festzustellen, warum dies nicht bevorzugt wird.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage