Czytanie wejścia przy użyciu getline

Odpowiedz Nowy wątek
2011-08-24 17:14
rekrut
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 );

Pozostało 580 znaków

2011-08-24 17:48
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ć.

Pozostało 580 znaków

2011-08-24 20:26
rekrut
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)

Pozostało 580 znaków

2011-08-24 20:48
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).

edytowany 3x, ostatnio: iooi, 2011-08-24 20:56

Pozostało 580 znaków

2011-08-24 21:08
rekrut
0

Bardzo dziękuję. :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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