Tato strßnka se rozÜφ°ila po Internetu, tak₧e jejφ ji₧ neaktußlnφ kopie jsou na r∙zn²ch serverech, zde by m∞la b²t poslednφ verze s drobn²mi opravami podle p°ednßÜejφcφho INg. M.Viria, CSc.
Nejnov∞jÜφ verze strßnky je na: http://sweb.cz/fsokolovsky/cpp.zip. Pokud n∞kdo na Internetu objevφte starÜφ verzi, dejte mi prosφm v∞d∞t - jejφ URL.


Bu∩ pozdraven poutnφku, kdo v dobrΘm p°ichßzφÜ.

Pomoc hladov²m

M∙₧ete p°isp∞t na humanitßrnφ pomoc lidem, kde je hladomor, pokud kliknete na reklamu sponzor∙. Tφm, ₧e kliknete, p°isp∞je sponzor na dodßvku potravin.
http://www.thehungersite.org/
Dßle na odkaz DONATE FREE FOOD.
M∙₧ete takΘ zve°ejnit tento server i na sv²ch WWW strßnkßch. D∞kuji.


Programovßnφ v C++ - 2.Φßst

Sta₧enφ tΘto strßnky pro lokßlnφ prohlφ₧enφ (i s p°φklady) v archivu ZIP (ze dne 7.1.2000) - Φasem jsou odstra≥ovßny p°eklepy, dopl≥ovßno podle p°ipomφnek Φtenß°∙, dφvejte se proto po aktußlnφ verzi na http://www-troja.fjfi.cvut.cz/~sokolovs/CPP.HTM

Emailovß konference programovßnφ v C,C++:
Vᚠemail:
Po p°ihlßÜenφ do konference m∙₧ete psßt libovolnΘ dotazy na adresu: Cecko@pandora.cz


Moje poznßmka: Vlastnφ zkoumßnφ jazyka C++, kdy₧ jsem byl jeÜt∞ zaΦßteΦnφk... Stßhn∞te si archiv.


Poznßmka: Cφlem tΘto html strßnky je podat zßkladnφ "kurs" o programovßnφ v C++, proto₧e n∞kterß literatura je p°φliÜ drahß a takΘ velice rychle zestßrne.

Poznßmka: Informace a v²klad je tedy veden podle p°ednßÜek Programovßnφ v C++ na FJFI (to je Fakulta Jadernß a Fyzikßln∞ In₧en²rskß - to je zde, kde si nynφ prohlφ₧φte tuto WWW strßnku), pat°φcφ pod ╚VUT. P°ednßÜky p°ednßÜφ ing. M.Virius, Csc.

Äßdost: Pokud uvidφte jakoukoliv chybu, dejte mi prosφm v∞d∞t. ChybiΦka toti₧ pravd∞podobn∞ vznikla p°episem progrßmk∙ do WWW strßnky, na p°ednßÜce se chyby vyskytujφ jen z°φdka.


Obsah:

  1. Reference - 3. Φßst:
  2. Vstupy a v²stupy, hlaviΦkov² soubor stdio.h:
  3. HlaviΦkov² soubor conio.h:
  4. Objektovß struktura vstup∙ a v²stup∙ v C++:

Moje poznßmka: Vlastnφ zkoumßnφ jazyka C++, kdy₧ jsem byl jeÜt∞ zaΦßteΦnφk... Stßhn∞te si archiv.


Reference - 3. Φßst:

D∙vodem rozd∞lenφ WWW strßnky na Φßsti byl, ₧e editor WWW strßnek (sharewarovß verze Golden HTML Editor) neumo₧nil pracovat s delÜφmi strßnkami. Tak₧e k referencφch - zopakujeme a doplnφme, k Φemu jsou vlastn∞ dobrΘ:

P°φklad na pou₧itφ reference jako p°edßvßnφ parametr∙ odkazem:

void swap(int &a, int &b) {
 int c=a;
 a=b;
 b=c;
}

int a=11, b=55;
double c=9.9;
swap(a,b);
swap(a,c);

Volßnφ funkce swap(a,b) provede sprßvn² v²sledek, proto₧e "a" i "b" jsou prom∞nnΘ typu int, tak₧e je to bez problΘmu. Zatφmco volßnφ funkce swap(a,c) provede Üpatnou akci, proto₧e se druhß prom∞nnß "c" typu double konvertuje na typ int do pomocnΘ prom∞nnΘ, kterß se pou₧ije jako parametr funkce swap, tak₧e ve vlastnφm volßnφ se pracuje s pomocnou prom∞nnou, tak₧e v²sledek je chybn². V dneÜnφ norm∞ je vÜak n∞co takovΘho ji₧ zakßzßno. VÜeobecn∞ platφ zßsada, ₧e bychom m∞li dßvat prom∞nnΘ sprßvnΘho typu, jinak se m∙₧e i p°emazat Φßst pam∞ti, nap°. kdy₧ dßme jako parametr nap°. prom∞nnou, kterß je kratÜφ (zabφrß mΘn∞ B v pam∞ti), tak₧e zcela jist∞ se p°ema₧ou n∞jakß jinß data, kterß jsou za tou prom∞nnou v pam∞ti.

Deklarace pro konstantnφ parametry se provede takto:

void swap(const int &a, const int &b) { }

P°ehozenφ prom∞nn²ch "a" a "b" prob∞hne v po°ßdku. V p°φpad∞ prom∞nn²ch "a" a "c" je to vÜak blbost, proto₧e se skuteΦn∞ p°ehazujφ nesmysly.

Shrneme d∙vody p°edßvßnφ prom∞nnΘ odkazem: zm∞na parametr∙ - p°edßvßnφ jako v²stup z funkce; prßce s rozsßhl²mi prom∞nn²mi; v objektech - destruktory a konstruktory (blφ₧e v objektovΘm programovßnφ) a n∞kdy je nutnΘ pro vynucenφ, pokud chceme pou₧φvat knihovnφ funkce.


Vstupy a v²stupy, hlaviΦkov² soubor stdio.h:

P°φkladem p°esm∞rovateln²ch vstup∙ je prßce s proudy cin a cout, kterΘ lze p°esm∞rovat, jako se p°esm∞rovßvß data pro filtr DOSu sort: SORT <D >E kde D je vstupnφ soubor a E je v²stupnφ soubor. Je tu takovß mnemotechnickß pom∙cka jak si to zapamatovat, < je jako Üipka, kterß v p°φpad∞ SORT <D vychßzφ z D a jde do SORT, tak₧e D je zdroj a jde to do filtru SORT, SORT >E v²chßzφ ze SORT a vchßzφ do E, tak₧e v E je v²stup, proto₧e je to takΘ jako Üipka sm∞°ujφcφ do E, co₧ podle sm∞°ujφcφ "Üipky" musφ b²t v²stup. Analogicky si m∙₧ete odvodit, ₧e operßtor >> v C++ je vstupnφ, proto₧e se zapisuje nap°. >> x, tak₧e je to takΘ Üipka a z toho proudu to jde do prom∞nnΘ x, tak₧e ta se zm∞nφ, tak₧e je to musφ b²t vstupnφ operßtor a analogickou ·vahou << x je v²stupnφ operßtor.

RozliÜφme n∞kolik zp∙sob∙ podle r∙zn²ch p°ekladaΦ∙ a verzφ jazyka:

Tak₧e zaΦneme od standartnφch vstup∙ a v²stup∙ v C:

stdin a stdout jsou standartnφ vstupnφ a v²stupnφ za°φzenφ, znßme, ₧e se pou₧φvajφ p°i printf (v²stup) a scanf (vstup)

Z Pascalu znßme skoro tajn² pojem - prom∞nnß typu soubor, zde v C jasn∞ vφce, co to je. V C se s nφ pracuje pomocφ ukazatele ukazujφcφ na strukturu (asi n∞co podobnΘho je takΘ v Pascalu), kterß se jmenuje FILE (velk²mi pφsmeny, nebo¥ vφme, ₧e C rozliÜuje malΘ a velkΘ pφsmena), musφme definovat ukazatel na FILE, abychom mohli v∙bec n∞jak se soubory pracovat:

FILE *f;

FILE *fopen(char *jmeno,char *mod); jmeno a mod jsou tedy °et∞zce definovanΘ jako char * a jmeno je normßlnφ jmΘno souboru, lze uvΘst disk, adrß°ovou cestu a jmΘno souboru i s koncovkou, mod je specißlnφ °et∞zec (r - read = Φtenφ, w - write = zßpis, a - append = p°idßvßnφ na konec souboru a za nφm lze p°idat: t - text - otev°φt jako textov² soubor, b - binary - otev°φt jako binßrnφ soubor). Funkce fopen vracφ ukazatel na stukturu FILE, pokud je tento ukazatel nenulov², potom se otev°enφ zda°ilo, pokud je nula, nastala chyba. V ₧ßdnΘm p°φpad∞ se zde neobjevujφ zprßvy typu Runtime Error ??? at ????:???? znßmΘ z Pascalu (ikdy₧ to lze direktivou vypnout). Nezapome≥te zdvojovat znak \ v adresß°ovΘ cest∞.

JeÜt∞ existujφ re₧imy r+, slou₧φ to pro otev°enφ pro Φtenφ, vÜak je mo₧n² i zßpis do souboru, w+ znamenß otev°i pro zßpis, ale umo₧ni i Φφst, a+ znamenß otev°φt jako append (pro zßpis na konec souboru), ale umo₧nit i Φtenφ.

Do textov² souboru se zapisujφ jednotlivΘ °ßdky, jako Φßsti souboru, v binßrnφm lze zapsat cokoliv, proto bych m∞l p°i Φtenφ v∞d∞t, co vlastn∞ Φφst. Jak u₧ jsem upozornit, lze do binßrnφho souboru psßt textovΘ °et∞zce (ikdy₧ to nenφ obvyklΘ), a opaΦn∞ do textovΘho souboru lze zapsat n∞co binßrn∞ (i to je dost neobvyklΘ, proto₧e potom se u₧ivatel zhrozφ, co se mu stalo s jeho p°ehledn²m textem, co jsou ty hroznΘ znaky, kter²m nerozumφ... Snad se to hodφ jen v p°φpad∞ tiskßrny, kdy₧ chceme posφlat °φdφcφ znaky. To ovÜem vy₧aduje znßt, jakß tiskßrna je p°ipojenß, jinak se m∙₧e tisk jeÜt∞ vφce znep°ehlednit, ne₧ kdyby se °φdφcφ znaky neposφlaly, nap°. tiskßrn∞ HP posφlat °φdφcφ znaky tiskßrny EPSON.

V²hodou a takΘ nev²hodou proti Pascalu je, ₧e do textovΘho souboru lze Φφst i zapisovat jak textov∞ (nap°. fprintf - je jako printf, pouze 1. parametr mß navφc jmΘno souboru a fscanf - je jako scanf, pouze 1. parametr mß navφc jmΘno souboru), ale takΘ i binßrn∞ (to nenφ chyba a v²mysl!!!) a to p°φkazy nap°. fread a fwrite. TakΘ do souboru otev°enΘho binßrn∞, lze zapisovat resp. Φφst nejen binßrn∞, ale i textov∞. Nebo¥ v C a C++ platφ zßsada a p°edpoklßdß se, ₧e "Programßtor vφ, co d∞lß." a proto zde nenφ omezovßn, tak jako v Pascalu - toho na jednu stranu v²hodou - takovß svoboda, ale nev²hodou, pokud programßtor nenφ, co d∞lß, zkrßtka nenφ na to upozorn∞n a potom musφ dlouho ladit sv∙j program, a₧ zjistφ, v Φem je ten problΘm...

Pro zav°enφ souboru slou₧φ funkce i=fclose(FILE *f); "f" je ukazatel na FILE a "i" je typu int. V p°φpad∞, ₧e soubor je ·sp∞Ün∞ zav°en, potom vrßtφ 0, jinak EOF (to je p°eddefinovanß konstanta), nap°φklad kdy₧ byste se pokouÜeli zav°φt ji₧ jednou uzav°en² soubor nebo soubor, kter² se nepoda°ilo ·sp∞Ün∞ otev°φt.

fprintf provßdφ formßtovan² zßpis (i do binßrnφho souboru)

fscanf provßdφ formßtovanΘ Φtenφ (i z binßrnφho souboru)

fread provßdφ neformßtovanΘ Φtenφ (i z textovΘho souboru)

fwrite provßdφ neformßtovan² zßpis (i do textovΘho souboru)

Pou₧itφ si ukß₧eme na p°φkladech, p°edpoklßdejme, ₧e soubor ji₧ byl ·sp∞Ün∞ otev°et pro zßpis (v 1. p°φpad∞) a prom∞nnß x je typu double resp. pro Φtenφ (v 2. p°φpad∞), dále p°edpoklßdßme, ₧e na aktußlnφ pozici v souboru je te∩ prom∞nnß typu double a y je typu double a dßle v obou p°φpadech p°edpoklßdßme, ₧e v "f" je platn² ukazatel na strukturu FILE.

fprintf(f,"%d",x);

fscanf(f,"%d",&y);

NeformßtovanΘ Φtenφ si takΘ ukß₧eme na p°φklad∞. P°edpoklßdejme, ₧e v "f" je platn² ukazatel na strukturu FILE, tj. f je nenulov² ukazatel (soubor se poda°ilo otev°φt), v 1. p°φpad∞ pro Φtenφ, v 2. p°φpad∞ pro zßpis. Dßle budeme pot°ebovat do n∞Φeho prom∞nnou p°eΦφst (m∞li bychom Φφst prom∞nnou sprßvnΘho typu, kterß je skuteΦn∞ v souboru) v prvnφm p°φpad∞ budeme do nφ Φφst, tak₧e se jejφ obsah zm∞nφ, v druhΘm p°φpad∞ budeme jejφ obsah uklßdat do souboru - zapisovat, tak₧e by m∞l z∙stat jejφ obsah nezm∞n∞n.

fread(&x,sizeof(x),1,f); //prom∞nnou x p°edßvßme odkazem, proto₧e v 1. parametru je vy₧adovßn ukazatel na prom∞nnou, sizeof(x) vracφ jejφ velikost v B, 1 je poΦet prom∞nn²ch (my chceme Φφst 1 prom∞nnou), f je p°edpoklßdan² ukazatel na FILE, fread vrßtφ 0 v p°φpad∞ chyby nebo nenulovou hodnotu, odpovφdajφcφ poΦtu p°eΦten²ch polo₧ek (ne Byt∙)

fwrite(&x,sizeof(x),1,f); //prom∞nnou x p°edßvßme odkazem, proto₧e v 1. parametru je vy₧adovßn ukazatel na prom∞nnou, sizeof(x) vracφ jejφ velikost v B, 1 je poΦet prom∞nn²ch (my chceme Φφst 1 prom∞nnou), f je p°edpoklßdan² ukazatel na FILE, fwrite vrßtφ 0 v p°φpad∞ chyby nebo nenulovou hodnotu, odpovφdajφcφ poΦtu zapsan²ch polo₧ek (ne Byt∙)

Pokud mßme Φφst a zapisovat pole, potom nepφÜeme &pole, ale pouze pole jako 1. parametr, proto₧e pole, jak ji₧ vφme, se automaticky konvertuje na ukazatel na 1. prvek. Funkce fread vracφ poΦet ·sp∞Ün∞ p°eΦten²ch polo₧ek (ne Byt∙), fwrite poΦet ·sp∞Ün∞ zapsan²ch polo₧ek.

Funkce feof(f) vy₧aduje ukazatel na FILE a vracφ hodnotu podle otßzky: Narazil jsem p°ed p°edchßzejφcφm Φtenφm na konec souboru? Pokud ano, vracφ nenulovou hodnotu, pokud narazil na konec souboru, vracφ 0.

Znak \n se vlastn∞ v DOSu p°em∞nφ na dva znaky s ASCII k≤dem 13 a 10. Znak \r znamenß return (nßvrat vozu - ikdy₧ p°i tisku na obrazovku nemß smysl mluvit o n∞jakΘm vozu...) a znak \n je new line, tak₧e DOS musφ mφt oba znaky (zßrove≥ p°echod na 1. znak \r a zßrove≥ od°ßdkovßnφ \n). Pokud tedy soubor otev°eme jako textov², potom se bude poΦφtaΦ starat o sprßvnΘ klßdßnφ t∞chto znak∙, pokud otev°eme soubor jako binßrn∞ a budeme s nφm pracovat jako s binßrnφm, potom se tyto vklßdßnφ neprovßdφ. Proto binßrnφ soubory zßsadn∞ kopφrujte v m≤du binary - f=fopen("a.com","rb"); a Φt∞te p°φkazem fread(buffer,sizeof(buffer),1,f); Podobnou situaci asi jste za₧ili na Internetu, pokud stahujete pomocφ programu "ftp" hodn∞ dlouh² binßrnφ soubor a zapomn∞li jste zapnout p°epnutφ do re₧imu binary, proto₧e se provßdφ konverze znak∙ \n a \r podle sm∞ru p°evodu v °e₧imu ASCII.

Nastavenφ pozice v souboru se provede p°φkazem i=fseek(f,o co,odkud);, kde se p°edpoklßdß, ₧e "f" je ukazatel na strukturu FILE, "o co" je offset typu long a "odkud" je prom∞nnß typu int nab²vajφcφ jednΘ ze 3 hodnot:

SEEK_SET (=0) offset se bude poΦφtat od zaΦßtku souboru

SEEK_CUR (=1) offset se poΦφtß od aktußlnφ pozice

SEEK_END (=2) offset od konce souboru

DoporuΦuji pou₧φvat symbolickΘ jmΘna

Funkce fseek vracφ 0 v p°φpad∞, ₧e byl ·sp∞Ün∞ ukazatel p°emφst∞n, jinak vracφ nenulovou hodnotu.

i=fclose(f) zav°e soubor, kde f je ukazatel na FILE a vracφ 0 v p°φpad∞ ·sp∞ÜnΘho zav°enφ souboru nebo hodnotu EOF (-1), v p°φpad∞ chyby p°i zav°enφ (t°eba pokud soubor nebyl otev°en nebo ji₧ byl zav°en). Zav°enφm souboru byl se m∞l vyrovnßvacφ buffer ji₧ zapsat skuteΦn∞ na disk, pokud v DOSu nenφ smartdrv s nastaven²m opo₧d∞n²m zßpisem, v tom p°φpad∞ se to ulo₧φ do bufferu smartdrv a zapφÜe se to vÜe najednou. P°edstavuje to jistΘ nebezpeΦφ, ₧e se poΦφtaΦ zasekne nebo vypne a data se nezapφÜou, ale to jsou ji₧ podrobnosti, kterΘ s programovßnφm nemajφ nic spoleΦnΘho. Dokud neprovedeme zav°enφ souboru, data se nezapφÜou. Do vyrovnßvacφ pam∞ti p°ib²vajφ data a a₧ je vyrovnßvacφ pam∞¥ plnß, tak se zapφÜe a vyprßzdnφ. UrΦit∞ se zapφÜe uzav°enφm souboru.

Pokud chceme zapsat data v urΦitΘm okam₧iku, tak aby se z vyrovnßvacφ pam∞ti zapsali na disk, potom pou₧ijeme funkci i=fflush(f) a jako v₧dy (f je ukazatel na FILE, i je typu int), pokud se to provede OK, tak se vrßtφ 0 v prom∞nnΘ "i" typu int, ale v p°φpad∞ chyby vrßtφ p°eddefinovanou hodnotu EOF (-1). V p°φpad∞, ₧e nenφ smartdrv, data jsou ji₧ zapsanß na disku, jinak se p°edajφ programu smartdrv a ten je bu∩ zapφÜe hned a nebo a₧ se zpo₧d∞nφm.

stderr je v²stup chyb, stdout je standartnφ p°esm∞rovateln² v²stup (implicitn∞ na obrazovku) a stdin je standartnφ p°esm∞rovateln² vstup (implicitn∞ z klßvesnice).

i=fputc(znak,f) zapφÜe jeden znak "znak" (typu int !!!) do souboru s ukazatelem f na FILE. V p°φpad∞ ·sp∞chu vrßtφ (int) k≤d znaku, jinak EOF.

i=fgetc(f) p°eΦte jeden znak ze souboru (int), v p°φpad∞ ·sp∞chu platn² k≤d p°eΦtenΘho znaku, jinak i=EOF (co₧ znamenß chybu p°i Φtenφ).

Prvnφ p°φklad, jednoduchΘ otev°enφ a zav°enφ souboru.

Druh² p°φklad pro prßci se soubory.

Poznßmka: Pokud pracujeme v re₧imu Φtenφ i zßpis souΦasn∞ v jednom souboru (re₧imy r+, w+, a+ zadan²ch v °et∞zci jako 2. parametr ve funkci fopen), potom mezi fread a fwrite musφte pou₧φt funkci fseek, jinak nefunguje.

Poznßmka: fcanf(f,"%i",&i); Toto volßnφ funkce p°eΦte Φφslo ze souboru v libovolnΘ soustav∞ (z C, C++ jsou k dispozici desφtkovß, osmiΦkovß a Üestnßctkovß). Jak bychom m∞li v∞d∞t z ·vodu, desφtkovß Φφsla se zapisujφ normßrn∞, s nenulov²m znakem na prvnφm mφst∞ (nulu samoz°ejm∞ nelze zapsat jinak ne₧ jako 0). ╚φsla v osmiΦkovΘ soustav∞ se zapisujφ s 0 na prvnφm mφst∞, musφ samoz°ejm∞ obsahovat pouze cifry do 7 vΦetn∞. ╚φslo v ÜestnßctkovΘ soustav∞ zaΦφnß znaky 0x. Toto volßnφ funkce fcanf by m∞lo za p°φzniv²ch okolnostφ rozeznat vÜechny 3 ΦφselnΘ soustavy. Binßrnφ nenφ podporovßna, na co₧ jsem se zeptal a pr² si to mß programßtor naprogramovat sßm, pokud to bude pot°ebovat. D∙vod p°edßvßnφ "i" jako reference &i je jednak, ₧e do prom∞nnΘ se bude p°edßvat v²stup, co₧ nelze hodnotou jako parametr p°edat a za druhΘ, ₧e fscanf je funkce z C, kterΘ jak vφme neznß p°edßvßnφ parametru odkazem, tak se musφ p°edat odkazem.

Formßtovan² v²stup u reßln²ch Φφsel:

V²hody a nev²hody printf, scanf:

V²hoda efektivnost, vφce programßtor∙ pou₧φvß programovacφ jazyk C ne₧ C++, C mß delÜφ dobu existence, tedy existuje vφce knihoven a ji₧ naprogramovan²ch algoritm∙, proto zde uvßdφme p°φkazy printf a scanf.

Nev²hodou je menÜφ p°ehlednost, scanf a printf toti₧ pou₧φvajφ v²pustku, co₧ b²vß nebezpeΦnΘ a n∞kdy zdrojem chyb. V C++ je cout a cin mnohem bezpeΦn∞jÜφ.

i=getchar(); - p°eΦte znak ze standartnφho vstupu, kter² je na °ad∞. Vracφ k≤d znaku v prom∞nnΘ typu int, d∙vod je ten, aby funkce mohla vrßtit i EOF (-1) jako chyba, ASCII k≤d znaku (0..255).

i=fgetc(f); - Φte jeden znak ze souboru, f je ukazatel na strukturu FILE. I zde vracφ int, aby bylo mo₧nΘ signalizovat p°φpadnou chybu.

Varovßnφ: ProΦ uklßdat k≤d klßvesy do int? Proto₧e EOF (-1) je v ÜestnßctkovΘ soustav∞ jako FFFFH, ale kdy₧ by se v²sledek ulo₧il do char, potom by se z FFFFH stalo FFH, co₧ je takΘ k≤d znaku. Z toho vypl²vß, ₧e bychom nebyli schopni rozpoznat konec souboru a pletli si ho se znakem s ASCII k≤dem 255. TaktΘ₧ znak, kter² nenφ koncem souboru, by se stal koncem souboru a nap°. cyklus vyhodnocujφcφ konec souboru, by skolnΦil p°edΦasn∞.

putchar(int); ZapφÜe jeden znak na standartnφ v²stupnφ za°φzenφ.

fputc(int c,FILE *f); ZapφÜe jeden znak do souboru, kter² byl otev°en pro zßpis, f je ukazatel na FILE.

fgets(FILE *f); P°eΦte °et∞zec ze souboru, dan²m ukazatelem na FILE.

fputs(FILE *f); ZapφÜe °et∞zec "s" do souboru, danΘho ukazatelem na FILE.

gets();

puts();

sscanf(); - slou₧φ pro formßtovanΘ Φtenφ ze °et∞zce

sprintf(); - slou₧φ pro formßtovanΘ psanφ do °et∞zce

V∞tÜina z t∞chto funkcφ jsou z hlaviΦkovΘho souboru stdio.h.


Funkce z hlaviΦkovΘho souboru conio.h.

Obsahuje podobnΘ funkce jako stdio.h, ale zce tyto funkce pracujφ p°φmo s konzolφ, vynechßvajφ tedy volßnφ operaΦnφho systΘmu, Φφm₧ obecn∞ jsou rychlejÜφ. Uvedeme jen takov² p°ehled, parametry a vracenΘ hodnoty najdete v Helpu v Borland C++ 3.1. Upozornφme pouze, ₧e funkce pro Φtenφ klßvesy, vracφ int a ne char. D∙vodem je, ₧e funkce musφ vrßtit takΘ n∞kdy chybu (EOF = -1).

cprinft - p°ím² v²stup na obrazovku

cscanf - p°φm² vstup z klßvesnice

getch - Φtenφ 1 znaku z klßvesnice - k≤du klßvesy, v p°φpad∞, ₧e se p°eΦte 0, potom to znamenß rozÜφ°en² k≤d a m∞lo by nßsledovat jeÜt∞ jednou getch, aby se zjistil rozÜφ°en² k≤d skuteΦnΘ klßvesy (nap°. klßvesy se Üipkami dßvajφ k≤dy 0,77 a 0,75)

getche - totΘ₧ jako getch, navφc vypφÜe znak na obrazovku, pokud je zobraziteln², "e" na konci znamenß echo.

ungetch vrßtφ 1 znak do vstupnφho proudu

cscanf p°eΦte data z konzole, co se mß p°eΦφst, zadßvß se jako parametr u scanf.

cputs zapφÜe °et∞zec do textovΘho okna na obrazovce

cgets p°eΦte °et∞zec z konzole

kbhit je obdobou PascalovskΘ funkce KeyPressed a vracφ nenulovou hodnotu v p°φpad∞ stisklΘ klßvesy, jinak 0. Pou₧φvß se, aby program neΦekal v nekoneΦnΘ smyΦce na stisk klßvesy, touto funkcφ je mo₧no otestovat, zda je v klßvesnicovΘ front∞ n∞jak² znak a v p°φpad∞, ₧e je, Φφst klßvesu, jinak d∞lat jinou u₧iteΦn∞jÜφ prßci, ne₧ Φekat na stisk klßvesy. Funkce je podporovßna v Borland p°ekladaΦi. Nßsledujφcφ funkce jsou takΘ v Borland p°ekladaΦi na PC. Uvedu taktΘ₧ odpovφdajφcφ funkce v grafickΘm re₧imu, jejich₧ hlaviΦky jsou v hlaviΦkovΘm souboru graphics.h.

textattr zjiÜt∞nφ barvy pozadφ a pφsma v textovΘm m≤du.

textbackground nastavenφ barvy pozadφ v textovΘm m≤du. (V grafickΘm m≤du je to na nastavenφ barvy pozadφ setbkcolor a pro zjiÜt∞nφ barvy pozadφ getbkcolor - je to vlastn∞ zm∞na barvy 0 v palet∞).

textcolor nastavenφ barvy textu v textovΘm m≤du. (V grafickΘm m≤du se nastavφ barva kreslenφ bod∙, ·seΦek, kru₧nic, atd. setcolor a zjiÜt∞nφ barvy kreslenφ funkcφ getcolor).

window nastavφ oblast v textovΘm re₧imu, do kterΘho bude proveden tisk funkcφ z conio.h. Sou°adnice levΘho hornφho rohu je 1,1 a dolnφho rohu 80,25. V grafickΘm re₧imu se oblast nastavφ funkcφ setviewport.

clrscr mazßnφ oblasti nastavenΘ pomocφ funkce window. Implicitn∞, pokud nenφ nastaveno jinak), potom se ma₧e celß obrazovka v textovΘm re₧imu. V grafickΘm re₧imu se Φßst obrazovky sma₧e funkcφ clearviewport.

gotoxy nastavenφ pozice textovΘho kurzoru v textovΘm re₧imu (v grafickΘm re₧imu se nastavφ pozice grafickΘho kurzoru funkcφ moveto).

wherex, wherey zjiÜt∞nφ pozice textovΘho kurzoru v textovΘm re₧imu (v grafickΘm re₧imu se zjiÜ¥uje pozice grafickΘho re₧imu getx a gety).

insline, delline provßdφ vlo₧enφ a smazßnφ °ßdku v textovΘm m≤du. V grafickΘm m≤du si to asi musφte naprogramovat sami... Odrolovßnφ se provßdφ p°φmou adresacφ videopam∞ti zaΦφnajφcφ na adrese B800:0 H, co₧ je jen u PC. VÜechny funkce pracujφcφ s barvami je mo₧nΘ pou₧φt jak v reßlnΘm, tak i v chrßn∞nΘm m≤du.

inportb, outportb je v DOS.H a slou₧φ pro Φtenφ bytu resp. zapsßnφ bytu na port. Hodφ se nap°φklad pro Φtenφ hesla v pam∞ti C MOS. P°iÜel jste nßhodou n∞kdo na zp∙sob, jak je tam to heslo zak≤dovanΘ? Rßd se dozvφm jak...


Objektovß struktura vstup∙ a v²stup∙ v C++:

Vstupy a v²stupy jsou naprogramovßny objektov∞. Je to typov∞ bezpeΦnΘ (C++ mß zabudovßnu p°φsn∞jÜφ typovou kontrolu ne₧ C), v²hodou je pohodln∞jÜφ prßce.

Moje poznßmma: Tak nynφ jsem si z tabule na p°ednßÜce p°ekreslil hierarchii objektov²ch typ∙, p°ece to nenφ zase tak slo₧itΘ... :-) Nezalekn∞te se toho a klidn∞ dßl programujte, ikdy₧ tu hierarchii neznßte...

Nejd∙le₧it∞jÜφ je si zapamatovat proudy cin a cout, kterΘ se v C++ pou₧φvajφ nejΦast∞ji. Upozor≥uji, ₧e jsou v C++, ne v C, proto₧e v hlaviΦkovΘm souboru iostream.h je test, zda se p°eklßdß kompilßtorem C nebo C++ (testuje se existence makra _cplusplus, kterΘ je definovßnΘ, pokud se p°eklßdß kompilßtorem C++, v C nenφ znßmΘ). V C tyto proudy cin a cout nejsou podporovßny. Jak vidφme z obrßzku, iostream je odvozen od t°φd istream a ostream. Zatφmco Pascal dovolil, aby m∞l jeden objekt maximßln∞ jednoho p°edka, v C++ toto omezenφ neexistuje, v C++ m∙₧e mφt objekt vφce p°edk∙, vznikajφ tak n∞kdy slo₧itΘ hiearchie. B∞₧n∞ vystaΦφme s t°φdami: ifstream, fstream, ofstream, istream, ofstream, fstrstream.

io.h obsahuje zastaralΘ funkce prßce se vstupy a v²stupy v Unixu a v DOSu. V dneÜnφ dob∞ existuje v C++ iostream, tak₧e tyto starΘ volacφ konvence se u₧ vidφ jen z°φdka, vÜak pro zachovßnφ kompatibility, by m∞ly funkce z io.h existovat i na nejnov∞jÜφch p°ekladaΦφch.

stdio.h obsahuje jeÜt∞ funkce vprintf(ap); a vscanf(ap);, funkce s "v" oznaΦujφ prom∞nn² poΦet parametr∙, tedy, ₧e se bude pou₧φvat v²pustka. Musφme tedy mφt n∞kde prom∞nnou, kterß zp°φstupnφ parametry v²pustky, kterΘ p°edßme do vprintf nebo vscanf.

va_list ap; //deklarace prom∞nnΘ, kterß zp°φstupnφ parametry v²pustky

ap je tedy prom∞nnß, podle tΘto deklarace. M∞la by b²t inicializovanß.

Znßme ji₧ funkce fread, fwrite, fscanf, fprintf, getche (vracφ int - 2B, nutnΘ uklßdat do int, funkce: p°eΦte znak a zobrazφ je na obrazovku).

iostream.h, jak vφme, obsahuje proudy cin a cout, co₧ jsou vlastn∞ t°φdy. Jsou pro n∞ p°etφ₧enΘ operßtory << (v²stupnφ operßtor) a >> (vstupnφ operßtor), kterΘ se normßln∞ pou₧φvajφ pro bitovΘ posuny.

Zßpis cout << a; si kompilßtor p°evede na: cout.operator<<(a);. Operßtory jsou chßpßny jako funkce. Operßtory, stejn∞ jako funkce, lze p°etφ₧it, skoro pro ka₧d² typ.

Manipulßtory v iostream.h:

Manipulßtory s parametry v iomanip.h:

setw(n) - nastavenφ Üφ°ky v²stupu, je ·Φinn² jen na nßsledujφcφ v²stup, potom se op∞t nastavφ na p∙vodnφ Üφrku. Udßvß Üφ°ku pole v²stupu, pokud je v²stup kratÜφ, zleva se doplnφ mezerami.

setprecision(n) - nastavenφ poΦtu desetinn²ch mφst reßlnΘho Φφsla. Tento manipulßtor a nßsledujφcφ dva majφ trval² ·Φinek, tj. dokud se jinak nezm∞nφ.

setiosflags(n) - n (jako skupina bit∙) urΦuje, kterΘ bity p°φznaku se nastavφ. V ios jsou p°φznaky - bity bity lze nastavit, pokud na odpovφdajφcφ mφsto v "n" zapφÜu logickou 1. Pokud je na odpovφdajφcφm mφst∞ v "n" logickß 0, odpovφdajφcφ p°φznak v ios z∙stane nezm∞n∞n.

resetiosflags(n) - n (jako skupina bit∙) urΦuje, kterΘ bity p°φznaku se vynulujφ. V ios jsou p°φznaky - bity lze vynulovat, pokud na odpovφdajφcφ mφsto v "n" zapφÜu logickou 1. Pokud je na odpovφdajφcφm mφst∞ v "n" logickß 0, odpovφdajφcφ p°φznak v ios z∙stane nezm∞n∞n.

Nynφ si koneΦn∞ ukß₧eme p°φklad na pou₧itφ manipulßtor∙.

Dßle si uvedeme spφÜe takovΘ drobnosti, p°esnou syntaxi objevφte v nßpov∞d∞, my si pouze °ekneme, ₧e n∞co takovΘho existuje. JeÜt∞ n∞co k p°φznak∙m ve t°φd∞ ios.

P°φznak ios::showpoint p°φsluÜφ k t°φd∞ ios. Nastavenφ tohoto p°φznaku se provede map°φklad cout << setiosflags(ios::showpoint);

setfill(znak) slou₧φ pro nastavenφ vypl≥ovacφho znaku (jak u₧ nßzev napovφdß), kter² se pφÜe, pokud je v²stup kratÜφ, ne₧ je nastavo nap°. manipulßtorem setw.

int ios::width(); p°eΦte Üφ°ku

int ios::width(n); p°eΦte Üφ°ku a nastavφ novou

ios::clear nastavφ resp. schozenφ bitu chyby. Kdy₧ vznikne chyba, odmφtß spolupracovat, a₧ dokud se neshodφ p°φznak chyby, kter² je jako chrßn∞n² atribut ios::state ve t°φd∞ ios. NejΦast∞ji se pou₧φvß vynulovßnφ, tak₧e se zapφÜe ios::clear.

ios::rdbuf vracφ ukazatel na bufferu (tedy jeho adresu).

Poznßmky k tvorb∞ program∙:

Deklarace a otev°enφ souboru se provede deklaracφ a zavolßnφm konstruktoru, kter² by ji₧ m∞l (za p°φzniv²ch okolnostφ) provΘst otev°enφ souboru.

Studenti FJFI si budou moci prohlΘdnout p°φklady, kterΘ naprogramoval ing. M.Virius, CSc, kterΘ jsou k dispozici v Trojance na serveru katedry matematiky v adresß°i ...VYUKA\CPP\#ZAKL\10 p°φklady pro prßci se soubory. Vy, kte°φ tam nemßte u₧ivatelskΘ konto, tak si ho za°i∩te.

ofstream f(cesta,ios::out | ios::binary); cesta je vlastn∞ °et∞zec s nßzvem disku, s cestou, se jmΘnem souboru a s koncovkou. Druh²m parametrem konstruktoru t°φdy ofstream je re₧im otev°enφ, ios::out je p°φznak pro otev°enφ pro v²stup a ios::binary, jak ji₧ nßzev napovφdß, otev°enφ jako binßrnφ.

Lze testovat, zda se povedlo otev°enφ souboru: if (!f) p°φkaz; //pokud se nepovedlo se otev°φt, provede se p°φkaz, jinak se pokraΦuje za p°φkazem if

f je odkaz na proud, !f vracφ negaci proudu

Lze volat i konstruktor bez parametr∙: ifstream f; //jako vstupnφ proud, ale konstruktor zde neprovede otev°enφ souboru, proto₧e jste nezadali jmΘno souboru a re₧im (ten by si sice mohl odvodit - Φtenφ z ifstream, ale musφte jeÜt∞ zadat re₧im: binßrnφ nebo textov²)

Proto otev°enφ provedete volßnφm metody t°φdy p°φstupnΘ pomocφ f: f.open(cesta,ios::in|ios::binary)

Nßpov∞du o tomto otev°enφ souboru v BC 3.1 zφskßte napsßnφm "fstream" a Ctrl+F1, zvolit Constructors: fstream::fstream Form2, See also: File Open. JednoduÜÜφ zp∙sob je najφt v indexu (Shift+F1) "open,fstream" a dßle See also: File open. Jako p°φznak pro otev°enφ lze pou₧φt: ios::binary(otev°enφ jako binßrnφ soubor), ios::in (otev°enφ jako vstupnφ - Φtenφ), ios::out (otev°enφ pro v²stup - zßpis), ios::nocreate (pro ty, kte°φ neumφ anglicky - nocreate znamenß nevytvß°et, je to v p°φpad∞, ₧e soubor neexistuje, tak se nevytvo°φ, ale pokud existuje, potom se p°epφÜe.

ProhlΘdn∞te si p°ilo₧en² progrßmek v C++.

Vysv∞tlφme si, proΦ lze testovat prom∞nnou typu f, zda nastala chyba. Vysv∞tlenφ je pom∞rn∞ jednoduchΘ: V∞tÜina funkcφ f.read, f.get, f.open, atd. vracφ proud a tak₧e i chybu, nebo¥ pokud se n∞co nepoda°φ (nastala chyba) - vracφ se 0, jinak (povedlo se) - vracφ se skuteΦnß adresa proudu, co₧ lze ovÜem pou₧φt pro test, zda se vÜe povedlo. Pokud bychom cht∞li funkcφ f.read Φφst na konci souboru, tak se vrßtφ v f bude obsahovat 0 (je to vlastn∞ ukazatel neukazujφcφ nikam - nulov² ukazatel), co₧ indikuje chybu.

JeÜt∞ si v rychlosti °ekneme p°esun v souboru (je to pro rozliÜenφ, zda pracujeme se souborem otev°en²m pro Φtenφ nebo pro zßpis, podle toho se d∞lφ i funkce pro posun ukazatele v souboru):

seekp p=put, tedy ukazatel v souboru otev°enΘm pro zßpis

seekg g=get, tedy ukazatel v souboru otev°enΘm pro Φtenφ

Nßpov∞du zφskßte najitφm seekp nebo seekg v indexu.


Poslednφ modifikace strßnek byla provedena - Last modified: