Проблема в том, что вы читаете isMale
.bool
- это действительно число, 0
для false
, 1
для true
.Вы не можете прочитать строку в нее.
В результате получается, что в потоке вы получаете кучу символов, которые не могут быть прочитаны ни одной из операций >>
, поэтому все они простопотерпеть неудачу подряд.Попробуйте ввести 1
или 0
в командной строке, и все будет работать нормально.
Если вы хотите, чтобы пользователь мог передавать строку, а затем трактовать это как bool
,вы можете использовать утилиту, предоставленную именно для этого, или сделать это вручную, чтобы помочь вам понять.
Чтобы использовать стандартную утилиту, она называется std::boolalpha
и входит в заголовок <iomanip>
:
std::cin >> std::boolalpha >> ListOfPatients[i].isMale;
Чтобы сделать это вручную, прочитайте это в std::string
объект и сделайте некоторое сравнение самостоятельно, например так:
std::string tmpIsMale;
std::cin >> tmpIsMale;
ListOfPatients[i].isMale = (tmpIsMale == "true");
Также неплохо проверить состояние потокапосле того, как вы пытаетесь читать с него, именно по этой причине.Вы можете поместить поток непосредственно в if
для этого:
std::cin >> someVariable;
if (!cin) { // cin is not in a good state
std::cerr << "Failed to read someVariable, please try again with a proper value!\n";
return 1;
}
Несколько побочных эффектов и плохих практик, которые вы можете избежать:
using namespace std;
считается плохой практикой. std::endl
немного спорнее, но то, как вы его используете, говорит о том, что вы этого не понимаете. - Пол не является логическим параметром.Я знаю, что это не сугубо технический вопрос, и если структура предоставлена вашим учителем, вы немного застряли, но это же 2019 год!Умение писать хорошие программы означает не только технические особенности языка, но и умение писать программы, которые также полезны для пользователей, поэтому неплохо бы рано освоить хорошие привычки.