PAV писал(а):
Во-первых, посмотрите описание функции в MSDN
Никому не посоветовал бы читать MSDN. Написано непонятно как.
MSDN писал(а):
After the function extracts an element that compares equal to _Delim, in which case the element is neither put back nor appended to the controlled sequence.
Так и не понятно, что происходит с прочитанным разделителем. Он всё ещё остался в потоке? Или нет? Будет ли он считан при следующем вызове? (Или как повезеёт?)
Советую почитать тут (и вообще, хороший сайт, всё ясно написано):
http://www.cppreference.com/cppio/getline.htmlcppreference.com писал(а):
reads characters into buffer until ... a newline is encountered
Всё ясно: разделитель не читается из потока. Он там и остаётся. Поэтому последующие вызовы к getline() читают строку длины 0: "", до тех пор, пока мы не уберём из потока разделитель -- символ новой строки '\n'. И программа не зависает, она выполняет бесконечный цикл: getline() считал строку длиной 0 символов, вы её вывели, снова "считали", и "вывели"... Убрать символ '\n' удобно при помощи вызова cin.ignore():
http://www.cppreference.com/cppio/ignore.html Но, осторожно, вызывайте ignore() только если следующий символ -- '\n', иначе будете терять данные из ввода.
Мой совет: если вам не принципиально, в переменную какого типа читать ввод, лучше читайте в string, раз уж пишете на C++ придётся с ним разобраться, и лучше сделать это сразу.