evgeniy8705
@evgeniy8705
Повелитель вселенной

Как принимать ввод с потока до символа новой строки?

В книге описан следующий пример:
#include <iostream>

int main()
{	
	int current_value = 0;
	int value = 0;

	if (std::cin >> current_value)
	{
		int count = 1;

		while (std::cin >> value)
		{
			if (value == current_value)
			{
				count++;
			}
			else
			{
				std::cout << current_value << " occurs " << count << " times" << std::endl;

				current_value = value;
				count = 1;
			}
		}

		std::cout << current_value << " occurs " << count << " times" << std::endl;
	}

	return 0;
}


Результат вывода отличается от того что описано в книге. Последний вывод должен происходить по сути автоматически как это предполагается в книге но строка выводится после принудительного добавления конца строки.
Как я понял проверка в цикле while не совсем корректная, потому что символ новой строки считывается нормально и в итоге возвращается true, что приводит к ожиданию ввода новых данных.
Как правильно обрабатывать такой ввод?
Входные данные при первом запуске к примеру такие: 1 1 1 2 2 3 3 3 3

Должно выводиться следующее:
1 occurs 3 times
2 occurs 2 times
3 occurs 4 times

Но выводится так:
1 occurs 3 times
2 occurs 2 times
и тут ожидается новый ввод данных. После нажатия CTRL + Z и ENTER происходит вывод последней строки данных.

Как сделать чтобы последняя строка выводилась сразу вслед за всеми предыдущими?
  • Вопрос задан
  • 284 просмотра
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
А откуда программа должна знать, что вы не хотели ввести, например
"1 1 1 2 2 3 3 3 3 3 3 3".

Почему после четвертой тройки она должна остановиться?

В кокретном случае программа считает, что пользователь закончил ввод данных, если программа попытается прочесть число и не сможет.

while (std::cin >> value) попытается прочесть число и вернет ссылку на cin, котрая приводится к bool и будет равна false, если произошла ошибка, т.е. прочитать еще одно число не удалось.

Консоль ждет от пользователя ввод и единственный случай, когда cin не сможет прочесть число, это если закончится входной файл (если запустить программу и перенаправить ввод из файла) или если пользователь введет какой-то символ, который не получится перобразовать в число. Кроме ctrl-z (символ eof) можно, например, ввести символ 'a', поставить точку или еще что-то.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽