Вы неправильно используете оператор запятую .
infile >> ani[i].Registration, ':';`
не читает и не отбрасывает ':'
, что приводит к кровавой смерти ... Извините. Приводя к ошибке синтаксического анализа, когда
infile >> ani[i].Problem
пытается превратить ':'
в целое число. Это переводит infile
в состояние отказа,
while (infile.good())
находит, что infile
нехорошо, и выходит из цикла.
Вы должны будете сделать что-то по линии
std::string temp;
std::getline(infile, temp, ':');
ani[i].Registration = std::stoi(temp);
для чтения потока до разделителя ':'
в std::string
, а затем для преобразования string
в целое число с std::stoi
.
Документация по std::stoi
Это основная часть ошибки. Но ...
while (infile.good())
проверяет, является ли поток хорошим ПЕРЕД чтением с него. Это позволяет сбою потока во время чтения без каких-либо тестов до того, как будут использованы ошибочные результаты.
while (getline(infile, ani[i].animalName, ':') &&
getline(infile, ani[i].animalType, ':') &&
getline(infile, temp1, ':') &&
getline(infile, temp2, '.'))
{ // only goes into loop if everything was read
// may also have to eliminate a newline here
ani[i].Registration = std::stoi(temp1);
ani[i].Problem = std::stoi(temp2); //exception if bad
i++;
}
Еще лучший подход - сделать перегрузку оператора >>
для Animal
, потому что это позволяет вам написать основной цикл, который выглядит как
while (infile>> ani[i])
{
i++;
}
И это так просто, что все радуются. См. Каковы основные правила и идиомы для перегрузки операторов? для получения информации о написании оператора >>
и более общих соображений.