Итак, я понимаю, что кусок кода:
cin.ignore(80, '\n');
очистит буфер до 80 символов, пока не достигнет возврата (клавиша ввода) и остановится … верно?
Вот вопросы …
1) Чем отличается простое выполнение cin.ignore();
без параметров? Что лучше использовать в какой ситуации?
2) cin.clear();
говорит, что очищает флаги ошибок … что это значит? Что такое флаги ошибок и почему вы хотите их очистить?
Спасибо!
Флаги ошибок устанавливаются для объекта потока каждый раз, когда какая-либо операция с ним завершается неудачей. Если поток содержит ошибку, дальнейшие операции с ним не могут быть выполнены, пока вы не сбросите состояние ошибки.
Вот простой пример:
std::istringstream iss("ABC123");
int n;
iss >> n;
assert(!iss);
Теперь поток в ошибке. Тем не менее, в нем все еще есть данные, и, возможно, стоит сбросить их и повторить попытку:
iss.clear(); // note: this must come first!
std::string token;
iss >> token;
assert(iss);
Вместо другого извлечения, вы также можете позвонить iss.ignore()
после clear()
В случае, если вы знаете, что вы должны игнорировать, прежде чем имеет смысл попробовать еще раз.
Я считаю, что такого рода метод проб и ошибок не очень хороший подход. Я бы всегда использовал getline
сначала в потоке, чтобы получить полные строки. Это может произойти только при исчерпании потока (конец файла или конец строки). затем вы можете приступить к обработке каждой строки с помощью специальной логики синтаксического анализа, и ошибки могут обрабатываться наиболее подходящим способом. Флаги ошибок в исходном потоке слишком грубые, чтобы обеспечить элегантный дизайн потока управления.
Я могу ответить на ваш второй вопрос.
Функция cin.clear () полезна, когда вы пытаетесь ввести две разные программы.
Например :
std::vector<std::string> veca,vecb;
std::string x;
while(getline(std::cin,x))
veca.push_back(x);
cin.clear();
while(getline(std::cin,x))
vecb.push_back(x);
если вы не использовали функцию cin.clear (), vecb ничего не получил, потому что cin встречал конец файла раньше.
Надеюсь, это поможет вам.