• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program wpada w nieskończoną pętlę po naciśnięciu Ctrl+D

+1 głos
122 wizyt
pytanie zadane 7 marca w C i C++ przez whiteman808 Gaduła (4,660 p.)
Gdy wciskam Ctrl+D program wpada w nieskończoną pętlę. Nie poskutowało std::cin.clear() i std::cin.ignore(std::numeric_limits<std::streamsize>::max(). Ma ktoś pomysł jak wyczyścić flagę eof w cin tak, aby po wciśnięciu Ctrl+D dalej był możliwy odczyt danych z konsoli?
komentarz 8 marca przez SzkolnyAdmin Szeryf (89,690 p.)
Pokaż kod, inaczej to wróżenie z fusów.
komentarz 8 marca przez Oscar Nałogowiec (29,360 p.)

@whiteman808, Zasadniczo to niezbyt mądry pomysł. Strumienie w C++ i FILE * w C (w szczególności cin, cout, cerr i stdin, stdout i stderr) to jak widać po nazwie "FILE" abstrakcje strumienia danych (ciąg bajtów) podobnego do pliku. Może to być zarówno konsola, jak i fizyczny plik, łącze szeregowe, połączenie TCP i różne dziwne abstrakcyjne byty. Można przecież uruchomić program z przekierowaniem wejścia lub wyjścia i jak wtedy zignorujesz EOF z pliku na dysku albo z połączenia TCP? Jak chcesz się bawić w naciskanie klawiszy itp użyj odpowiedniej biblioteki (conio, curses) - one naciśniecie ^D po prostu zwrócą jako zdarzenie naciśnienia klawiszy, wszystko jedno których.

1 odpowiedź

+1 głos
odpowiedź 8 marca przez Gynvael Coldwind Nałogowiec (30,510 p.)

OK, to trochę dziwne, ale trzeba najwyraźniej dać zarówno std::cin.clear(); jak i clearerr(stdin);:

#include <iostream>
#include <limits>
#include <stdio.h>
#include <unistd.h>

int main() {
  int c;
  while (true) {
    std::cout << "in" << std::endl;
    while ((c = std::cin.get()) != EOF) {
      std::cout.put(c);
    }
    if (std::cin.eof()) {
      std::cout << "eof" << std::endl;
      std::cin.clear();
      clearerr(stdin);
    }
    std::cout << "out" << std::endl;
  }
  return 0;
}

Przypuszczam, że wynika to z tego, że cin wewnętrznie korzysta z stdin, ale cin.clear nie propaguje wyczyszczenia błędu do warstwy niżej (tylko ustawia goodbit swojemu obiektowi).

Podobne pytania

0 głosów
1 odpowiedź 400 wizyt
0 głosów
1 odpowiedź 122 wizyt
pytanie zadane 15 kwietnia 2018 w C i C++ przez Lucash Nowicjusz (240 p.)
–1 głos
1 odpowiedź 222 wizyt

93,427 zapytań

142,421 odpowiedzi

322,649 komentarzy

62,787 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...