Lendo Arquivo Binário em uma Estrutura (C ++)
Então, estou tendo um problema de não conseguir ler corretamente um arquivo binário em minha estrutura. A estrutura é esta:
struct Student
{
char name[25];
int quiz1;
int quiz2;
int quiz3;
};
São 37 bytes (25 bytes da matriz char e 4 bytes por inteiro). Meu arquivo .dat é de 185 bytes. São 5 alunos com 3 séries inteiras. Então, cada aluno ocupa 37 bytes (37 * 5 = 185).
Parece algo assim em formato de texto simples:
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
Eu sou capaz de ler cada um dos 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));
}
E eu recebo uma boa aparência, mas eu quero ser capaz de ler em uma estrutura inteira de cada vez, não apenas membros individuais de cada estrutura de cada vez. Este código é o que eu acredito necessário para realizar a tarefa, mas ... não funciona (mostrarei a saída depois):
* não incluindo as partes similares quanto à abertura da declaração de arquivo e estrutura, 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));
}
SAÍDA:
Bart Simpson 16640179201818317312
ph Wiggum 288358417665884161394631027
impson 129184563217692391371917853806
ince 175193530917020655191851872800
A única parte que não atrapalha é o primeiro nome, depois disso é tudo. Eu já tentei de tudo e não tenho ideia do que está errado. Eu até procurei pelos livros que tenho e não consegui encontrar nada. As coisas parecem o que eu tenho e elas funcionam, mas por alguma razão estranha, o meu não. Eu fiz o arquivo .get (ch) (ch sendo um char) no byte 25 e ele retornou K, que é ASCII para 75. que é a 1ª pontuação do teste, então, tudo é onde deveria estar. Apenas não está lendo em minhas estruturas corretamente.
Qualquer ajuda seria muito apreciada, estou preso a esta.
EDITAR: Depois de receber uma quantidade tão grande de informações inesperadas e impressionantes de vocês, decidi seguir o seu conselho e continuar lendo em um membro de cada vez. Eu tornei as coisas mais limpas e menores usando funções.Obrigado mais uma vez por fornecer informações tão rápidas e esclarecedoras. É muito apreciado.
Se você está interessado em uma solução alternativa que não seja recomendada pela maioria, role para baixo até a terceira resposta do usuário1654209. Essa solução funciona perfeitamente, mas leia todos os comentários para ver por que não é favorecida.