• 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
481 wizyt
pytanie zadane 7 marca 2025 w C i C++ przez whiteman808 Mądrala (5,560 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 2025 przez SzkolnyAdmin Szeryf (90,290 p.)
Pokaż kod, inaczej to wróżenie z fusów.
komentarz 8 marca 2025 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 2025 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ź 531 wizyt
0 głosów
1 odpowiedź 202 wizyt
pytanie zadane 15 kwietnia 2018 w C i C++ przez Lucash Nowicjusz (240 p.)
–1 głos
1 odpowiedź 402 wizyt

93,736 zapytań

142,672 odpowiedzi

323,294 komentarzy

63,299 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...