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.