1 / 44

Jazyk C ++ Vstupno -výstupné operácie v C ++

Jazyk C ++ Vstupno -výstupné operácie v C ++. Osnova prednášky. Charakteristika jazyka C ++ Niektoré rozdiely medzi C a C ++ Štruktúra programu v C ++ Vstupy a výstupy v C ++ Vstupy a v ýstupy z /do štandardných zariadení Vstupy a výstupy z /do súboru. Jazyk C ++.

Download Presentation

Jazyk C ++ Vstupno -výstupné operácie v C ++

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Jazyk C++Vstupno-výstupné operácie v C++

  2. Osnova prednášky • Charakteristika jazyka C++ • Niektoré rozdiely medzi C a C++ • Štruktúra programu v C++ • Vstupy a výstupy v C++ • Vstupy a výstupy z/do štandardných zariadení • Vstupy a výstupy z/do súboru

  3. Jazyk C++ • Jazyk vyvinul v r. 1983 Dán Bjarne Stroustrup (v súčasnosti pôsobí na A&M University, Texas) spojením princípov jazykov C a Simula a v menšom rozsahu iných jazykov. Pôvodne sa nazýval “C s triedami”.

  4. Charakteristika C++ • Takmer úplná kompatibilita s jazykom C • Podpora procedurálneho aj objektovo orientovaného programovania • Podpora generického programovania (možnosť využitia štruktúr a algoritmov, ktoré fungujú pre ľubovoľný dátový typ) – možnosť vytvárania tzv. šablón (templates) a využitia šablón, ktoré sú štandardnou súčasťou jazyka (knižnice STL – Standard Template Library) • Statické typovanie dát – dátový typ každej premennej musí byť známy už v čase kompilácie • Snaha vyhnúť sa funkciám, ktoré by boli závislé od platformy • Možnosť programovať v jazyku aj bez komplikovaného vývojového prostredia

  5. Niektoré rozdiely medzi C a C++ • C nepodporuje objektové a generické programovanie • C++ má vybudovanú obsluhu výnimiek • V C++ je dovolená deklarácia lokálnych premenných na ľubovoľnom mieste, v C musia byť na začiatku funkcie • C++ má nový dátový typ bool, ktorý uchováva pravdivostnú hodnotu true alebo false • V C++ je iný mechanizmus vstupu a výstupu, nemusí sa udávať formát • Ak je v C++ deklarovaná funkcia, ktorá vracia hodnotu, musí príkaz return naozaj obsahovať príslušnú hodnotu. V C, ak to tak nie je, funkcia vráti náhodnú hodnotu • Ak sa v C nešpecifikuje návratový typ funkcie, automaticky sa predpokladá int. V C++ to tak nie je

  6. Štruktúra programu v C++ • Väčšina kompilátorov vyžaduje nasledujúcu štruktúru programu #include<cstdlib> hlavičkové súbory bez prípony .h using namespace std; indikácia, že budeme používať C++ príkazy int main() funkcia main vracia hodnotu (int) { ... return 0; }

  7. Deklarácia lokálnych premenných • V C++ je napr. možný nasledujúci zápis: int main() { ... int sum=0; for (inti=1;i<=10;i++) { for (intj=1;j<10;j++) sum+=1; } ... }

  8. Vstupy a výstupy v C++ • Základným pojmom pre vstupno-výstupné operácie je stream • Stream (dátový prúd) je abstrakciou vstupno-výstupného zariadenia, všetky operácie vykonané na streame sa fyzicky prejavia na danom zariadení V programe: V skutočnosti: Stream

  9. Vstupy a výstupy v C++ • Na riadenie vstupov a výstupov máme v C++ dva operátory: operátor << : posielanie dát do streamu syntax: stream << dáta operátor >> : vyberanie dát zo streamu syntax: stream >> dáta

  10. Hierarchia vstupno-výstupných tried a knižníc

  11. Knižnica iostream • Táto knižnica obsahuje funkcie potrebné na vstupy z klávesnice a výstupy na obrazovku • Kompletný popis: http://www.cplusplus.com/reference/iostream/iostream/ • Na výstupné a vstupné operácie sa používajú objekty cout (console output) – objekt triedy ostream (output stream) cin (console input) – objekt triedy istream (input stream)   cout cin

  12. Výstup na obrazovku • Príklad: Chceme vypísať hodnotu čísla a znakový reťazec int cislo=2.5; char *s=“Toto bol moj prvy vypis v C++ “ cout<<“Hodnota cisla je: “<<cislo; Ak chceme po vypísaní ukončiť riadok: cout<<“Hodnota cisla je: “<<cislo<<endl; Vypísanie spolu s reťazcom: cout<<“Hodnota cisla je: “<<cislo<<endl<<s<<endl;

  13. Výstup na obrazovku • Vypísanie reťazca(bloku dát): cout.write(char *s, int length) táto funkcia vypíše reťazec s, pričom sa zobrazí length znakov • Formátovanie výstupupre operátor <<: cout.precision(int n) nastaví počet desatinných miest, ktoré sa vypíšu, alebo maximálnu dĺžku vypísaného argumentu cout.width(int n) nastaví minimálnu dĺžku vypísaného argumentu Tieto nastavenia platia pre všetky ďalšie výpisy, pokiaľ sa to opäť nezmení uvedenými príkazmi

  14. Výstup na obrazovku • Formátovanie výstupu pomocou knižnice iomanip: setprecision(int n) má rovnaký efekt ako cout.precision(int n) setw(int n) má rovnaký efekt ako cout.width(int n) • Príklad: Výpis desatinného čísla na rôzny počet miest #include<iostream> #include<iomanip> ... float cislo=1.2345; cout.precision(1); cout<<cislo<<endl; cout<<setprecision(2)<<cislo<<endl; ... Výstup: 1.2 1.23

  15. Vstup z klávesnice • Príklad: Načítanie celého čísla int cislo; cin>>cislo; • Načítanie reťazca: cin.get(char *s, int length) cin.getline(char *s, int length) Tieto príkazy načítajú znakový reťazec s maximálnou dĺžkou length, pričom getline vyberie zo streamu aj znak ukončenia riadku. Využívajú sa pri komplikovanejších reťazcoch, ktoré obsahujú iné ako abecedné a číselné znaky.

  16. Vstup z klávesnice • Príklad: Načítanie a vypísanie vety #include<iostream> using namespace std; int main() { char veta[30]; cout<<"Napis nejaku vetu!"<<endl; cin>>veta; cout<<"Vidim tieto slova: "<<veta<<endl; return 0; } Napis nejaku vetu! Kolko slov vidis? Vidim tieto slova: Kolko

  17. Vstup z klávesnice • Príklad: Načítanie a vypísanie vety #include<iostream> using namespace std; int main() { char veta[30]; cout<<"Napis nejaku vetu!"<<endl; cin.getline(veta,30); cout<<"Vidim tieto slova: "<<veta<<endl; return 0; } Napis nejaku vetu! Kolko slov vidis? Vidim tieto slova: Kolko slov vidis?

  18. Zhrnutie • Stream je základom vstupno-výstupných operácií a predstavuje skutočné vstupné alebo výstupné zariadenie (obrazovka, súbor...), všetky operácie na streame sa fyzicky prejavia na danom zariadení. • Na nasmerovanie dát z/do streamu používame dva základné operátory: << a >> • Výstup na obrazovku a vstup z klávesnice sa uskutočňuje pomocou knižnice iostream • cout a cin sú objekty predstavujúce štandardné výstupné a vstupné zariadenie (obrazovku a klávesnicu) • Na načítanie reťazca znakov používame metódu getline

  19. Knižnice ifstream, ofstream, fstream • Tieto knižnice umožňujú vstupno-výstupné operácie z/do súboru • Kompletný popis: http://www.cplusplus.com/reference/iostream/fstream/ • ifstream – práca zo vstupnými súbormi (input file stream) • ofstream – práca s výstupnými súbormi (output file stream) • fstream – práca so vstupno-výstupnými súbormi • Rovnako ako knižnice sa volajú aj triedy, ktoré sú abstrakciou skutočných dátových súborov  fstream/ifstream/ofstream

  20. Otvorenie a zatvorenie súboru • Uvedené funkcie sú metódy tried fstream, ifstream, ofstream • Otvorenie súboru: void open(const char *filename, openmode mode) Otvorí súbor, ktorý má na disku meno filename. mode udáva, akým spôsobom sa má súbor otvoriť a môže mať napr. tieto hodnoty: ios::in – otvorenie na čítanie ios::out – otvorenie na zapisovanie ios::app – nové dáta sa pripoja na koniec súboru ios::binary – znamená, že súbor je binárny • Zatvorenie súboru: void close()

  21. Otvorenie a zatvorenie súboru • Iný spôsob otvorenia súboru: pomocou konštruktora triedy fstream fstream file(const char *filename, openmode mode) • Príklad: Otvorenie (na zápis) a zatvorenie súboru fstream textfile; textfile.open(“subor.txt”,fstream::out); textfile.close(); alebo fstream textfile(“subor.txt”,fstream::out); textfile.close();

  22. Otvorenie a zatvorenie súboru • Keďže súbor sa z rôznych dôvodov nemusí podariť otvoriť (neexistuje, je poškodený, je problém s hardwarom a pod.), je korektné vždy testovať, či je súbor správne otvorený. Slúži na to funkcia: bool is_open() Príklad: Otvorenie súboru s testovaním fstream textfile(“subor.txt”,fstream::out); if (!textfile.is_open()) cout<<“Subor sa nepodarilo otvorit!”<<endl; else ....

  23. Výstup do súboru • Príklad: Zapísanie čísel do textového súboru #include<fstream> ... fstream textfile; textfile.open(“subor.txt”,fstream::out); for (int i=1;i<10;i++) textfile<<i<<endl; textfile.close(); Ak chceme čísla pripísať na koniec súboru: textfile.open(“subor.txt”,fstream::out | fstream::app);

  24. Výstup do súboru • Na zapísanie jedného znaku (=1 byte) do súboru máme príkaz fstream&put(char c) • Príklad: Vytvorenie obrázku vo formáte .raw (binárneho súboru) #include <fstream> using namespace std; int main() { fstream image; image.open("image.raw",fstream::out | fstream::binary); for (int i=1;i<=100;i++) for (int j=1;j<=100;j++) if ((i-50)*(i-50)+(j-50)*(j-50)<=400) image.put(255); else image.put(0); image.close(); return 0; }

  25. Výstup do súboru • Na neformátovaný zápis bloku dát do súboru máme príkaz: fstream& write(const char *buf, streamsize length) daný blok dát je v premennej buf, jeho dĺžka je length • Príklad: Vytvorenie .raw obrázku (binárneho súboru) s dátami typu integer int main() { fstream image(“image.raw”,fstream::out | fstream::binary); int n; for (int i=1;i<=100;i++) for (int j=1;j<=100;j++) { if ((i-50)*(i-50)+(j-50)*(j-50)<=400) n=(i-50)*(i-50)+(j-50)*(j-50); else n=400; image.write((char *) &n,sizeof(int)); } image.close(); return 0; }

  26. Vstup zo súboru • Príklad: Načítanie n čísel z textového súboru do poľa #include<fstream> using namespace std; #define n 100 int main() { int numbers[n]; fstream textfile(“subor.txt”,fstream::in); for (int i=0;i<n;i++) textfile>>numbers[i]; textfile.close(); }

  27. Vstup zo súboru • Načítanie znaku(alebo 1 bytu) zo súboru: fstream&get(char &c) char get() • Príklad: Načítanie dát z .raw súboru (s údajmi unsigned char) do poľa int main() { unsigned char intensity[100][100]; fstream image(“image.raw”,fstream::in | fstream::binary); for (int i=0;i<100;i++) for (j=0;j<100;j++) intensity[i][j]=image.get(); image.close(); return 0; }

  28. Vstup zo súboru • Načítanie bloku dát z binárneho súboru: fstream&read(char *buf, streamsize length) načíta blok dát dĺžky length bytov do premennej buf • Príklad: Načítanie .raw súboru s údajmi typu int do poľa int main() { int intensity[100][100]; fstream image(“image.raw”,fstream::in | fstream::binary); for (int i=0;i<100;i++) for (j=0;j<100;j++) intensity[i][j]=image.read((char*) &n[i][j], sizeof(int)); image.close(); return 0; }

  29. Vstup zo súboru • Načítanie reťazca znakov z textového súboru: fstream&getline(char *buf, streamsize length) načíta reťazec maximálnej dĺžky length do premennej buf • Príklad: Načítanie súboru s údajmi o zamestancoch firmy Majme súbor, v ktorom je zapísaný zoznam zamestnancov nejakej firmy, pričom zamestnanci a ich údaje sú uložené za sebou v nasledujúcej forme: Meno (s priezviskom) Pozícia Mesačná mzda Počet odpracovaných hodín za posledný mesiac Súbor treba načítať z disku do poľa, aby sa mohli údaje spracovať.

  30. Vstup zo súboru • Najskôr si zadefinujeme dátový typ zamestnanec : typedef struct { char meno[35]; char pozicia[20]; int hod_mzda; int hodiny; } zamestnanec;

  31. Vstup zo súboru int main() { zamestnanec z[10]; int n; fstream textfile("zamestnanci.txt",fstream::in); cout<<"Kolko je zamestnancov?"<<endl; cin>>n; for (int i=0;i<n;i++) { textfile.getline(z[i].meno,35); textfile.getline(z[i].pozicia,20); textfile>>z[i].hod_mzda; textfile>>z[i].hodiny; textfile.get();//načítanie znaku ukončenia riadku } textfile.close(); return 0; }

  32. Testovanie konca súboru • Na zistenie konca súboru máme funkciu bool eof() ktorá vráti hodnotu true, ak bol dosiahnutý koniec súboru, inak vráti false • Príklad: Načítanie všetkých čísel zo súboru int main() { int n; fstream textfile("cisla.txt",fstream::in); while (!textfile.eof()) { textfile>>n; cout<<n<<endl; } textfile.close(); return 0; }

  33. Testovanie konca súboru • Ak pri predchádzajúcom programe použijeme vstupný súbor v tvare: 1  2 uvidíme výstup 1 2 Ak však bude vstup v tvare: 1  2  uvidíme výstup 1 2 2 Je to preto, lebo po načítaní čísla 2 program ešte neprišiel na koniec súboru a to pri ďalšom pokuse o čítanie čísla spôsobí zmätok

  34. Testovanie konca súboru • Ak sa chceme vyhnúť tejto chybe, môžeme to urobiť napr. takto: int main() { int n; fstream textfile("cisla.txt",fstream::in); while (!textfile.eof()) { textfile>>n; if (textfile.eof()) break; cout<<n<<endl; } textfile.close(); return 0; }

  35. Testovanie konca súboru • Všimnime si ešte raz syntax funkcie getline: fstream&getline(char *buf, streamsize length) Vidíme, že návratová hodnota je referencia na fstream. Znamená to, že funkcia vracia smerník na stream, na ktorom je operácia vykonaná. Preto na vrátenú hodnotu môžeme aplikovať metódy triedy fstream. • Je možný napr. takýto zápis: textfile.getline(meno,35).eof() ktorý zisťuje či sme už prišli na koniec súboru textfile

  36. Testovanie konca súboru • Program pre načítanie údajov o zamestnancoch môžeme prepísať: int main() { zamestnanec z[10]; int i=0; fstream textfile("zamestnanci.txt",fstream::in); while (!textfile.getline(z[i].meno,35).eof()) { textfile.getline(z[i].pozicia,20); textfile>>z[i].hod_mzda; textfile>>z[i].hodiny; textfile.get(); i++; } textfile.close(); return 0; }

  37. Pohyb v súbore • Ak chceme priamo nastaviť pozíciu, z ktorej chceme načítať alebo na ktorú chceme zapísať, máme na to dva príkazy: fstream&seekg(off_type offset, seekdir origin) fstream& seekp(off_type offset, seekdir origin) Prvý príkaz nastaví pozíciu pre funkciu get, druhý pre funkciu put. Parameter origin udáva, odkiaľ sa pozícia určuje a môže mať hodnoty: ios::beg – začiatok súboru ios::cur – aktuálna pozícia ios::end – koniec súboru Parameter offset určuje, o koľko miest sa máme v súbore posunúť vzhľadom na origin. • Na určenie aktuálnej pozície pre put a get máme funkcie: pos_type tellg() pos_type tellp()

  38. Pohyb v súbore • Príklad: Vypísanie obsahu súboru od zadanej pozície int main(int argc, char* argv[]) { int pos; char c; fstream textfile("cisla.txt",fstream::in); cout<<"Zadaj poziciu!"<<endl; cin>>pos; textfile.seekg(pos-1,ios::beg);//pozícia pos má offset pos-1 od pozície 1 while (!textfile.eof()) { c=textfile.get(); if (textfile.eof()) break; cout<<c<<endl; } textfile.close(); return 0; }

  39. Pohyb v súbore • Príklad: Oprava chybného znaku v súbore Súbor subor.txt má nasledujúci obsah: V tomto subore sa nachadza veta s jednou chibou? Opravme chybu! int main() { fstream textfile("subor.txt",fstream::in | fstream::out); //ak by sme použili len fstream::out, súbor by sa vymazal! textfile.seekp(34,ios::beg); textfile.put('y'); textfile.close(); return 0; } Výstup: V tomto subore sa nachadza veta s jednou chybou?

  40. Testovanie stavu súboru • Ak vykonávame so súborom vstupno-výstupné operácie, môžeme si počas nich overovať, či prebiehajú v poriadku. Slúžia na to funkcie: bool good() vracia hodnotu true, ak vstupno-výstupné operácie prebiehajú v poriadku bool fail() vracia hodnotu true, ak počas vstupno-výstupných operácií došlo k ošetriteľnej chybe, napr. robíme logicky nesprávnu operáciu bool bad() vracia hodnotu true, ak došlo k fatálnej chybe, napr. ak je súbor poškodený

  41. Testovanie stavu súboru • Príklad: Načítanie čísel zo súboru s testovaním počas čítania int main() { int n; fstream textfile("cisla.txt",fstream::in); while (!textfile.eof()) { textfile>>n; if (!textfile.good()) break; cout<<n<<endl; } textfile.close(); return 0; }

  42. Výpis chybových správ • Vráťme sa naspäť ku knižnici iostream • Na výpis chybových správ je v tejto knižnici objekt cerr – objekt triedy ostream • S týmto objektom pracujeme rovnako ako s cout, ale posielame doňho výhradne chybové správy • Výpis chybovej správy teda môže vyzerať takto: cerr<<“Nastala chyba!”<<endl; • Štandardne sa chybové správy objavia na obrazovke, rovnako ako dáta poslané do cout, ale vo všeobecnosti sa dáta z oboch objektov dajú oddeliť, v čom je hlavný význam použitia cerr.

  43. Výpis chybových správ • Príklad: Čítanie zo súboru s výpisom chybových správ fstream textfile(“cisla.txt”,fstream::in); cout<<“Otvaram subor...”<<endl; if (!textfile.is_open()) cerr<<“Subor sa nepodarilo otvorit!”<<endl; else ... Ak súbor “cisla.txt” neexistuje, na obrazovke sa objaví: Otvaram subor... Subor sa nepodarilo otvorit! Chybové správy ale môžeme presmerovať napr. z príkazového riadku takto: program.exe 2> errorfile.txt V tom prípade sa na obrazovke objaví: Otvaram subor... A v súbore “errorfile.txt”: Subor sa nepodarilo otvorit!

  44. Zhrnutie • Na vstupno-výstupné operácie so súbormi slúži knižnica fstream • Na jednoduchý vstup a výstup z/do súboru máme operátory << a >> • Na čítanie a zapisovanie znakov máme metódy get a put • Na čítanie reťazca znakov slúži metóda getline • Bloky dát sa čítajú a zapisujú pomocou read a write • Poloha pre get a put sa nastavuje pomocou seekg a seekp, zisťuje sa pomocou tellg a tellp • Na testovanie stavu súboru máme metódy eof, good, fail, bad • Chybové správy sa môžu posielať do streamu cerr

More Related