буфер — cin.ignore () и cin.clear () в переполнении стека

Итак, я понимаю, что кусок кода:

cin.ignore(80, '\n');

очистит буфер до 80 символов, пока не достигнет возврата (клавиша ввода) и остановится … верно?

Вот вопросы …

1) Чем отличается простое выполнение cin.ignore(); без параметров? Что лучше использовать в какой ситуации?

2) cin.clear(); говорит, что очищает флаги ошибок … что это значит? Что такое флаги ошибок и почему вы хотите их очистить?

Спасибо!

1

Решение

Флаги ошибок устанавливаются для объекта потока каждый раз, когда какая-либо операция с ним завершается неудачей. Если поток содержит ошибку, дальнейшие операции с ним не могут быть выполнены, пока вы не сбросите состояние ошибки.

Вот простой пример:

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 сначала в потоке, чтобы получить полные строки. Это может произойти только при исчерпании потока (конец файла или конец строки). затем вы можете приступить к обработке каждой строки с помощью специальной логики синтаксического анализа, и ошибки могут обрабатываться наиболее подходящим способом. Флаги ошибок в исходном потоке слишком грубые, чтобы обеспечить элегантный дизайн потока управления.

4

Другие решения

Я могу ответить на ваш второй вопрос.
Функция 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 встречал конец файла раньше.
Надеюсь, это поможет вам.

1