Считывание из файла в динамический массив структур
Сейчас пишу курсовую, по заданию которой мне нужно создать что-то типа базы данных результатов сессии студентов, а также её обработку. База данных основана на динамическом массиве структур. По заданию мне нужно обеспечить сохранение базы в файл, и дальнейшая работа с файлом. (например вывод на экран информации о студентах, предварительно считав её с файла). Вот у меня и возникла проблема с считыванием структуры с файла. Вот код всей программы:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <time.h>
#pragma warning(disable:4996)
using namespace std;
int n = 0;
struct Marks
{
string SubjectName;
string TeacherSurname;
unsigned int Mark;
};
struct ExamResult
{
string F;
string I;
string O;
int NumberGradeBook;
string FacultyName;
unsigned int Course;
Marks Result[5];
};
void InputInfo(ExamResult result[], int b)
{
string temp; //FileName;
string Kavichki = "\"";
/*cout << "Введите путь и имя файла базы данных: ";
getline(cin, temp);
getline(cin, FileName);
string NewFileName = (Kavichki + FileName) + Kavichki;*/
ofstream ExamDataBase("save.txt", ofstream::app);
cin.ignore(32767, '\n');
for (int i = 0 + n; i < b + n; i++)
{
cout << "\nВведите Фамилию: ";
getline(cin, result[i].F, '\n');
ExamDataBase << result[i].F << endl;
cout << "\nВведите Имя: ";
getline(cin, result[i].I, '\n');
ExamDataBase << result[i].I << endl;
cout << "\nВведите Отчество: ";
getline(cin, result[i].O, '\n');
ExamDataBase << result[i].O << endl;
check3:cout << "\nВведите Номер зачетки: ";
while (!(cin >> result[i].NumberGradeBook))
{
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
cout << "\nНекорректное значение! Нужно ввести цифру!" << endl;
cout << "Введите Номер зачетки: ";
}
if (result[i].NumberGradeBook < 1 )
{
cout << "\nНекорректное значение! Число не может быть отрицательным или равным нулю!";
goto check3;
}
if (i != 0)
{
if (result[i].NumberGradeBook == result[i-1].NumberGradeBook)
{
cout << "Такой номер зачетки уже существует!" << endl;
goto check3;
}
}
ExamDataBase << result[i].NumberGradeBook << endl;
cin.ignore(32767, '\n');
cout << "\nВведите Наименование факультета: ";
getline(cin, result[i].FacultyName, '\n');
ExamDataBase << result[i].FacultyName << endl;
check1:cout << "\nВведите Курс: ";
while (!(cin >> result[i].Course))
{
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
cout << "\nНекорректное значение! Нужно ввести цифру!" << endl;
cout << "Введите Курс: ";
}
if (result[i].Course > 5 || result[i].Course == 0)
{
cout << "\nЗначение должно быть в диапазоне от 1 до 5";
goto check1;
}
ExamDataBase << result[i].Course << endl;
cout << "\nВведите результаты сессии по 5 предметам: " << endl;
for (int j = 0; j < 5; j++)
{
cin.ignore(32767, '\n');
cout << "Введите Название предмета: ";
getline(cin, result[i].Result[j].SubjectName, '\n');
cout << "\nВведите Фамилию преподавателя: ";
getline(cin, result[i].Result[j].TeacherSurname, '\n');
check2:cout << "\nВведите Оценку: ";
while (!(cin >> result[i].Result[j].Mark))
{
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
cout << "\nНекорректное значение! Нужно ввести цифру!" << endl;
cout << "Введите Oценку: ";
}
if (result[i].Result[j].Mark > 5 || result[i].Result[j].Mark == 0)
{
cout << "\nЗначение должно быть в диапазоне от 1 до 5";
goto check2;
}
ExamDataBase << result[i].Result[j].SubjectName << endl;
ExamDataBase << result[i].Result[j].TeacherSurname << endl;
ExamDataBase << result[i].Result[j].Mark << endl;
}
cin.ignore(32767, '\n');
}
ExamDataBase.close();
n += b;
}
void OutputInfo(ExamResult result[])
{
cout << endl << "Информация о результатах экзаменационной сессии студентов курса: " << endl;
for (int i = 0; i < n; i++)
{
cout << "\nФИО: " << result[i].F << " " << result[i].I[0] << "." << result[i].O[0] << "." << endl;
cout << "Номер зачетки: " << result[i].NumberGradeBook << endl;
cout << "Название Факультета: " << result[i].FacultyName << endl;
cout << "Курс: " << result[i].Course << endl;
cout << "\nРезультаты сессии: " << endl << endl;
for (int j = 0; j < 5; j++)
{
cout << "Название предмета: " << result[i].Result[j].SubjectName << endl;
cout << "Фамилия преподавателя: " << result[i].Result[j].TeacherSurname << endl;
cout << "Оценка: " << result[i].Result[j].Mark << endl;
}
}
}
void ReadFromFile(int N)
{
ExamResult* mas2 = new ExamResult[N];
string temp;
/*string FileName;
string Kavichki = "\"";
cout << "Введите путь и имя файла базы данных: ";
getline(cin, temp);
getline(cin, FileName);
string NewFileName = (Kavichki + FileName) + Kavichki;*/
ifstream ReadExamDataBase("save.txt");
for (int i = 0; i < N; i++)
{
getline(ReadExamDataBase, mas2[i].F);
getline(ReadExamDataBase, mas2[i].I);
getline(ReadExamDataBase, mas2[i].O);
ReadExamDataBase >> mas2[i].NumberGradeBook;
getline(ReadExamDataBase, temp);
getline(ReadExamDataBase, mas2[i].FacultyName);
ReadExamDataBase >> mas2[i].Course;
//cin.ignore(32767, '\n');
for (int j = 0; j < 5; j++)
{
getline(ReadExamDataBase, mas2[i].Result[j].SubjectName);
getline(ReadExamDataBase, mas2[i].Result[j].TeacherSurname);
getline(ReadExamDataBase, temp);
ReadExamDataBase >> mas2[i].Result[j].Mark;
}
}
ReadExamDataBase.close();
OutputInfo(mas2);
//ReadExamDataBase.close();
}
int main()
{
int number = 0;
setlocale(LC_ALL, "Russian");
const int N = 50;
ExamResult* mas = new ExamResult[N];
int function, position;
int b = 2;
cout << "Ввод исходных данных о студентах" << endl;
cout << "Введите количество записей, которые вы хотите ввести: ";
while (!(cin >> number))
{
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
cout << "\nНекорректное значение! Нужно ввести цифру!" << endl;
cout << "Введите количество записей, которые вы хотите ввести: ";
}
InputInfo(mas, number);
b++;
number = 0;
do
{
cout << endl;
cout << "Введите нужную функцию:" << endl;
cout << "1 - Добавление нового студента" << endl;
cout << "2 - Вывод на экран массива студентов" << endl;
cout << "0 - Выход" << endl;
cout << "Введите номер функции: ";
cin >> function;
switch (function)
{
case 1:cout << "Введите количество записей, которые вы хотите ввести: ";
while (!(cin >> number))
{
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
cout << "\nНекорректное значение! Нужно ввести цифру!" << endl;
cout << "Введите количество записей, которые вы хотите ввести: ";
}
InputInfo(mas, number); b++; break;
case 2: ReadFromFile(n);
/*OutputInfo(mas);*/ break;
case 0:break;
default:cout << endl << "Такой функции нет" << endl;
}
} while (function != 0);
}
Собственно моя функция считывания с файла
void ReadFromFile(int N)
{
ExamResult* mas2 = new ExamResult[N];
string temp;
ifstream ReadExamDataBase("save.txt");
for (int i = 0; i < N; i++)
{
getline(ReadExamDataBase, mas2[i].F);
getline(ReadExamDataBase, mas2[i].I);
getline(ReadExamDataBase, mas2[i].O);
ReadExamDataBase >> mas2[i].NumberGradeBook;
getline(ReadExamDataBase, temp);
getline(ReadExamDataBase, mas2[i].FacultyName);
ReadExamDataBase >> mas2[i].Course;
//cin.ignore(32767, '\n');
for (int j = 0; j < 5; j++)
{
getline(ReadExamDataBase, mas2[i].Result[j].SubjectName);
getline(ReadExamDataBase, mas2[i].Result[j].TeacherSurname);
getline(ReadExamDataBase, temp);
ReadExamDataBase >> mas2[i].Result[j].Mark;
}
}
ReadExamDataBase.close();
OutputInfo(mas2);
//ReadExamDataBase.close();
}
Проблема в том, что потом при выводе информации на экран (функция OutputInfo) у меня выводится только информация о 1 студенте (и то поле Subject Name почему-то не выводится, хотя всё остальное показывает корректно). То есть когда срабатывает функция вывода информация о 1 студенте выводится, а у остальных просто выводится мусор. Возможно я как-то не правильно считываю. Прошу помощи или подсказки у опытных программистов. Конечно разбираться в чужом коде это дело не благодарное (прошу прощения, просто я уже не знаю что мне делать).
Содержимое файла с которого идет чтение, после записи туда данных.
Petrenko
Max
Aleksandrovich
1
IKS
2
Matematika
Pribilov
2
Fizika
Ivanov
4
History
Nikylin
3
English
Mardarenko
5
Programmig
Filipov
3