jebackoze Temat założony przez niniejszego użytkownika |
rozdzial/lekcja 34, zadanie nr 1 » 2022-04-20 21:35:23 hej, napisalem taki kod, ktory zdaje sie, ze dziala. chyba, ze ktos ma jakies uwagi. #include <iostream> #include <fstream> #include <string>
bool odczytajPlik( std::string sNazwaPliku ) { std::ifstream plik; plik.open( sNazwaPliku.c_str() ); if( !plik.good() ) { std::cout << "Nie udalo sie otworzyc pliku." << std::endl; return false; } int suma = 0; while( !plik.eof() ) { int iLiczba; plik >> iLiczba; if( !plik.fail() ) { std::cout << iLiczba << " "; suma += iLiczba; } else { plik.clear(); plik.ignore(); } } std::cout << "\n" << "suma: " << suma << std::endl; return true; }
int main() { if( odczytajPlik( "ddd.txt" ) ) return 0; } pyt. 1. przy okazji robiac to pierwsze zadanie, analizowalem kod (przyklad) z lekcji i napotykam pewna przeszkode w zrozumieniu badz wyobrazeniu sobie czemu tak wyglada ten fragment kodu: else { if( plik.eof() ) break; return false; } sprobowalem zrobic drobna modyfikacje i kod rowniez dziala. moze bylby ktos tak uprzejmy wyjasnic mi to bo potykam sie o te kwestie. pyt. 2. w lekcji opisane jest, ze dotyczy to jakiegos powaznego bledu, np. bad sector czy brak dostepnosci. jednym slowem np. odlaczam pendrive z plikiem i wystepuje blad i wowczas ponizszy kod zwraca false. ale z kolei komentarz wskazuje, ze chodzi tylko o wczytywanie liczby. if( plik.bad() ) return false; czy komentarz jest zle opisany, czy ja czegos nie zrozumialem z lekcji? |
|
pekfos |
» 2022-04-20 21:56:51 Dodanie else w tamtym punkcie niczego nie wnosi, bo wykonanie break przekazuje sterowanie za pętlę, więc kod za ifem się wykonuje tylko w przypadku niespełnionego warunku. w lekcji opisane jest, ze dotyczy to jakiegos powaznego bledu, np. bad sector czy brak dostepnosci. jednym slowem np. odlaczam pendrive z plikiem i wystepuje blad i wowczas ponizszy kod zwraca false. ale z kolei komentarz wskazuje, ze chodzi tylko o wczytywanie liczby. Może błąd wtedy występuje, ale dowiesz się o tym dopiero po próbie wczytania czegoś. Flagi błędów nie ustawiają się samoistnie, w przeciwnym razie używanie funkcji fail(), bad(), eof() nie byłoby bezpieczne. |
|
jebackoze Temat założony przez niniejszego użytkownika |
» 2022-04-20 22:10:36 Dodanie else w tamtym punkcie niczego nie wnosi, bo wykonanie break przekazuje sterowanie za pętlę, więc kod za ifem się wykonuje tylko w przypadku niespełnionego warunku. rozumiem, ze to odpowiedz na 1-sze pytanie. jesli tak to ja zadnego else nie dodaje tylko usunalem jednego if ze slowem kluczowym break , tj. skrocilem i kod nadal dziala i nie moge zrozumiec co wnosi ten dodatkowy warunek w przykladzie oprocz tego, ze "formalnie" moze przerwac petle. odn. pyt. 2 bardziej chodzilo mi o to, ze wg mnie z lekcji wynika co innego niz z tresci tego komentarza, przez co blednie mozna to zrozumiec. dlatego szukam jakiegos dodatkowego wyjasnienia. komentarz wskazuje jakby opisywal flage fail(). i nie jestem teraz pewny wlasciwej definicji |
|
pekfos |
» 2022-04-20 23:19:34 rozumiem, ze to odpowiedz na 1-sze pytanie. jesli tak to ja zadnego else nie dodaje tylko usunalem jednego if ze slowem kluczowym break , tj. skrocilem i kod nadal dziala i nie moge zrozumiec co wnosi ten dodatkowy warunek w przykladzie oprocz tego, ze "formalnie" moze przerwac petle. Dobra, źle zrozumiałem o jakie else chodzi. W przykładzie z lekcji te break to jedyny sposób na wyjście z funkcji zwracając true. Poza dwoma dodatkowymi wypisami nie ma różnicy w działaniu. komentarz wskazuje jakby opisywal flage fail(). i nie jestem teraz pewny wlasciwej definicji fail() sprawdza czy wystąpił jakikolwiek błąd, a bad() czy wystąpił konkretnie "poważny błąd" o którym mowa w komentarzu. |
|
jebackoze Temat założony przez niniejszego użytkownika |
» 2022-04-21 21:06:02 nie do konca rozumiem odpowiedz na pyt. nr 2. w lekcji mamy takie cos (A): badbit Wystąpił poważny błąd. Na przykład napotkano bad sector na dysku, albo urządzenie wejściowe przestało być dostępne. Różni się od zwykłego błędu tym, że po wystąpieniu poważnego błędu strumień nie musi być zdatny do użycia. a w przykladzie mamy kod (B): if( plik.bad() ) return false; A. rozumiem tak, ze np. odlaczam pendrive z plikiem i wystepuje blad wczytywania, wywala error bo plik nie jest dostepny. B. ten komentarz brzmi tak jakby wczytywanie liczby nie powiodlo sie wiec wczytuje kolejna pozycje, np. znak. stad pytanie, czy ten komentarz nie wprowadza w blad patrzac na to, co mamy w A. chyba, ze po prostu ja go zle interpretuje? |
|
pekfos |
» 2022-04-22 17:28:48 Interpretacja B nie ma żadnego sensu. Na jakiej podstawie twierdzisz, że coś tu wczytuje kolejną pozycję? |
|
jebackoze Temat założony przez niniejszego użytkownika |
» 2022-04-22 17:50:01 mialem chyba gorszy wieczor bo interpretacja (B) jest faktycznie bledna. reasumujac i patrzac na ten komentarz, flaga plik.bad() moze sie pojawic wylacznie podczas wczytywania liczby w tym przykladzie, a przy wczytywaniu znaku juz nie. skoro (A) nie okresla, ze problem wystepuje z liczba tylko z plikiem w trakcie odczytu wiec moje pytanie, czy komentarz w przykladzie jest po prostu dobrze sformułowany.
|
|
pekfos |
» 2022-04-22 18:51:45 flaga plik.bad() moze sie pojawic wylacznie podczas wczytywania liczby w tym przykladzie, a przy wczytywaniu znaku juz nie. Może się pojawić przy każdej operacji odczytu, ale w przypadku znaku to już jest obsłużone inaczej, bo jakikolwiek błąd powoduje wyjście z funkcji. Sprawdzanie badbit po wczytywaniu nie jest tu nawet takie istotne, bo jeśli błąd będzie nieodwracalny, to wróci przy próbie usunięcia błędnego znaku i będzie zwrócone false. Może popatrz na taki przykład: #include <iostream> #include <fstream>
int main() { std::ifstream ifs( "a.cpp" ); while( !ifs.eof() ) { int liczba = 0; ifs >> liczba; if( ifs.fail() ) { std::cout << "Error\n"; ifs.clear(); ifs.ignore(); } else std::cout << "Liczba: " << liczba << '\n'; } return 0; }
Wykomentowane linie symulują poważny błąd. Jeśli wystąpi, pętla staje się nieskończona bo zakłada że błąd można wyczyścić poprzez ignorowanie błędnego wejścia. W przypadku nieodwracalnego błędu każda operacja odczytu może kończyć się błędem więc nigdy nie osiągniesz tu warunku kończącego pętlę. |
|
« 1 » |