eof()
не вернет true
до тех пор, пока вы на самом деле не попытаетесь прочитать за пределами файла, поэтому вы видите, что последняя строка дублирована. getline
не удастся, а ALLTHESTRINGVARIABLES
будет содержать значения из последнего успешного чтения. Вместо этого вы должны проверить, действительно ли извлечение завершилось успешно, перед сохранением нового Student
.
Поскольку вы смешиваете неформатированный и отформатированный ввод, вы также должны удалить символ новой строки (или любой другой символ, который вы используете для разделения записей) из stream.
Измените l oop на:
if (std::ifstream file("file.txt"); file)
{
while (std::getline(file, ALLTHESTRINGVARIABLES) >> ANOTHERVARIABLES)
{
// remove the newline or whatever whitespace char you use as record separator
file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Student *p = new Student;
p->STRINGVARIABLES = ALLTHESTRINGVARIABLES;
p->NOTSTRINGVARIABLES = ANOTHERVARIABLES;
students.push_back(p);
}
}
Я также предлагаю не хранить указатели (если вы не используете динамическую c диспетчеризацию), а вместо этого сохранять фактические Student
объекты в std::vector<Student>
. Если используется динамическая отправка c, сохраните std::unique_ptr<Student>
в vector
.