Obie zwracają wartość typu
bool.
fail() jest opisane w
Obsługa strumienia wejściowego, 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:
#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.