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

rozdzial/lekcja 34, zadanie nr 1

Ostatnio zmodyfikowano 2022-04-22 18:51
Autor Wiadomość
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.
C/C++
#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;
   
} //if
   
int suma = 0;
   
while( !plik.eof() )
   
{
       
int iLiczba;
       
plik >> iLiczba;
       
       
if( !plik.fail() )
       
{
           
std::cout << iLiczba << " ";
           
suma += iLiczba;
       
}
       
else
       
{
           
plik.clear();
           
plik.ignore();
       
}
    }
//while
   
std::cout << "\n" << "suma: " << suma << std::endl;
   
return true;
}


int main()
{
   
if( odczytajPlik( "ddd.txt" ) )
   
//std::cout << "Koniec pliku" << std::endl;
   
       
 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:

C/C++
else
{
   
if( plik.eof() )
       
 break;
   
   
return false; // wczytanie znaku powinno zawsze się udać, chyba że skończyły się dane
} //if

sprobowalem zrobic drobna modyfikacje i kod rowniez dziala.
C/C++
else
   
 return true;

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.
C/C++
if( plik.bad() )
   
 return false; //wczytanie liczby nie powiodło się z powodu poważnego błędu

czy komentarz jest zle opisany, czy ja czegos nie zrozumialem z lekcji?
P-179414
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.
P-179415
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
P-179416
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.
P-179417
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):
C/C++
if( plik.bad() )
   
 return false; //wczytanie liczby nie powiodło się z powodu poważnego błędu

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?

P-179418
pekfos
» 2022-04-22 17:28:48
Interpretacja B nie ma żadnego sensu. Na jakiej podstawie twierdzisz, że coś tu wczytuje kolejną pozycję?
P-179420
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.


P-179422
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:
C/C++
#include <iostream>
#include <fstream>

int main()
{
   
std::ifstream ifs( "a.cpp" );
   
   
while( !ifs.eof() )
   
{
       
int liczba = 0;
       
ifs >> liczba;
       
//ifs.setstate(std::ios::badbit);
       
       
if( ifs.fail() )
       
{
           
std::cout << "Error\n";
           
ifs.clear();
           
//ifs.setstate(std::ios::badbit);
           
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ę.
P-179424
« 1 »
  Strona 1 z 1