Czytanie pliku binarnego do struktury (C ++)
Mam więc pewien problem z brakiem możliwości poprawnego odczytania pliku binarnego w mojej strukturze. Struktura jest taka:
struct Student
{
char name[25];
int quiz1;
int quiz2;
int quiz3;
};
Ma 37 bajtów (25 bajtów z tablicy znaków i 4 bajty na liczbę całkowitą). Mój plik .dat ma 185 bajtów. To 5 uczniów z 3 stopniami całkowitymi. Każdy uczeń zajmuje 37 bajtów (37 * 5 = 185).
Wygląda mniej więcej tak w formacie zwykłego tekstu:
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
Jestem w stanie czytać każdy rekord osobno, używając tego kodu:
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));
}
Dostaję ładnie wyglądające dane wyjściowe, ale chcę być w stanie odczytywać jedną strukturę jednocześnie, a nie tylko pojedyncze elementy każdej struktury naraz. Uważam, że ten kod jest potrzebny do wykonania zadania, ale ... to nie działa (pokażę dane wyjściowe po nim):
* nie obejmuje podobnych części, jeśli chodzi o otwarcie deklaracji pliku i struktury itp.
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));
}
WYDAJNOŚĆ:
Bart Simpson 16640179201818317312
ph Wiggum 288358417665884161394631027
impson 129184563217692391371917853806
ince 175193530917020655191851872800
Jedyną częścią, która się nie zepsuła, jest imię, potem jest na wzgórzu ... Próbowałem wszystkiego i nie mam pojęcia, co jest nie tak. Przeszukałem nawet książki, które mam i nic nie znalazłem. Rzeczy tam wyglądają jak to, co mam i działają, ale z jakiegoś dziwnego powodu mój nie. Zrobiłem plik.get (ch) (ch będący char) w bajcie 25 i zwrócił K, który jest ASCII dla 75 .. który jest pierwszym wynikiem testu, więc wszystko jest tam, gdzie powinno być. Po prostu nie czyta poprawnie w moich strukturach.
Każda pomoc byłaby bardzo mile widziana, po prostu utknąłem z tym.
EDYTOWAĆ: Po otrzymaniu tak dużej ilości niespodziewanych i niesamowitych informacji od was, postanowiłem skorzystać z waszej rady i trzymać się czytania jednego członka naraz. Uczyniłem rzeczy czystszymi i mniejszymi za pomocą funkcji.Jeszcze raz dziękuję za dostarczenie tak szybkiego i pouczającego wkładu. To bardzo doceniane.
Jeśli jesteś zainteresowany w obejściu, które nie jest zalecane przez większość, przewiń w dół, do trzeciej odpowiedzi użytkownika1654209. To obejście działa bez zarzutu, ale przeczytaj wszystkie komentarze, aby zobaczyć, dlaczego nie jest to faworyzowane.