Czytanie wejścia przy użyciu getline

0

Witam,

Gdy po pierwszym wywołaniu funkcji getline wpiszę więcej niż 10 znaków, program nie będzie oczekiwał na kolejne dane w następnych wywołaniach tejże funkcji. Sądziłem, że w każdej iteracji program się "zatrzyma" oczekując aż wpiszę dane. Dlaczego tak się nie dzieje? Jak w takim razie wczytać do bufora i wyświetlić 10 pierwszych znaków (oczywiście jeśli linia jest dłuższa niż 10 znaków) każdej linii i zignorować resztę?

    char buf[100];
    do
    {
        cin.getline( buf, 10 );
        cout << buf << "\n";
    } while( 1 );
0

Do twojego bufora wpisze 10 znaków, ale w jego buforze zostanie ten nadmiar, więc nie będzie oczekiwał na kolejne znaki. Użyj cin.sync() jeśli chcesz go opróżnić.

0

Owszem ale ten nadmiar zostanie wykorzystany po kolejnych wywołaniach funkcji getline. Ostatecznie gdy bufor będzie pusty, program powinien oczekiwać nowych danych, dzieje się jednak inaczej. Nawet gdy bufor jest pusty, kolejne iteracje przebiegają bez oczekiwania na dane. (dlatego użycie cin.sync nic nie zmienia)

0

Przed cin.sync() zresetuj jeszcze flagę failbit ustawianą po przekroczeniu rozmiaru - cin.clear().
Nie mam pojęcia, skąd pomysł na ustawianie flagi błędu dla poprawnej operacji.

while (true) {
    cin.getline(buf, 10);
    cout << buf << "\n";
    cin.clear();
    cin.sync();
}

Działa tak, jak sobie to zamierzyłeś (oczywiście pomijając obsługę innych błędów).

0

Bardzo dziękuję. :)

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