2010-11-17 15 views
21

Kolega powiedział mi, że właśnie tego kodu:ifstream: sprawdź czy otwarto pomyślnie

std::ifstream stream(filename.c_str()); 
if (!stream) 
{ 
    throw std::runtime_error(".."); 
} 

byłoby źle. Powiedział, że ifstream ma wartość 0, jeśli otwarcie się powiedzie. Mój kod działa, ale chciałem znaleźć dokumentację, ale nie widziałem, gdzie jest napisane, jak sprawdzić, czy otwarcie się powiodło. Czy możesz wskazać mi to?

Odpowiedz

29

operator!is overloaded dla std::ifstream, więc może to zrobić.

Moim zdaniem jest to jednak okropne nadużycie przeciążenia operatora (przez komitet normalizacyjny). Jest o wiele bardziej jednoznaczne, co sprawdzasz, jeśli po prostu wykonujesz if (stream.fail()).

+6

nie zapomnij sprawdzić 'stream.bad()', 'stream.good()', 'stream.fail()' i 'stream.is_open()'. westchnienie ... – Inverse

+0

wielkie dzięki za link! Zgadzam się, że nie jest miło przeprowadzać kontroli przy użyciu tego operatora, więc zmienię to. Nie rozmawialibyśmy z nim jeśli (stream.fail()). – Philipp

+9

The! jest przeciążony, aby sprawdzić "fail" i "zły" –

8

Możesz również użyć is_open(), aby sprawdzić, czy zadziałało, ale! jest dozwolone (nie jest to sprawdzanie zerowe, jest to specjalne overload of !) Po prostu nie interesuje mnie - dlaczego to nie rzuca wyjątku?
Czy to właśnie strumienie zostały wprowadzone przed wyjątkami?
czy jesteśmy w starym języku C++ - to tylko błąd, który nie jest wyjątkowy, by stanowić wyjątek.

8

Możesz sprawić, że dany strumień rzuci wyjątek na którymkolwiek z eof/fail/bad, wywołując jego funkcję ios::exceptions() z odpowiednią maską bitową. Tak więc, można przepisać przykład w pierwszym pytaniu powyżej jako:

std::ifstream stream; 
stream.exceptions(std::ios::failbit | std::ios::badbit); 
stream.open(filename.c_str()); 

tutaj rzuci wyjątek, gdy failbit lub badbit zostanie ustawiony. Na przykład, jeśli nie powiedzie się ifstream::open(), ustawi on failbit i wygeneruje wyjątek. Oczywiście, spowoduje to zgłoszenie wyjątku później, jeśli którykolwiek z tych bitów zostanie ustawiony w strumieniu, więc to przepisanie nie jest dokładnie takie samo jak w pierwszym przykładzie. Możesz zadzwonić pod numer

, aby anulować wszystkie wyjątki w strumieniu i powrócić do sprawdzania błędów.

2

Twój współpracownik ma nieprawidłowy. Być może zapomniał, że nie piszesz C.

Kod jest na miejscu. To jest dokładnie jak powinieneś sprawdzać stan strumienia.

Powiązane problemy