24
Programowanie w C++ Wyklad 11 Katarzyna Grzelak 21 maja 2018 K.Grzelak (Wyklad 11) Programowanie w C++ 1 / 24

Wykład 11 Katarzyna Grzelak 21 maja 2018kaste/prog2018/wyklad11.pdfSprawdzanie stanu strumienia - flagi W kazdym obiekcie klasy strumie˙ n jest flaga´ przechowujaca˛ aktualny

  • 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

Uzycie istringstream – argumenty funkcji main . . .

Generacja znaków i zapisywanie ich do pliku i naekran.Koniec programu.

K.Grzelak (Wykład 11) Programowanie w C++ 24 / 24