Szybka sprawa - pętla while i cin.get

0

Cześć, mam małe szybkie pytanie bo nie potrafię zrozumieć jednej rzeczy a w książce nigdzie nie jest to wyjaśnione.

Mam taki kod :

for (int i = 0; i < ArSize; i++)
{
	cout << i + 1 << ": ";
	cin.get(temp, MaxLen);
	while (cin && cin.get() != '\n')
		continue;
	if (!cin || temp[0] == '\0')
		break;
	else
		sayings[i] = temp;
}

Ogólnie ta pętla przypisuje tablicy obiektów dany ciąg znaków.
Nie rozumiem jednak pętli while w tym kodzie. Co ona tam robi, po co tam stoi? I też nie ogarniam tego continue - według google :
W pętli do lub while następna iteracja rozpoczyna się od ponownej oceny wyrażenia kontrolującego instrukcji do lub while.
Czyli co, gdy wpadnie w tą pętlę znowu ocenia wyrażenie kontrolujące instrukcję while - zgodnie z moją logiką powinna tu być pętla nieskończona.

3

Po continue pętla wraca do do sprawdzenia warunku. Warunek tutaj me efekty uboczne. cin jest konwertowane do bool¹ aby sprawdzić czy stream wciąż może służyć do wczytywania znaków, po czym wybierany jest z niego jeden znak. Pętla kończy się gdy ten znak jest równy nowej linii (lub gdy cin nie będzie zdatny do pobrania żadnych nowych znaków).

Inaczej mówiąc, ta pętla odrzuca wszystkie znaki od MaxLen-tego do końca linii/streamu, po czym wczytany string o długości max MaxLen znaków jest dodawany do tabeli (?) sayings

¹ void* przed C++11

0

Okej, czyli ta pętla while po prostu niejako odrzuca nadprogramowe znaki. Rozumiem, tylko dlaczego w takim wypadku przy skasowaniu tej pętli while pętla for od razu wychodzi po wczytaniu pierwszego ciągu znakow jeżeli ten ciąg mieści się w MaxLen?

Edit
A, ogarnąłem, bo enter '\0' znajduje sie jakby w streamie i występuje bez tej pętli drugi raz przez co wychodzi z pętli (można się tej pętli while pozbyć, dodając jedno cin.get() aby wyłapało ten znak, ale wtedy będzie problem jak użytkownik przekroczy MaxLen, a ta pętla załatwia wszystko na raz), dzięki, wszystko jasne :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1