Чтение двоичного файла в структуру (C ++)
Так что у меня возникла небольшая проблема: я не могу правильно читать двоичный файл в моей структуре. Структура такова:
struct Student
{
char name[25];
int quiz1;
int quiz2;
int quiz3;
};
Это 37 байтов (25 байтов из массива символов и 4 байта на целое число). Мой файл .dat имеет размер 185 байт. Это 5 студентов с 3 целыми классами. Таким образом, каждый студент занимает 37 байтов (37 * 5 = 185).
Это выглядит примерно так в текстовом формате:
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
Я могу прочитать каждую из записей в отдельности, используя этот код:
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));
}
И я получаю красивый вывод, но я хочу иметь возможность читать по одной целой структуре за раз, а не только по отдельным членам каждой структуры за один раз. Этот код, как мне кажется, необходим для выполнения задачи, но ... он не работает (я покажу вывод после него):
* не включая подобные части, такие как открытие файла и описание структуры и т. д.
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));
}
ВЫХОД:
Bart Simpson 16640179201818317312
ph Wiggum 288358417665884161394631027
impson 129184563217692391371917853806
ince 175193530917020655191851872800
Единственная часть, которая не испортила это имя, после этого она спускается с горы ... Я перепробовал все и не знаю, что случилось. Я даже просмотрел свои книги и ничего не смог найти. Вещи там похожи на то, что у меня есть, и они работают, но по какой-то странной причине моя - нет. Я сделал file.get (ch) (ch - символ) в байте 25, и он возвратил K, который является ASCII для 75 ... это 1-й результат теста, так что все должно быть. Это просто не читает в моих структурах должным образом.
Любая помощь будет принята с благодарностью, я просто застрял с этим.
РЕДАКТИРОВАТЬ: После того, как вы, ребята, получили такое большое количество неожиданных и удивительных отзывов, я решил воспользоваться вашим советом и продолжать читать по одному участнику за раз. Я сделал вещи чище и меньше, используя функции.Спасибо еще раз за предоставление такой быстрой и полезной информации. Это высоко ценится.
Если тебе интересно в обходном пути, который не рекомендуется большинством, прокрутите вниз, к третьему ответу пользователя 1654209. Этот обходной путь работает безупречно, но прочитайте все комментарии, чтобы понять, почему он не одобрен.