Upload
buitu
View
217
Download
0
Embed Size (px)
Citation preview
Programowanie w C++Wykład 11
Katarzyna Grzelak
21 maja 2018
K.Grzelak (Wykład 11) Programowanie w C++ 1 / 24
Strumienie
Strumien bajtów płynacy od zródła do ujscia:
1 standardowe strumienie wejsciowe i wyjsciowe(klawiatura, ekran)
2 strumienie zwiazane z plikami3 strumienie zapisujace do/czytajace z obiektustring
K.Grzelak (Wykład 11) Programowanie w C++ 2 / 24
Sprawdzanie stanu strumienia
Przykłady problemów:
plik, z którego chcielismy czytac nie istniejechcielismy wczytac liczbe, a w strumieniu pojawiłsie napisza mało miejsca na dysku, zeby zapisac plik. . .
K.Grzelak (Wykład 11) Programowanie w C++ 3 / 24
Sprawdzanie stanu strumienia - flagi
W kazdym obiekcie klasy strumien jest flagaprzechowujaca aktualny stan strumienia.
goodbit – wszystko OKeofbit – napotkany znak konca plikufailbit – bład, ale nie krytyczny, po wyzerowaniuflagi strumien nadaje sie do dalszej pracybadbit – bład krytyczny
K.Grzelak (Wykład 11) Programowanie w C++ 4 / 24
Sprawdzanie stanu strumienia
Funkcje do sprawdzania flagi błedu:
Funkcja przykładbool 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łedu.
K.Grzelak (Wykład 11) Programowanie w C++ 5 / 24
Sprawdzanie stanu strumienia
Rezultatem wyrazeniacin » liczba;lubfileinp » liczba;jest referencja do danego strumienia. Jesli operacjasie nie powiedzie to rezultatem jest zero (NULL).
Dlatego stan strumienia mozna sprawdzac tez tak:if(cin»liczba) { ...}alboif(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 plikuofstream - klasa do pisania do pliku
K.Grzelak (Wykład 11) Programowanie w C++ 7 / 24
Przypomnienie: Klasa ofstream - do pisania doplikó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 zplikó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, ofstreamistnieje juz konstruktor przyjmujacy argument klasystring. 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 zplików
Dobre praktyki:Po otwarciu pliku do czytania od razu sprawdzanieczy plik istnieje.
ifstream fileinp(nazwa);if(fileinp.fail()){
cout « ”Brak pliku” « endl;return 1; }
Po kazdej operacji czytania od razu sprawdzanie czydobry stan strumienia.
K.Grzelak (Wykład 11) Programowanie w C++ 10 / 24
Przypomnienie: Klasa ifstream - do czytania zplików
Analogicznie do cin:ifstream fileinp(”inp.txt”);int liczba;while(true){
fileinp1 » liczba;if(fileinp1.fail()){
break;}
}lubwhile(fileinp1 » liczba){cout « ”Wczytana liczba = ” « liczba « endl;
}
K.Grzelak (Wykład 11) Programowanie w C++ 11 / 24
Uzyteczna funkcja nie bedaca składowa klasy
getline(strumien inp, string linia,char separator=’\n’);Do wczytywania ze strumienia do stringu całej linii (doznaku separatora - domyslnie do znaku nowej linii)
Przykładystring 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
Strumien zapisujacy do obiektu klasy string
#include<sstream>Strumien zamiast do pliku płynie do okreslonegoobszaru w pamieciPo co ? Np. mozna łatwo wpisac liczby do obiektuklasy stringObiekt 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
Strumien 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
Strumien czytajacy z obiektu klasy string
#include<sstream>Strumien który płynie od obiektu klasy stringPo co ? Np. chcemy z napisu wyodrebnic liczby(argumenty funkcji main !)Obiekt klasy istringstream:string tekst(”14 05 2018poniedziałek”);istringstream s1;istringstream s1(tekst);
K.Grzelak (Wykład 11) Programowanie w C++ 16 / 24
Klasa istringstream
Strumien 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
Uzycie istringstream – argumenty funkcji main . . .. . . czyli parametry z linii wywołania programu
Przypomnienie
Deklaracje funkcji main1 int main()2 int main(int argc,char* argv[])
K.Grzelak (Wykład 11) Programowanie w C++ 18 / 24
Uzycie istringstream – argumenty funkcji main . . .. . . czyli parametry z linii wywołania programu
Przypomnienie
Deklaracje funkcji main1 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
Uzycie istringstream – argumenty funkcji main . . .
Przypomnienie
argc – licznik parametrów wywołania(łacznie z nazwa programu)argv – tablica wskazników do ciagówznaków (C-string)
K.Grzelak (Wykład 11) Programowanie w C++ 20 / 24
Uzycie istringstream – argumenty funkcji main . . .
Przypomnienie
Przykładowe uruchomienie programug++ -o prog prog.cc./prog kwadrat 15.5
K.Grzelak (Wykład 11) Programowanie w C++ 21 / 24
Uzycie istringstream – argumenty funkcji main . . .
Kompletny przykład uzycia klasy istringstream dozamiany argumentu funkcji main na liczbe.Poczatek programu.
K.Grzelak (Wykład 11) Programowanie w C++ 22 / 24
Uzycie istringstream – argumenty funkcji main . . .
Zamiana napisu na liczbe.Srodek programu.
K.Grzelak (Wykład 11) Programowanie w C++ 23 / 24