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.