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

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

Jan 03, 2016

Download

Documents

Chester Tyler

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 ++. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Jazyk C ++ Vstupno -výstupné operácie  v C ++

Jazyk CJazyk C++++ VstupnoVstupno-výstupné operácie -výstupné operácie

v Cv C++++

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

Osnova prednáškyOsnova prednášky

Charakteristika jazyka CCharakteristika jazyka C++++ Niektoré rozdiely medzi C a CNiektoré rozdiely medzi C a C++++ Štruktúra programu v CŠtruktúra programu v C++++ Vstupy a výstupy v CVstupy a výstupy v C++++ Vstupy a vVstupy a výstupy zýstupy z/do/do štandardných zariadení štandardných zariadení Vstupy a výstupy zVstupy a výstupy z/do /do súborusúboru

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

Jazyk CJazyk C++++

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

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

Charakteristika CCharakteristika C++++

Takmer Takmer úplná kompatibilita s jazykom Cúplná kompatibilita s jazykom C Podpora procedurálneho aj objektovo orientovaného Podpora procedurálneho aj objektovo orientovaného

programovaniaprogramovania Podpora generického programovania (možnosť využitia štruktúr Podpora generického programovania (možnosť využitia štruktúr

a algoritmov, ktoré fungujú pre ľubovoľný dátový typ) – a algoritmov, ktoré fungujú pre ľubovoľný dátový typ) – možnosť vytvárania tzv. šablón (templates) a využitia šablón, možnosť vytvárania tzv. šablón (templates) a využitia šablón, ktoré sú štandardnou súčasťou jazyka (knižnice STL – Standard ktoré sú štandardnou súčasťou jazyka (knižnice STL – Standard Template Library)Template Library)

Statické typovanie dát – dátový typ každej premennej musí byť Statické typovanie dát – dátový typ každej premennej musí byť známy už v čase kompilácieznámy už v čase kompilácie

Snaha vyhnúť sa funkciám, ktoré by boli závislé od platformySnaha vyhnúť sa funkciám, ktoré by boli závislé od platformy Možnosť programovať v jazyku aj bez komplikovaného Možnosť programovať v jazyku aj bez komplikovaného

vývojového prostrediavývojového prostredia

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

Niektoré rozdiely medzi C a Niektoré rozdiely medzi C a CC++++

C nepodporuje objektové a generické programovanieC nepodporuje objektové a generické programovanie CC++++ má vybudovanú obsluhu výnimiek má vybudovanú obsluhu výnimiek V CV C++ ++ je dovolená deklarácia lokálnych premenných na je dovolená deklarácia lokálnych premenných na

ľubovoľnom mieste, v C musia byť na začiatku funkcie ľubovoľnom mieste, v C musia byť na začiatku funkcie CC++++ má nový dátový typ bool, ktorý uchováva má nový dátový typ bool, ktorý uchováva

pravdivostnú hodnotu true alebo falsepravdivostnú hodnotu true alebo false V CV C++ ++ je iný mechanizmus vstupu a výstupu, nemusí sa je iný mechanizmus vstupu a výstupu, nemusí sa

udávať formát udávať formát Ak je v CAk je v C++++ deklarovaná funkcia, ktorá vracia hodnotu, deklarovaná funkcia, ktorá vracia hodnotu,

musí príkaz return naozaj obsahovať príslušnú hodnotu. V musí príkaz return naozaj obsahovať príslušnú hodnotu. V C, ak to tak nie je, funkcia vráti náhodnú hodnotuC, ak to tak nie je, funkcia vráti náhodnú hodnotu

Ak sa v C nešpecifikuje návratový typ funkcie, automaticky Ak sa v C nešpecifikuje návratový typ funkcie, automaticky sa predpokladá int. V Csa predpokladá int. V C++++ to tak nie je to tak nie je

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

Štruktúra programu v CŠtruktúra programu v C++++

Väčšina kompilátorov vyžaduje nasledujúcu štruktúru programuVäčš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;

}

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

Deklarácia lokálnych Deklarácia lokálnych premennýchpremenných

V CV C++++ je napr. možný nasledujúci zápis: 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;}...

}

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

Vstupy a vVstupy a výstupy v Cýstupy v C++++

Základným pojmom pre vstupno-výstupné operácie je Základným pojmom pre vstupno-výstupné operácie je stream

Stream (dátový prúd) je abstrakciou vstupno-výstupného Stream (dátový prúd) je abstrakciou vstupno-výstupného zariadenia, všetky operácie vykonané na streame sa fyzicky zariadenia, všetky operácie vykonané na streame sa fyzicky prejavia na danom zariadeníprejavia na danom zariadení

V programe:V programe:

StreamStream

V skutočnosti:V skutočnosti:

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

Vstupy a výstupy v CVstupy a výstupy v C++++

Na riadenie vstupov a výstupov máme v CNa riadenie vstupov a výstupov máme v C++++ dva dva operátory:operátory:

operátor operátor << : posielanie d : posielanie dát át do streamu

syntax: stream syntax: stream << << dátadáta

operátor operátor >> : : vyberanie dát vyberanie dát zo streamu

syntax: stream syntax: stream >> >> dátadáta

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

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

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

Knižnica iostreamKnižnica iostream

Táto knižnica obsahuje funkcie potrebné na vstupy z Táto knižnica obsahuje funkcie potrebné na vstupy z klávesnice a výstupy na obrazovkuklávesnice a výstupy na obrazovku

Kompletný popis:Kompletný popis:http://www.cplusplus.com/reference/iostream/iostream/

Na výstupné a vstupné operácie sa používajú objekty Na výstupné a vstupné operácie sa používajú objekty cout (console output) – objekt triedy ostream (output (console output) – objekt triedy ostream (output stream)stream)cin (console input) – objekt triedy istream (input stream) (console input) – objekt triedy istream (input stream)

coutcout

cincin

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

Výstup na obrazovkuVýstup na obrazovku

Príklad: Chceme vypísať hodnotu čísla: Chceme vypísať hodnotu čísla a znakov a znakový reťazecý reťazecint cislo=2.5;char *s=“Toto bol moj prvy vypis v C++ “cout<<“Hodnota cisla je: “<<cislo;

Ak chceme po vypAk chceme po vypísaní ukončiť riadok:ísaní ukončiť riadok:cout<<“Hodnota cisla je: “<<cislo<<endl;

VyVypísanie spolu s reťazcom:písanie spolu s reťazcom:cout<<“Hodnota cisla je: “<<cislo<<endl<<s<<endl;

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

VVýstup na obrazovkuýstup na obrazovku Vypísanie reťazca (bloku d(bloku dát):á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 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 argumentucout.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

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

VVýstup na obrazovkuýstup na obrazovku Formátovanie výstupu pomocou knižnice iomanip:

setprecision(int n)má rovnaký efekt ako cout.precision(int n)má rovnaký efekt ako cout.precision(int n)setw(int n)má rovnaký efekt ako cout.width(int n)má rovnaký efekt ako cout.width(int n)

Príklad: Výpis desatinného čísla na rôzny počet miest: 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;...VVýstup: ýstup: 1.21.23

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

Vstup z Vstup z klávesniceklávesnice

Príklad: Načítanie celého čísla: Načítanie celého číslaint cislo;cin>>cislo;

Načítanie reťazca:cin.get(char *s, int length)cin.getline(char *s, int length)

TTieto prieto príkazy načítajú znakový reťazec s maximálnou dĺžkou íkazy načítajú znakový reťazec s maximálnou dĺžkou lengthlength, pričom getline vyberie zo streamu aj znak , pričom getline vyberie zo streamu aj znak ukončenia riadku. Využívajú sa pri komplikovanejších ukončenia riadku. Využívajú sa pri komplikovanejších reťazcoch, ktoré obsahujú iné ako abecedné a číselné reťazcoch, ktoré obsahujú iné ako abecedné a číselné znaky.znaky.

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

Vstup z Vstup z klávesniceklávesnice Príklad: Načítanie a vypísanie vety: 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

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

Vstup z klVstup z klávesniceávesnice Príklad: Načítanie a vypísanie vety: 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?

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

ZhrnutieZhrnutie

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

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

Knižnice ifstream, ofstream, Knižnice ifstream, ofstream, fstreamfstream

Tieto knižnice umožňujú vstupno-výstupné operácie zTieto knižnice umožňujú vstupno-výstupné operácie z/do /do súborusúboru

Kompletný popis:Kompletný popis:http://www.cplusplus.com/reference/iostream/fstream/

ifstream – práca zo vstupnými súbormi (input file stream) – práca zo vstupnými súbormi (input file stream) ofstream – práca s výstupnými súbormi (output file – práca s výstupnými súbormi (output file

stream)stream) fstream – práca so vstupno-výstupnými súbormi – práca so vstupno-výstupnými súbormi Rovnako ako knižnice sa volajú aj triedy, ktoré sú Rovnako ako knižnice sa volajú aj triedy, ktoré sú

abstrakciou skutočných dátových súborovabstrakciou skutočných dátových súborov

fstreamfstream/ifstream/ofstream/ifstream/ofstream

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

Otvorenie a zatvorenie Otvorenie a zatvorenie súborusúboru

Uvedené funkcie sú metódy tried fstream, ifstream, ofstreamUvedené funkcie sú metódy tried fstream, ifstream, ofstream Otvorenie súboru:

void open(const char *filename, openmode mode)

OtvorOtvorí súbor, ktorý má na disku meno í súbor, ktorý má na disku meno filenamefilename. . modemode udáva, udáva, akým spôsobom sa má súbor otvoriť a môže mať napr. tieto akým spôsobom sa má súbor otvoriť a môže mať napr. tieto hodnoty:hodnoty:

ios::in – otvorenie na čítanie – otvorenie na čítanieios::out – otvorenie na zapisovanie – otvorenie na zapisovanieios::app – nové dáta sa pripoja na koniec súboru – nové dáta sa pripoja na koniec súboruios::binary – znamená, že súbor je binárny – znamená, že súbor je binárny

Zatvorenie súboru:void close()

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

Otvorenie a zatvorenie Otvorenie a zatvorenie súborusúboru

Iný spôsob otvorenia súboru: Iný spôsob otvorenia súboru: pomocou konštruktora triedy fstreamtriedy fstreamfstream file(const char *filename, openmode mode)

Príklad: : Otvorenie (na zOtvorenie (na zápis)ápis) a zatvorenie s a zatvorenie súboruúborufstream textfile;textfile.open(“subor.txt”,fstream::out);textfile.close();

aleboalebofstream textfile(“subor.txt”,fstream::out);textfile.close();

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

Otvorenie a zatvorenie Otvorenie a zatvorenie ssúboruúboru

Keďže súbor sa z rôznych dôvodov nemusí Keďže súbor sa z rôznych dôvodov nemusí podariť otvoriť (neexistuje, je poškodenýpodariť otvoriť (neexistuje, je poškodený, je , je problproblém s hardwarom a pod.), é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: Otvorenie súboru s testovanímfstream textfile(“subor.txt”,fstream::out);if (!textfile.is_open()) cout<<“Subor sa nepodarilo otvorit!”<<endl;else....

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

Výstup do súboruVýstup do súboru

Príklad: Zapísanie čísel do textového súboru: 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 Ak chceme čísla pripísať na koniec súboru:čísla pripísať na koniec súboru:textfile.open(“subor.txt”,fstream::out | fstream::app);

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

VVýstup do súboruýstup do súboru Na Na zapísanie jedného znaku ( (=1 byte) =1 byte) do súboru máme príkazdo súboru máme príkaz

fstream& put(char c)

Príklad: Vytvorenie obrázku vo formáte .raw (binárneho súboru): 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;

}

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

VVýstup do súboruýstup do súboru Na Na neformátovaný zápis bloku dát do súboru máme príkaz: 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 : Vytvorenie .raw obrázku (binárneho súboru) s dátami typu integerintegerint 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;

}

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

Vstup zo súboruVstup zo súboru Príklad: Načítanie : Načítanie nn čísel z textového súboru čísel z textového súboru do po do poľaľa

#include<fstream>using namespace std;#define n 100int main(){

int numbers[n];fstream textfile(“subor.txt”,fstream::in);for (int i=0;i<n;i++) textfile>>numbers[i];textfile.close();

}

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

Vstup zo sVstup zo súboruúboru Načítanie znaku (alebo 1 bytu) (alebo 1 bytu) zo súboru:zo súboru:

fstream& get(char &c)char get()

Príklad:Príklad: Na Načítanie dát z .raw súboru (s údajmi unsigned char) do čítanie dát z .raw súboru (s údajmi unsigned char) do poľapoľaint 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;

}

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

Vstup zo sVstup zo súboruúboru Načítanie bloku dát z binárneho súboru: z binárneho súboru:

fstream& read(char *buf, streamsize length)

nanačíta blok dát dĺžky číta blok dát dĺžky lengthlength bytov do premennej bytov do premennej bufbuf Príklad: Načítanie .raw súboru s údajmi typu int do poľa: 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;

}

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

Vstup zo sVstup zo súboruúboru Načítanie reťazca znakov z textového súboru: z textového súboru:

fstream& getline(char *buf, streamsize length)načíta reťazec maximálnej dĺžky načíta reťazec maximálnej dĺžky lengthlength do premennej do premennej bufbuf

Príklad: Načítanie súboru s údajmi o zamestancoch firmy: Načítanie súboru s údajmi o zamestancoch firmy

Majme súbor, v ktorom je zapísaný zoznam zamestnancov nejakej Majme súbor, v ktorom je zapísaný zoznam zamestnancov nejakej firmy, pričom zamestnanci a ich údaje sú uložené za sebou v firmy, pričom zamestnanci a ich údaje sú uložené za sebou v nasledujúcej forme:nasledujúcej forme:

Meno (s priezviskom)Meno (s priezviskom)PozíciaPozíciaMesačná mzdaMesačná mzdaPočet odpracovaných hodín za posledný mesiacPočet odpracovaných hodín za posledný mesiac

Súbor treba načítať z disku do poľa, aby sa mohli údaje spracovať.Súbor treba načítať z disku do poľa, aby sa mohli údaje spracovať.

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

Vstup zo súboruVstup zo súboru

Najskôr si zadefinujeme dátový typ Najskôr si zadefinujeme dátový typ zamestnanec zamestnanec ::

typedef struct {

char meno[35];char pozicia[20];int hod_mzda;int hodiny;

} zamestnanec;

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

Vstup zo sVstup zo súboruúboruint 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;

}

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

Testovanie konca súboruTestovanie konca súboru Na zistenie konca súboru máme funkciuNa zistenie konca súboru máme funkciu

bool eof()ktorá vráti hodnotu ktorá vráti hodnotu truetrue, ak bol dosiahnutý koniec súboru, inak , ak bol dosiahnutý koniec súboru, inak vráti vráti falsefalse

Príklad: Načítanie všetkých čísel zo súboru: Načítanie všetkých čísel zo súboruint main(){

int n;fstream textfile("cisla.txt",fstream::in);

while (!textfile.eof()){

textfile>>n;cout<<n<<endl;

}textfile.close();return 0;

}

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

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

1 2

uvidíme výstupuvidíme výstup

1

2

Ak však bude vstup v tvare:Ak však bude vstup v tvare:

1 2 uvidíme výstupuvidíme výstup

1

2

2

Je to preto, lebo po načítaní čísla 2 program ešte neprišiel na koniec 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ätoksúboru a to pri ďalšom pokuse o čítanie čísla spôsobí zmätok

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

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

takto: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;

}

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

Testovanie konca súboruTestovanie konca súboru

Všimnime si ešte raz syntax funkcie Všimnime si ešte raz syntax funkcie getlinegetline::fstream& getline(char *buf, streamsize length)

Vidíme, že návratová hodnota je referencia na Vidíme, že návratová hodnota je referencia na fstreamfstream. . Znamená to, že funkcia vracia smerník na stream, na Znamená to, že funkcia vracia smerník na stream, na ktorom je operácia vykonaná. ktorom je operácia vykonaná. Preto na Preto na vrátenú hodnotu vrátenú hodnotu môžeme aplikovať metódy triedy môžeme aplikovať metódy triedy fstreamfstream..

Je možný napr. takýto zápis: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 ktorý zisťuje či sme už prišli na koniec súboru textfiletextfile

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

Testovanie konca súboruTestovanie konca súboru Program pre načítanie údajov o zamestnancoch môžeme prepísať: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;

}

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

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

na ktorúna ktorú

chceme zapísať, máme na to dva príkazy: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 Prvý príkaz nastaví pozíciu pre funkciu get, druhý pre funkciu , druhý pre funkciu put..

Parameter Parameter originorigin udáva, odkiaľ sa pozícia určuje a môže mať hodnoty: udáva, odkiaľ sa pozícia určuje a môže mať hodnoty:ios::beg – začiatok súboru – začiatok súboruios::cur – aktuálna pozícia – aktuálna pozíciaios::end – koniec súboru – koniec súboru

Parameter Parameter offsetoffset určuje, o koľko miest sa máme v súbore posunúť určuje, o koľko miest sa máme v súbore posunúť vzhľadom na vzhľadom na originorigin..

Na určenie aktuálnej pozície pre Na určenie aktuálnej pozície pre putput a a getget máme funkcie: máme funkcie:pos_type tellg()pos_type tellp()

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

Pohyb v sPohyb v súboreúbore Príklad: Vypísanie obsahu súboru od zadanej pozície: 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 1while (!textfile.eof()){

c=textfile.get();if (textfile.eof()) break;cout<<c<<endl;

}textfile.close();return 0;

}

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

Pohyb v súborePohyb v súbore Príklad: Oprava chybného znaku v súbore: Oprava chybného znaku v súbore

Súbor subor.txt má nasledujúci obsah:Súbor subor.txt má nasledujúci obsah:V tomto subore sa nachadza veta s jednou chibou?Opravme chybuOpravme 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;

}

VVýstup:ýstup:V tomto subore sa nachadza veta s jednou chybou?

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

Testovanie stavu sTestovanie stavu súboruúboru

Ak vykonávame so súborom vstupno-výstupné operácie, Ak vykonávame so súborom vstupno-výstupné operácie, môžeme si počas nich overovať, či prebiehajú v poriadku. Slúžia môžeme si počas nich overovať, či prebiehajú v poriadku. Slúžia na to funkcie:na to funkcie:

bool good()vracia hodnotu vracia hodnotu truetrue, ak vstupno-výstupné operácie prebiehajú v , ak vstupno-výstupné operácie prebiehajú v poriadkuporiadkubool fail()vracia hodnotu vracia hodnotu truetrue, ak počas vstupno-výstupných operácií došlo , ak počas vstupno-výstupných operácií došlo k ošetriteľnej chybe, napr. robíme logicky nesprávnu operáciuk ošetriteľnej chybe, napr. robíme logicky nesprávnu operáciubool bad()vracia hodnotu vracia hodnotu truetrue, ak došlo k fatálnej chybe, napr. ak je súbor , ak došlo k fatálnej chybe, napr. ak je súbor poškodenýpoškodený

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

Testovanie stavu súboruTestovanie stavu súboru Príklad: Načítanie čísel zo súboru s testovaním počas čítania: 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;

}

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

VVýpis chybových správýpis chybových správ

Vráťme sa naspäť ku knižnici Vráťme sa naspäť ku knižnici iostream Na výpis chybových správ je v tejto knižnici objektNa výpis chybových správ je v tejto knižnici objekt

cerr – objekt triedy – objekt triedy ostreamostream S týmto objektom pracujeme rovnako ako s S týmto objektom pracujeme rovnako ako s coutcout, ale , ale

posielame doňho posielame doňho výhradne chybové správy Výpis chybovej správy teda môže vyzerať takto:Výpis chybovej správy teda môže vyzerať takto:

cerr<<“Nastala chyba!”<<endl; Štandardne sa chybové správy objavia na obrazovke, Štandardne sa chybové správy objavia na obrazovke,

rovnako ako dáta poslané do rovnako ako dáta poslané do coutcout, ale vo všeobecnosti sa , ale vo všeobecnosti sa dáta z oboch objektov dajú oddeliť, v čom je hlavný význam dáta z oboch objektov dajú oddeliť, v čom je hlavný význam použitia použitia cerrcerr..

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

Výpis chybových správVýpis chybových správ Príklad: Čítanie zo súboru s výpisom chybových správ: Čí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 sAk súbor úbor “cisla.txt” “cisla.txt” neexistuje, na obrazovke sa objavíneexistuje, na obrazovke sa objaví::Otvaram subor...Subor sa nepodarilo otvorit!ChybovChybové správy ale môžeme presmerovať napr. z príkazového riadku é správy ale môžeme presmerovať napr. z príkazového riadku takto:takto:program.exe 2> errorfile.txtV tom prípade sa na obrazovke objaví:V tom prípade sa na obrazovke objaví:Otvaram subor...A v súbore A v súbore ““errorfile.txterrorfile.txt””: : Subor sa nepodarilo otvorit!

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

ZhrnutieZhrnutie

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