Выбранный ответ решает непосредственную проблему, но ...
Если у вас есть сбойный ввод, вам не только нужно очистить флаг сбоя, вы также можете удалить неправильный ввод. Если вы этого не сделаете, при следующем чтении попытается проанализировать тот же неверный ввод и снова потерпит неудачу. Удаление неверного ввода часто выполняется с помощью std::istream::ignore
. Типичное использование
cin.ignore(numeric_limits<streamsize>::max(), '\n')
удаляет все в потоке до конца строки. Вы можете заменить '\n'
пробелом, табуляцией, запятой или любым другим символом, который лучше соответствует вашим требованиям. Будьте абсолютно уверены, что у вас неверный ввод, а не какой-либо другой случай сбоя, или вы можете обнаружить, что удаляете нужные вам данные.
Sidenote:
cin>>b;
b_vct.push_back(b);
if(cin.fail())
{
v2_add=false;
}
- плохая идея. Если cin>>b;
не удалось, вы не хотите добавлять b
к vector
. Вы должны убедиться, что b
хорош, прежде чем добавить его.
cin>>b;
if(cin.fail())
{
v2_add=false;
}
else
{
b_vct.push_back(b);
}
Но мы можем воспользоваться возвращаемым значением cin >>b;
и немного переставить logi c, чтобы сделать это проще:
if(cin>>b) // if read succeeded
{
b_vct.push_back(b); // store
}
else
{
v2_add=false; // read failed
}
Тогда, если мы примем while
во внимание
while(v2_add) // loop until failed
{
if(cin>>b)
{
b_vct.push_back(b);
}
else
{
v2_add=false;
}
}
Мы видим, что if
нам вообще не нужен. Он выполняет работу, которая может быть выполнена в состоянии while
.
while(cin>>b) // loop until read fails
{
b_vct.push_back(b); // store
}
И поскольку единственным выходом из l oop является сбой, это место, где вы размещаете clear
и, возможно, ignore
while(cin>>b) // loop until read fails
{
b_vct.push_back(b); // store
}
// Check for EOF here if appropriate
cin.clear(); // clear error flag
// discard invalid input if appropriate
// cin.ignore(numeric_limits<streamsize>::max(), '\n'); // discard up to end of line
Если у вас есть большое количество возможных символов, разделяющих входные данные, часто проще (но медленнее) прочитать ошибочный токен в std::string
и проигнорировать результат .
cin.clear(); // clear error flag
std::string discard;
cin >> discard; // discard whatever follows