inputtream — Как работает буферизация ввода в переполнении стека

Вот фрагмент кода. Я не понимаю, как работает внутренняя буферизация.

  while(true)
{
cout << "Enter a character: ";
cin.ignore(3, '\n');
ch = cin.get();  // ch is char type
cout << "char: ch: " << ch << endl;
}

На самом деле cin.ignore(3, '\n') игнорирует первые три символа, а затем получает следующий непосредственный символ. До этого момента все в порядке. Так как я держал это в while цикл, я пытался проверить поведение ignore() а также get(), Например, вывод, для которого я проверил, был

Enter a character: abcd
char: ch: d
Enter a character: efgh
char: ch: e
Enter a character: ijkl
char: ch: i
Enter a character: mnopq
char: ch: m
Enter a character: char: ch: q
Enter a character:

Просто чтобы проверить буферизацию, намеренно мне дали 4 символа вместо 1. В первом случае все нормально и получилось. Во-вторых, игнорирование, кажется, не работает. Когда я ввел 5 символов, я не понял поведение.

Нужно объяснение по этому поводу. 🙂

0

Решение

Согласно документации по std :: cin.ignore (размер потока n = 1, int delim = EOF):

Извлекает символы из входной последовательности и отбрасывает их до тех пор, пока не будет извлечено n символов или один из них не будет равен delim.
http://www.cplusplus.com/reference/istream/istream/ignore/

Вы кладете abcd\n на стандартный Ты первый ignore(3,'\n') удаляет abc и ваш get () выбирает d, \n остается в буфере.

Затем вы добавляете efgh\n в буфер, который теперь содержит \nefgh\n, Ваше следующее игнорирование () читает или 3 символа или перевод строки, что бы ни было на первом месте. Поскольку ваша новая строка находится в буфере первой, игнорируется только новая строка.

Вы, вероятно, хотите очистить буфер stdin, прежде чем запрашивать дополнительный ввод. Вы можете добиться этого либо изменив свой вызов get (), либо добавив второй вызов ignore (), прежде чем запрашивать дополнительные входные данные.

3

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

cin.ignore(3, '\n') игнорируемых вплоть до три символа, останавливаясь после того, как он находит конец строки (т.е. \n персонаж).

После первой строки ввода буфер будет содержать 5 символов, abcd\n, Так ignore игнорируемых abc, а также get получает d, оставляя \n,

После второй строки он содержит \nefgh\n, Так ignore просто игнорирует символ конца строки, и get возвращается e,

Если вы хотите отменить остаток строки после извлечения символа, используйте ignore снова:

cin.ignore(numeric_limits<streamsize>::max(), '\n');
2

По вопросам рекламы [email protected]