Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

cin.good i cin. fail

Ostatnio zmodyfikowano 2021-03-08 18:15
Autor Wiadomość
monikaw
Temat założony przez niniejszego użytkownika
cin.good i cin. fail
» 2021-03-08 17:55:20
Czy ktoś mi wytłumaczy łopatologicznie na czym polega cin.good i cin.fail? Czy cin. fail wyrzuca tylko błąd z poprzedzającej operacji? I wyrzuca go w formie true/false czy 0/1? Co sprawdza cin.good i w jakiej formie podaje wynik?
P-178261
DejaVu
» 2021-03-08 18:12:21
P-178262
pekfos
» 2021-03-08 18:15:16
Obie zwracają wartość typu bool. fail() jest opisane w » Kurs C++» Poziom 1Obsługa strumienia wejściowego lekcja, a good() nie jest opisane. Zobacz tabelkę w https://en.cppreference.com/w/cpp/io/basic_ios/good dla różnicy między good() i fail(). W 99% przypadków chcesz użyć fail(), a jeśli nie rozumiesz dokładnie różnicy między tymi dwoma, w 100% przypadków nie chcesz używać good().

Tamten brakujący procent to przypadki gdy odpowiednie jest użycie bad() lub eof(). Trudno o przypadek, gdy good() ma sens. Powiedzmy że jest taki kod, gdzie jest błędnie użyte good() do stwierdzenia, czy nie wystąpił błąd odczytu:
C/C++
#include <iostream>

int main()
{
   
int a;
   
std::cin >> a;
   
   
if( std::cin.good() )
       
 std::cout << "OK: " << a << '\n';
   
else
       
 std::cout << "FAIL: " << a << '\n';
   
}
C:\Users\admin\Desktop\_test_>a
s
FAIL: 0

C:\Users\admin\Desktop\_test_>a
5
OK: 5
wydaje się działać poprawnie, ale gdy zaczniesz działać na plikach, to można łatwo doprowadzić do takiego przypadku:
C:\Users\admin\Desktop\_test_>a < in.txt
FAIL: 5
Gdy zaczniesz używać plików wprost w programie, ten przypadek brzegowy prędzej czy później Cię dopadnie, więc najlepiej zapomnij że istnieje good(), ta metoda dosłownie nie ma poprawnego zastosowania.

Czy cin. fail wyrzuca tylko błąd z poprzedzającej operacji?
Typowo błąd strumienia trzeba usunąć ręcznie, więc każda następna operacja po wystąpieniu błędu też zakończy się błędem.
P-178263
« 1 »
  Strona 1 z 1