Jazyk C Vstupnovstupn opercie v C Osnova prednky

  • Slides: 44
Download presentation
Jazyk C++ Vstupno-výstupné operácie v C++

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

Osnova prednášky n n n Charakteristika jazyka C++ Niektoré rozdiely medzi C a C++

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

Jazyk C++ n Jazyk vyvinul v r. 1983 Dán Bjarne Stroustrup (v súčasnosti pôsobí

Jazyk C++ n 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”.

Charakteristika C++ n n n Takmer úplná kompatibilita s jazykom C Podpora procedurálneho aj

Charakteristika C++ n n n 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

Niektoré rozdiely medzi C a C++ n n n n C nepodporuje objektové a

Niektoré rozdiely medzi C a C++ n n n n 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

Štruktúra programu v C++ n Väčšina kompilátorov vyžaduje nasledujúcu štruktúru programu #include<cstdlib> hlavičkové súbory

Štruktúra programu v C++ n 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() {. . . return 0; } funkcia main vracia hodnotu (int)

Deklarácia lokálnych premenných n V C++ je napr. možný nasledujúci zápis: int main() {.

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

Vstupy a výstupy v C++ n n Základným pojmom pre vstupno-výstupné operácie je stream

Vstupy a výstupy v C++ n n 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: Stream V skutočnosti:

Vstupy a výstupy v C++ n Na riadenie vstupov a výstupov máme v C++

Vstupy a výstupy v C++ n 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

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

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

Knižnica iostream n n n Táto knižnica obsahuje funkcie potrebné na vstupy z klávesnice

Knižnica iostream n n n Táto knižnica obsahuje funkcie potrebné na vstupy z klávesnice a výstupy na obrazovku Kompletný popis: http: //www. cplus. com/reference/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

Výstup na obrazovku n Príklad: Chceme vypísať hodnotu čísla a znakový reťazec int cislo=2.

Výstup na obrazovku n 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;

Výstup na obrazovku n n Vypísanie reťazca (bloku dát): cout. write(char *s, int length)

Výstup na obrazovku n n 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ýstupu pre 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

Výstup na obrazovku n n Formátovanie výstupu pomocou knižnice iomanip: setprecision(int n) má rovnaký

Výstup na obrazovku n n 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. 23

Vstup z klávesnice n n Príklad: Načítanie celého čísla int cislo; cin>>cislo; Načítanie reťazca:

Vstup z klávesnice n n 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.

Vstup z klávesnice n Príklad: Načítanie a vypísanie vety #include<iostream> using namespace std; int

Vstup z klávesnice n 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

Vstup z klávesnice n Príklad: Načítanie a vypísanie vety #include<iostream> using namespace std; int

Vstup z klávesnice n 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?

Zhrnutie n n n Stream je základom vstupno-výstupných operácií a predstavuje skutočné vstupné alebo

Zhrnutie n n n 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

Knižnice ifstream, ofstream, fstream n n n Tieto knižnice umožňujú vstupno-výstupné operácie z/do súboru

Knižnice ifstream, ofstream, fstream n n n Tieto knižnice umožňujú vstupno-výstupné operácie z/do súboru Kompletný popis: http: //www. cplus. 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 knižnice sa volajú aj triedy, ktoré sú abstrakciou skutočných dátových súborov fstream/ifstream/ofstream

Otvorenie a zatvorenie súboru n n n Uvedené funkcie sú metódy tried fstream, ifstream,

Otvorenie a zatvorenie súboru n n n Uvedené funkcie sú metódy tried fstream, ifstream, ofstream Otvorenie súboru: void open(const char *filename, openmode) 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()

Otvorenie a zatvorenie súboru n n Iný spôsob otvorenia súboru: pomocou konštruktora triedy fstream

Otvorenie a zatvorenie súboru n n Iný spôsob otvorenia súboru: pomocou konštruktora triedy fstream file(const char *filename, openmode) 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();

Otvorenie a zatvorenie súboru n n Keďže súbor sa z rôznych dôvodov nemusí podariť

Otvorenie a zatvorenie súboru n n 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. .

Výstup do súboru n Príklad: Zapísanie čísel do textového súboru #include<fstream>. . . fstream

Výstup do súboru n 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);

Výstup do súboru n n Na zapísanie jedného znaku (=1 byte) do súboru máme

Výstup do súboru n n 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; }

Výstup do súboru n n Na neformátovaný zápis bloku dát do súboru máme príkaz:

Výstup do súboru n n 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; }

Vstup zo súboru n Príklad: Načítanie n čísel z textového súboru do poľa #include<fstream>

Vstup zo súboru n 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(); }

Vstup zo súboru n n Načítanie znaku (alebo 1 bytu) zo súboru: fstream& get(char

Vstup zo súboru n n 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]; 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; }

Vstup zo súboru n n Načítanie bloku dát z binárneho súboru: fstream& read(char *buf,

Vstup zo súboru n n 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() { intensity[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; }

Vstup zo súboru n n Načítanie reťazca znakov z textového súboru: fstream& getline(char *buf,

Vstup zo súboru n n 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ť.

Vstup zo súboru n Najskôr si zadefinujeme dátový typ zamestnanec : typedef struct {

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

Vstup zo súboru int main() { zamestnanec z[10]; int n; fstream textfile("zamestnanci. txt", fstream:

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;

Testovanie konca súboru n n Na zistenie konca súboru máme funkciu bool eof() ktorá

Testovanie konca súboru n n 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;

Testovanie konca súboru n Ak pri predchádzajúcom programe použijeme vstupný súbor v tvare: 1

Testovanie konca súboru n 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

Testovanie konca súboru n Ak sa chceme vyhnúť tejto chybe, môžeme to urobiť napr.

Testovanie konca súboru n 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; }

Testovanie konca súboru n n Všimnime si ešte raz syntax funkcie getline: fstream& getline(char

Testovanie konca súboru n n 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

Testovanie konca súboru n Program pre načítanie údajov o zamestnancoch môžeme prepísať: int main()

Testovanie konca súboru n 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; }

Pohyb v súbore n n Ak chceme priamo nastaviť pozíciu, z ktorej chceme načítať

Pohyb v súbore n n 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()

Pohyb v súbore n Príklad: Vypísanie obsahu súboru od zadanej pozície int main(int argc,

Pohyb v súbore n 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; }

Pohyb v súbore n Príklad: Oprava chybného znaku v súbore Súbor subor. txt má

Pohyb v súbore n 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?

Testovanie stavu súboru n Ak vykonávame so súborom vstupno-výstupné operácie, môžeme si počas nich

Testovanie stavu súboru n 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ý

Testovanie stavu súboru n Príklad: Načítanie čísel zo súboru s testovaním počas čítania int

Testovanie stavu súboru n 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; }

Výpis chybových správ n n n Vráťme sa naspäť ku knižnici iostream Na výpis

Výpis chybových správ n n n 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 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 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.

Výpis chybových správ n Príklad: Čítanie zo súboru s výpisom chybových správ fstream textfile(“cisla.

Výpis chybových správ n 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!

Zhrnutie n n n n Na vstupno-výstupné operácie so súbormi slúži knižnica fstream Na

Zhrnutie n n n n 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