Programowanie w C++ Wykład 11 Katarzyna Grzelak 21 maja 2018 K.Grzelak (Wykład 11) Programowanie w C++ 1 / 24
Strumienie Strumień bajtów płynacy od źródła do ujścia: 1 standardowe strumienie wejściowe i wyjściowe (klawiatura, ekran) 2 strumienie zwiazane z plikami 3 strumienie zapisujace do/czytajace z obiektu string K.Grzelak (Wykład 11) Programowanie w C++ 2 / 24
Sprawdzanie stanu strumienia Przykłady problemów: plik, z którego chcieliśmy czytać nie istnieje chcieliśmy wczytać liczbę, a w strumieniu pojawił się napis za mało miejsca na dysku, żeby zapisać plik... K.Grzelak (Wykład 11) Programowanie w C++ 3 / 24
Sprawdzanie stanu strumienia - flagi W każdym obiekcie klasy strumień jest flaga przechowujaca aktualny stan strumienia. goodbit wszystko OK eofbit napotkany znak końca pliku failbit bład, ale nie krytyczny, po wyzerowaniu flagi strumień nadaje się do dalszej pracy badbit bład krytyczny K.Grzelak (Wykład 11) Programowanie w C++ 4 / 24
Sprawdzanie stanu strumienia Funkcje do sprawdzania flagi błędu: Funkcja przykład bool good() while(cin.good()) bool eof() if(fileinp.eof()) bool fail() if(cin.fail()) lub if(!cin) if(!cin.fail()) lub if(cin) bool bad() if(fileout.bad()) Metoda clear() kasuje wszystkie flagi błędu. K.Grzelak (Wykład 11) Programowanie w C++ 5 / 24
Sprawdzanie stanu strumienia Rezultatem wyrażenia cin» liczba; lub fileinp» liczba; jest referencja do danego strumienia. Jeśli operacja się nie powiedzie to rezultatem jest zero (NULL). Dlatego stan strumienia można sprawdzać też tak: if(cin»liczba) {...} albo if(fileinp»liczba) {...} Kaskadowe instrukcje! K.Grzelak (Wykład 11) Programowanie w C++ 6 / 24
Pliki - przypomnienie Plik nagłówkowy #include<fstream> ifstream - klasa do czytania z pliku ofstream - klasa do pisania do pliku K.Grzelak (Wykład 11) Programowanie w C++ 7 / 24
Przypomnienie: Klasa ofstream - do pisania do plików Analogicznie do cout: ofstream fileout( out.txt ); fileout1 «Tekst «endl; fileout1 «M_PI ««M_PI*M_PI «endl; fileout1.close(); K.Grzelak (Wykład 11) Programowanie w C++ 8 / 24
Przypomnienie: Klasa ifstream - do czytania z plików Nazwa pliku wczytywana z klawiatury: cout «Podaj nazwe pliku «endl; string nazwa; cin» nazwa; ifstream fileinp(nazwa.c_str()); W standardzie C++11, w klasach ifstream, ofstream istnieje już konstruktor przyjmujacy argument klasy string. W OKWF kompilacja z opcja: g++ -std=c++11 -o prog prog.cc ifstream fileinp(nazwa); K.Grzelak (Wykład 11) Programowanie w C++ 9 / 24
Przypomnienie: Klasa ifstream - do czytania z plików Dobre praktyki: Po otwarciu pliku do czytania od razu sprawdzanie czy plik istnieje. ifstream fileinp(nazwa); if(fileinp.fail()){ cout «Brak pliku «endl; return 1; } Po każdej operacji czytania od razu sprawdzanie czy dobry stan strumienia. K.Grzelak (Wykład 11) Programowanie w C++ 10 / 24
Przypomnienie: Klasa ifstream - do czytania z plików Analogicznie do cin: ifstream fileinp( inp.txt ); int liczba; while(true){ fileinp1» liczba; if(fileinp1.fail()){ break; } } lub while(fileinp1» liczba){ cout «Wczytana liczba = «liczba «endl; } K.Grzelak (Wykład 11) Programowanie w C++ 11 / 24
Użyteczna funkcja nie będaca składowa klasy getline(strumien inp, string linia, char separator= \n ); Do wczytywania ze strumienia do stringu całej linii (do znaku separatora - domyślnie do znaku nowej linii) Przykłady string linia; getline(cin,linia); ifstream fileinp( data.txt ); getline(fileinp,linia); K.Grzelak (Wykład 11) Programowanie w C++ 12 / 24
Wybrane klasy z biblioteki standardowej klasy ostringstream i istringstream K.Grzelak (Wykład 11) Programowanie w C++ 13 / 24
Klasa ostringstream Strumień zapisujacy do obiektu klasy string #include<sstream> Strumień zamiast do pliku płynie do określonego obszaru w pamięci Po co? Np. można łatwo wpisać liczby do obiektu klasy string Obiekt klasy ostringstream: ostringstream s1; ostringstream s1(ios::app); ostringstream s1("uwaga",ios::app); K.Grzelak (Wykład 11) Programowanie w C++ 14 / 24
Klasa ostringstream Strumień zapisujacy do obiektu klasy string Przykład zapisywania do strumienia (podobnie jak dla cout): int rok=2018; string nazwa= symulacje ; string miesiac= maj ; int dzien=14; ostringstream s1; s1 «nazwa «dzien «miesiac «rok; Funkcja zwracajaca obiekt klasy string: string s=s1.str(); K.Grzelak (Wykład 11) Programowanie w C++ 15 / 24
Klasa istringstream Strumień czytajacy z obiektu klasy string #include<sstream> Strumień który płynie od obiektu klasy string Po co? Np. chcemy z napisu wyodrębnić liczby (argumenty funkcji main!) Obiekt klasy istringstream: string tekst( 14 05 2018 poniedziałek ); istringstream s1; istringstream s1(tekst); K.Grzelak (Wykład 11) Programowanie w C++ 16 / 24
Klasa istringstream Strumień czytajacy z obiektu klasy string Czytanie ze strumienia (podobnie jak dla cin): int dzien, miesiac, rok; string dzien_tygodnia; s1» dzien» miesiac» rok» dzien_tygodnia; K.Grzelak (Wykład 11) Programowanie w C++ 17 / 24
Użycie istringstream argumenty funkcji main...... czyli parametry z linii wywołania programu Przypomnienie Deklaracje funkcji main 1 int main() 2 int main(int argc,char* argv[]) K.Grzelak (Wykład 11) Programowanie w C++ 18 / 24
Użycie istringstream argumenty funkcji main...... czyli parametry z linii wywołania programu Przypomnienie Deklaracje funkcji main 1 int main() 2 int main(int argc,char* argv[]) 3 int main(int argc,char** argv) K.Grzelak (Wykład 11) Programowanie w C++ 19 / 24
Użycie istringstream argumenty funkcji main... Przypomnienie argc licznik parametrów wywołania (łacznie z nazwa programu) argv tablica wskaźników do ciagów znaków (C-string) K.Grzelak (Wykład 11) Programowanie w C++ 20 / 24
Użycie istringstream argumenty funkcji main... Przypomnienie Przykładowe uruchomienie programu g++ -o prog prog.cc./prog kwadrat 15.5 K.Grzelak (Wykład 11) Programowanie w C++ 21 / 24
Użycie istringstream argumenty funkcji main... Kompletny przykład użycia klasy istringstream do zamiany argumentu funkcji main na liczbę. Poczatek programu. K.Grzelak (Wykład 11) Programowanie w C++ 22 / 24
Użycie istringstream argumenty funkcji main... Zamiana napisu na liczbę. Środek programu. K.Grzelak (Wykład 11) Programowanie w C++ 23 / 24
Użycie istringstream argumenty funkcji main... Generacja znaków i zapisywanie ich do pliku i na ekran. Koniec programu. K.Grzelak (Wykład 11) Programowanie w C++ 24 / 24