.pl 60 .po 12 .mt 2 .mb 2 .pn 123 KAPITOLA 7: VSTUP A VYSTUP -------------------------- Vstup a vystup neni casti jazyka C a tak jsme na ne nekladli duraz. Nicmene opravdove programy spolupracuji se svym okolim slozitejsim zpusobem, nez jak jsme doposud ukazali. V teto kapitole popiseme standardni "knihovnu vstupu a vystupu" - sou- bor funkci, ktere byly navrzeny pro standardni I/O system jazy- ka C. Funkce byly navrzeny tak, aby umozovaly pohodlne programovani. Funkce jsou dostatecne efektivni, takze uzivatel temer neciti potrebu je "zrychlovat a zefektivnovat". A nakonec budiz receno, ze funkce jsou "prenositelne", coz znamena, ze existuji kompatibilne na pocitacich, kde je inplementovan jazyk C. Mohou byt prevadeny z jednoho systemu do druheho bez podstatnych zmen. Zde se nebudeme snazit o popis cele knihovny. Vetsi duraz klademe na to, abychom ukazali zaklady psani programu v jazyku C, nez abychom se soustredili na to, jak programy spolupracuji se svym okolim. 7.1 Pristup do standardni knihovny ---------------------------------- Kazdy zdrojovy soubor, ktery potrebuje funkce ze standardni knihovny musi obsahovat radek #iuclude na zacatku souboru. V soubotu stdio.h jsou definovana jista makra a promenne, ktere jsou standardni I/O knihovnou vyuziva- ny. Pouzitim znamenek < a > misto uvozovek smerujeme prekladac do adresare, ktery obsahuje standardni zaznamy se zahlavim (na systemu UNIX je to |usr|include). Nekdy muze byt nutne definovat knihovnu pri zavadeni progra- mu explicitne. Napr. na PDP 11, UNIX bude prikaz pro preklad programu vypadat takto: CC zdrojovy soubor,... -&S kde -&S znamena nacitani ze standardni knihovny. 7.2. Standardni vstup a vystup - getchar a putchar -------------------------------------------------- Nejjednodussim mechanismem nacitani je cteni znaku ze "standardniho vstupu", obecne uzivatelova terminalu funkci getchar (). Funkce getchar () vraci dalsi znak ze vstupu pokazde, kdyz je vyvolana. Na mnoho systemech, kde je imple- nutovan jazyk C, muze byt vstup z terminalu nahrazen vstupem ze souboru operatorem <. Jestlize program p r o g pouziva funkce getchar, tak prikazova radka prog < infile zpusobi, ze prog bude cist vstup ze souboru infile misto z terminalu. Toto prepinani vstupu je delano takovym zpusobem, Š.po 3 ze program prog o nem "nevi". Retezec '' neni rovnez zarazen do argumentu argv. Prepinani vstupu si rovnez muzeme vsimnout pri situaci, kdyz vystup jednoho programu je vstupem programu dalsiho (pipe line). Prikaz program1 | program2 spusti dva programy: program1 a program2 a vystup z programu1 bude vstupem programu program2. Funkce getchar vraci EOF, kdyz narazi na konec vstupu, at je vstupem cokoliv (terminal nebo soubor). Ve standardni knihovne je definovan EOF jako - 1 (v souboru stdio.h). Testovani ma byt provadeno s EOF a ne s -1, aby bylo nezavisle na konkretni hod- note. Pri vystupu funkce putchar (c) "zapise" znak c do "standardniho vystupu", coz je standardne rovnez terminal. Vystup muze byt presmerovan znakem > do souboru. Jestlize program prog pouziva putchar, tak prikazem prog > outfile bude prog svuj vystup psat do souboru outfile. V systemu UNIX muze byt rovnez pouzit znak | pro retezeni programu (pipe line) program1 | program2 Ani zde se programy "nestaraji" o zmenu vstupu a vystupu. Vystupy z funkce printf a putchar mohou byt vzajemne zameno- vany. Prekvapive velke mnozstvi programu cte pouze jeden vstup a zapisuje na jeden vystup. Pro tyto programy jsou funkce getchar, putchar a printf zcela postacujici. Mame navic moznost presmerovani vstupu a vystupu a moznost retezeni programu. Uvazujeme napr. program l o w e r , ktery meni velka pismena ze vstupu na mala # include main () /* konvertovani velkych pismen na mala { int c; while ((c=getchar()) != EOF) putchar (isupper(c)? tolower(c) : c); } "Funkce" isupper a tolower jsou ve skutecnosti makra definovana ve stdio.h. Makro insupper testuje, zda jeho argument je velke pismeno. Kdyz je argument velke pismeno, tak vraci nenulovou hodnotu a nulu vraci v opacnem pripade. Makro tolower konvertu- je velka pismena na mala. Nehlede na to, jak jsou tyto funkce implementovany na ruznych pocitacich, tak efekt je vzdy a vsude stejny a program se nemusi starat o soubor znaku na danem pocitaci. Pro konvertovani vice souboru muze pouzit program cat cat soubor1 soubor2... | lower > output a nemusime se ucit, jak se ma k souborum pristupovat. (program Š.po 12 cat bude popsan dale v teto kapitole). Standardni "funkce" vstupu a vystupu putchar a getchar mohou byt ve skutecnosti makra a tak se nemusime starat o konvenci volani funkci. Jak to je udelano ukazeme v kapitole 8. 7.3. Formatovy vystup - printf ------------------------------ Dve rutiny printf pro vystup a scanf pro vstup (bude popsano v pristim odstavci) umoznuji translaci cisel na znakovou repre- zentaci. Umoznuji rovnez zapis a cteni formatovanych radek. Funkce printf jsme uzivali v predchozich kapitolach, aniz bychom znali jeji presny popis. Zde uvedeme kompletnejsi presnejsi definici printf (control,arg1,arg2,...) Funkce prinf provadi konverze cisel a formatovy vystup do standardniho souboru. Format je udavan ridicim retezcem c o n t r o l. Tento retezec obsahuje dva typy objektu: obycejne znaky, ktere jsou normalne kopirovany na vystup a konverzni specifikace, z nichz kazda plati pro patricny argument funkce printf. Kazda konverze je uvedena znakem % a je ukoncena znakem pro typ konverze. Mezi znakem % a znakem typu konverze muze byt: Znamenko - , ktere zpusobuje zarovnani argumentu na po- zici doleva. Cislo udavajici minimalni delku pole pro zobrazovany retezec. Konvertovane cislo bude vytisteno do pole minimalne teto delky a popr. bude pouzito pole sirsiho, bude-li to nezbytne. Jestlize ma konvertovane cislo mene znaku nez specifukuje delka pole, tak vystup bude "vyplnen" nalevo (nebo napravo bylo-li specifikovano znamenko - ). Vyplnovaci znaky jsou normalne mezery. Byla-li delka pole specifikovana s uvodnimi nulami, budou vyplnovaci znaky nulami. Tecka, ktera oddeluje delku pole od dalsiho cisla. Ciselny retezec (presnost) ktery udava maximalni pocet znaku, ktere maji byt tisteny napravo od desetinne tecky pro cisla float nebo double. Modifikator delky l (pismeno l), ktere indikuje to, ze argu- mentem je long. Typ konverze muze byt nasledujici: d argument je konvertovan na desitkovy zapis o argument je konvertovan do osmickove soustavy bez znamenka (bez uvodnich nul) x argument je konvertovan na hexadecimalni tvar bez znamenka (bez uvodnich nul) u argument je konvertovan na desitkovy zapis Š.po 3 bez znamenka c argument je dan jako jeden znak s argument je retezec. Retezec je tisten, az do znaku \0 nebo do delky, ktera byla specifikovana e argument je bran jako float nebo double a konverto- van na desitkovy zapis ve forme [-]m.nnnnnne[+]xx, kde delka retezce je specifikovana presnost (impli citne 6) f argument je chapan jako float nebo double a konver- tovan na desitkovy zapis ve tvaru [-]mmm.nnnnnn , kde delka retezce n je specifikovana presnosti (implicitne 6), presnost nijak neovlivnuje tisk vyznamovych cislic g pouziva %e nebo %f podle toho, co je kratsi, nevyznamne nuly nejsou tisteny Jestlize znak za znamenkem % neni znakem konverze, tak je nor- malne vytisten. % muze byt vytisknuto takto: %%. Vetsina formatu jiz byla pouzita a vysvetlena v predchozich kapitolach. Jedinou vyjimkou je zadani presnosti a jeji vliv na tisteny retezec. V nasledujici tabulce jsou probrany ruzne varianty specifikace pri tisku retezce "hello, word",ktery ma 12 znaku. Retezec jsme v prikladech ohranicili znaky: :%10s: :hello, world: :%-10s: :hello, world: :%20s: : hello, world: :%-20s: :hello, world : :%20.10s: : hello, wor: :%-20.10s: :hello, wor : :%.10s: :hello, wor: V a r o v a n i: prvni argument funce printf udava, kolik argumentu nasleduje a jakeho jsou typu. Jestlize je argumentu mene, nebo jsou nespravneho typu, tak vystup bude nesmyslny. C v i c e n i 7.1. Napiste program, ktery bude tisknout udaje ze vstupu rozumnym zpusobem. Minimalne by mel nepismenove znaky tisknout v osmickove nebo sestnactkove soustave a rozde- lovat dlouhe radky. 7.4. Formatovy vstup - scanf ---------------------------- Funkce scanf je funkce analogickou funkci printf. Provadi obdobne konverze opacnym smerem. scanf(control,arg1,arg2,...) scanf cte znaky standardniho vstupu a interpretuje je podle formatovych specifikaci, uvedenych v retezci control a uklada do argumentu. Retezec c o n t r o l bude dale popsan. Ostatni argumenty, z n i c h z k a z d y m u s i b y t p o i n t r urcuji, na ktere misto bude ukladan konvertovany vstup. Retezec control obvykle obsahuje znaky konverznich specifikaci, ktere jsou pouzivany k prime konverzi. Retezec Š.po 12 control muze obsahovat: Mezery, tabelatory nebo znaky pro novou radku "oddelovace", ktere jsou ignorovany Obycejne znaky (vyjma %), o kterych se predpoklada, ze budou souhlasit se znaky ze vstupu. Konverzni specifikace, sestavajici ze znaku %, nepo- vinneho znaku * pro potlaceni prirazeni, nepovinneho poctu udavajiciho maximalni delku pole a znaku typu konverze. Konverzni specifikace je aplikovana na dalsi vystupni pole. Normalne je vysledek ulozen do promenne, na kterou ukazuje nasledujici argument. Jestlize se ve specifikaci objevi znak *, je vstup "preskocen". Vstupni pole je definovano jako rete- zec, ktery neobsahuje oddelovace. Jeho delka omezena dalsim oddelovacem nebo specifikaci delky. Scanf tedy nebude pri nacitani znaku omezovana jednotlivymi radky, protoze znaky pro novou radku jsou pro tuto funkci normalnimi oddelovaci. Znak typu konverze urcuje interpretaci vstupniho pole. Odpovidaji argument musi byt pointr. Nasledujici konverze jsou povoleny: d ocekava se cislo v desitkovem zapisu. Odpovidajici argument by mel byt pointr na cele cislo int o cislo v osmickovem tvaru je ocekavano odpovidajici argument musi byt pointr na int. x je ocekavano cislo hexadecimalnim tvaru. Odpovida- jici argument musi byt pointr na int. h je ocekavano cislo typu short int. Odpovidajici argument musi byt pointr na short int. c je ocekavan jeden znak, odpovidajici argument ma byt pointr na char. V tomto pripade je potlaceno preskakovani oddelovacu. K nacteni dalsiho znaku, ktery neni oddelovacem, je treba pouzit %1s. s je ocekavan znakovy retezec. Odpovidajici argument musi byt pointr na pole znaku dostatecne velke, aby se do neho vesel cely vstupni retezec vcetne ukoncovaciho znaku \0. f je ocekavano cislo s plovouci desetinnou teckou. Odpovidajici argument by mel byt pointr na float. e Vstupni retezec muze obsahovat znamenko, desetinnou tecku a exponent, obsahujici E nebo e a cislo integer se znamenkem. e ma stejny vyznam jako f. Pred znaky konverze o, d, x muze byt uvedeno l (pismeno l), ktere urcuje long int. Obdobne pred znaky e a f muze byt l, ktere urcuje double. Napr. volani int i; float x; char name[50]; Š.po 3 scanf("%d%f%s",&i,&x,name); Se vstupem ve tvaru 25 54.32E-1 Thompson priradi promenne i hodnotu 25, x=5.432 a poli name retezec Thompson\0. Tato 3 vstupni pole mohou byt od sebe oddelena libovolne mnoha oddelovaci. V o l a n i int i; float x; char name[50]; scanf("%2d%f%*d%2s",&i,&x,name); se vstupem ve tvaru 56789 0123 45 a72 priradi promenne i=56, x=789.0, preskoci 0123 a umisti retezec "45" do name. Dalsi vyvolana vstupni funkce zacne nacitani od pismene a. V techto dvou prikladech je n a m e pole a proto nemusi byt oznaceno znakem &. V dalsim prikladu prepiseme program pro kalkulator z kapito- ly 4 s pouzitim funkce scanf: #include main() /*jednoduchy stolni kalkulator*/ { double sum,v; sum=0; while(scanf("%lf",&v) != EOF) printf("\t%.2f\n",sum+=v); } Funkce scanf ukonci cinnost, jestlize vycerpa ridici retezec, nebo narazi-li na vstup, ktery neodpovida zadane specifikaci. Jako hodnotu vraci pocet uspesne nactenych vstupnich polozek. Narazi-li na konec vstupu, vraci EOF. To je odlisne od znaku O, ktery vraci neodpovida-li vstup formatove specifikaci. Po dalsim vyvolani pokracuje funkce nasledujicim znakem. Z a v e r e c n e v a r o v a n i: argumenty musi byt pointry! Obvykla chyba je: scanf("%d",n); misto scanf("%d"&n); .pa Š.po 12 7.5. Formatove konverze u pameti ---------------------------------- Funkce scanf a printf maji sve obdoby, nazyvane sscanf a sprintf, ktere provadeji obdobne konverze, ale operuji s retezci misto se soubory. Obecny tvar zapisu. sprintf(string, sontrol, arg1, arg2, ...) sscanf(string, control, arg1, arg2, ...) Sprintf konvertuje argumenty stejnym zpusobem jako printf, ale vysledek pise do retezce string misto do standardniho vystupu. Ovsemze string musi byt dostatecne velky. Jestlize je navic znakovym polem a n je cele cislo, potom sprintf(name,"temp%d",n); vytvari retezec ve tvaru tempnnn v poli name. nnn je hodnota promenne n. sscanf provadi opacnou konverzi - prohledava retezec podle formatove specifikace v retezci control a hodnoty uklada do arg1, arg2, coz opet musi byt pointry. Volani sscanf(name,"temp%d",&n); nastavuje n na hodnotu retezce za nazvem temp. C v i c e n i 7.2 Prepiste kalkulator z kapitoly s pouzitim funkce scanf a sscanf. 7.6. Pristup k souborum ----------------------- Programy, ktere jsme dosud napsali ctou ze standardniho vstupu a pisou na standardni vystup, ktere jsou programu "preddefinovany" operacnim systemem. V dalsim kroku napiseme program, ktery pracuje se soubory, ktere k nemu nejsou opercnim systemem implicitne prirazeny. Jednim takovym programem je program cat, ktery retezi skupinu pojmenovanych souboru na standardni vystup. Program cat je pouzivan pro tisk souboru na terminal a je univerzalnim predzpracovacim programem pro ty programy, ktere nemaji pristup k jinemu nez standardnimu vstupu. Napr. prikaz cat x.c y.c Tiskne obsah souboru x.c a y.c do standardniho vystupu. Otazkou zustava, jak zabezpecit to, aby soubory byly nacteny - tzn. jak spojit externi jmena souboru s aktualnim prikazem pro nacitani dat. Pravidla jsou jednoducha. Predtim, nez soubor bude cten nebo do nej bude psano, musi byt otevren pomoci standardniho programu fopen. Fopen prijima externi jmena (jako x.c, y.c) Š.po 3 provadi interakci s operacnim systemem (detaily nas nemusi zajimat) a vraci interni jmeno, ktere musi byt pouzito v nasledujicim cteni nebo psani. Toto interni jmeno je vlastne pointr (ktery se nazyva p o i n t r n a s o u b o r ) na strukturu, ktera obsahuje informace o souboru. Informace obsahuje udaje o umisteni vyrovnavaci pameti (bufferu), aktualni pozici v teto pameti, zda je soubor cten nebo je do neho psano atd. Programator nemusi znat podrobnosti, protoze casti standardnich definic obsazenych ve stdio.h je definice struktu- ry nazvana FILE. Jedina potrebna deklarace je FILE *fopen(),*fp; Definice rika, ze fp je pointr na FILE a fopen vraci pointr na FILE. Uvedomme si, ze FILE je nazev typu zrovna tak jako je int a neni to vlastne nazev struktury. (Podrobnosti, jak vse pracuje pod systemem UNIX jsou dany v ka- pitole 8) Skutecne volani fopen vypada takto fp=fopen(name,mode); Prvni argumentem funkce fopen je n a z e v s o u b o r u name, zadany jako znakovy retezec. Druhy argument, mode, urcuje zpusob pristupu k souboru. Je to rovnez znakovy retezec. Volene zpusoby pristupu jsou: cteni ("r"), zapis ("w") a pripisovani na konec ("a"). Jestlize otevreme soubor, ktery neexistuje, pro zapis nebo pripisovani na konec, tak je soubor vytvoren. Otevreni existu- jiciho souboru pro zapis zpusobi jeho smazani. Pokus o cteni neexistujiciho souboru pusobi chybu. Chyba pri cteni muze na- stat take z dalsich duvodu (napr. cteni souboru, ke kteremu neni povolen pristup). Jestlize pri cteni vznikla chyba, je hodnota pointr fopen rovna NULL (coz je rovnez definovano v stdio.h) Dale je nutno vedet, jak cist a psat do prave otevrenych souboru. Je mnoho moznosti. Funkce getc a putc jsou nejjedno- dussi moznosti. Jako argument je zadan pointr na file. c=getc(fp) Vraci znak ze souboru, na nejz ukazuje pointr fp. Je-li dosa- zeno konce souboru, vraci EOF. Putc je inverzi getc: putc(c,fp); Zapisuje znak do souboru fp a vraci c. Zrovna tak jako getchar a putchar, getc a putc mohou byt makra. Jestlize je program pusten, tak automaticky jsou otevreny tri soubory a jsou dostupne pointry na tyto soubory. Temito soubory jsou: standardni vstup, standardni vystup a standardni vystup pro chybove hlaseni. Pointr na tyto soubory se jmenuji stdin, stdout a stderr. Normalne jsou spojeny s terminalem, ale Š.po 12 stdin a stdout mohou byt presmerovany na soubor, nebo pouzity pro retezeni programu (pipe line) viz odst.7.2. Getchar a putchar mohou byt definovany pomoci getc a putc a stdout takto: #define getchar() getc(stdin) #define putchar(c) putc(c,stdout) Pro formatovy vstup a vystup mohou byt pouzity funkce fscanf a fprintf. Tyto funkce jsou identicke s funkcemi scanf a printf s tim ze prvni argumentem je pointr na soubor a retezec control je az druhym parametrem. Nyni muzeme pristoupit k napsani programu cat. Zakladni princip je pouzitelny pro mnoho dalsich programu: jsou-li zadany argumenty v prikazove radce, jsou brany poporadku. Jestlize argumenty zadany nejsou, je pracovano se standardnim vstupem. Tento program muze byt pouzit samostatne, nebo muze byt casti vetsiho celku #include < stdio.h > main(argc, argv) /*cat:spojovani souboru*/ int argc; char*argv]; { FILE *fp, *fopen(); if(argc == 1) /*zadne argumenty; kopiruj standardni vstup */ filecopy (stdin); else while(--argc > 0) { if((fp=fopen(*++argv,"r")) == NULL { printf("cat:can't open %s\n",*argv); break; } else { filecopy(fp); fclose (fp); } } } filecopy (fp) /* zkopirovani fp do standardniho vystupu */ FILE *fp; { int c; while ((c=getc(fp)) != EOF) putc(c,stdout); } Pointry na soubory stdin a stdout jsou preddefinovany v knihov- ne vstupu a vystupu a mohou byt pouzivany vsude tam, kde mohou byt pouzivany pointry FILE *. Jsou to k o n s t a n t y a ne promenne, takze se nepokousejte jim neco prirazovat. Funkce flose je inverzni funkce fopen. Prerusuje spojeni mezi externim nazvem souboru a pointrem. Pointr muze byt dale pouzit pro jiny soubor. Protoze kazdy opreracni system ma omezeni poctu soucasne otevrenych souboru, je vyhodne pouzivat Š.po 3 ty pointry, ktere uz nejsou potreba - jak jsme to udelali v programu cat. Pro pouziti funkce fclose je dalsi duvod: uvolnuje vyrovnavaci pamet, kterou pouziva putc (funkce fclose je automaticky vyvolana pro kazdy otevreny soubor, kdyz program konci normalne svoji cinnosti) 7.7. Osetrovani chyb - stderr a exit ------------------------------------- Osetreni chyb v programu cat neni idealni. Jestlize jeden ze souboru nemohl byt otevren, tak chybova hlaska je pripojena na konec spojenych souboru. To neni na zavadu tehdy, je-li vystup smerovan na terminal. Je-li ale vystup vstupem pro dalsi program, tak uz tento zpusob neni prijatelny. Druhym vystupnim souborem je stderr. Vystup, ktery je psan na stderr se objevuje na terminalu i tehdy, je-li stdout pres- merovan jinam. Prepiseme nyni program cat s pouzitim stderr. #inclunde* main(argc, argv) /*cat:spojovani souboru*/ int argc; char *argv[]; { FILE *fp, *fopen(); if (argc == 1) /* zadne argumenty. Kopiruj standardni vstup */ filecopy(stdin); else while(--argc > 0) { if((fp=fopen(*++argv,"r")) == NULL) { fprintf(stderr, "cat:can't open %s\n",*argv); exit(1); } else { filecopy(fp); fclose(fp); } exit(0); } Program signalizuje chybu dvema zpusoby. Chybove hlaseni jde na stderr, coz je uzivatel terminalu. Rovnez je zde pouzita standardni funkce exit, ktera ukoncuje cinnost programu, je-li vyvolana. Argument funkce exit muze byt testovan nasledujicim progra- mem. Obycejne se pouziva 0 pro znameni, ze vse probehlo radne a nenulova hodnota pro nenormalni ukonceni. Funkce exit vola fclose pro kazdy otevreny vystupni soubor. Obsah vyrovnavaci pameti je pritom pripsan do souboru a je vyvolana funkce - exit. Funkce - exit okamzite ukoncuje cinnost programu. Muze byt rovnez primo vyvolana. .pa Š.po 12 7.8. Radkovy vstup a vystup ---------------------------- Standardni knihovna obsahuje funkce fgets, ktera je obdobou funkce getline, kterou jsme pouzivali v teto knize. V o l a n i fgets(line,MAXLINE,fp); cte dalsi radku (vcetne znaku pro novou radku) ze souboru fp do znakoveho pole line. Maximalne je nacteno MAXLINE - 1 znaku. Radka je ukoncena znakem \0. Fgets normalne vraci radku. Na konci souboru vraci NULL (nase funkce getline vraci delku radky a NULL pro konec souboru). Funkce fputs pise retezec znaku (retezec nemusi obsahovat znak pro novou radku) do souboru. fputs(line,fp) Abychom ukazali, ze na funkcich fgets a fputs neni nic magicke- ho, uvedeme primo jejich kopie ze standardni knihovny #include char *fgets(s,n,iop) /*nacteni n znaku z iop*/ char *s; int n; register FILE *iop; { register int c; register char *cs; cs = s; while (--n > 0 && (c=getc(iop)) != EOF) { if((*cs++=c) == '\n') break; *cs='\0'; return((c == EOF && cs == s) ? NULL:s); } } fputs(s,iop) /* zapsani retezce s do souboru iop */ register char *s; register FILE *iop; { register int c; while (c=*s++) putc(c,iop); } C v i c e n i 7.3. Napiste program, ktery porovnava dva soubory a tiskne prvni radku a pozici, kde se soubory lisi. C v i c e n i 7.4. Modifikujte program pro nalezeni retezce z kapitoly 5, aby cetl vstup ze vstupnich souboru, ktere budou zadany jako jeho argumenty. Jestlize zadny parametr nebyl za- dan, tak bude cist ze standardniho vstupu. Muze byt vytisteno Š.po 3 jmeno souboru, ve kterem je retezec nalezen? C v i c e n i 7.5. Napiste program, ktery tiskne skupinu sou- boru, kazdy na novou stranku. Tisknete take nazev souboru a cislujte stranky pro kazdy soubor zvlast. 7.9. Nektere dalsi funkce -------------------------- Nektere funkce ze standardni knihovny jsou mimoradne uzitec- ne. Jiz jsme se zminili o funkcich strlen, strcpy, strcat a strcmp. Zde jsou nektere dalsi. Testovani znaku a konverzni funkce Jsou to tato makra isalpha(c) nenulova, je-li c pismeno, nulova, jestlize neni isupper(c) nenulova je-li c velke pismeno nulova, jestlize neni islower(c) nenulova, je-li c male pismeno, nulova, jestlize neni isdigit(c) nenulova, je-li c cislice, nulova, jestlize neni isspace(c) nenulova, jestlize c je mezera, nulova, jestlize neni toupper(c) konvertuje c na velke pismeno tolower(c) konvertuje c na male pismeno Ungetc Ve stantardnim knihovne je hodne omezena verze nasi funkce ungetch, kterou jsme napsali v kapitole 4. ungetc(c,fp) Vraci znak zpet do souboru fp. Je dovoleno vracet pouze jeden znak na radku. Ungetc muze byt pouzita s funkcemi vstupu a vys- tupu a makry jako jsou scanf, getc nebo getchar. Systemova volani ---------------- Funkce system (s) vykona prikaz, ktery je specifikovan v re- tezci s a vraci se zpatky do programu. Obsah retezce s zalezi na operecnim systemu. Napr. v systemu UNIX radka system("date") spusti program date. .pa Š.po 12 Organizace pameti ----------------- Funkce calloc je obdobou funkce alloc, kterou jsme pouzivali v predchozich kapitolach calloc(n,sizeof(objekt)) Vraci pointr na misto v pameti, kam lze umistit n objektu spe- cifikovane delky. Neni-li pozadovana pamet dostupna, vraci NULL. Alokovana pamet je vynulovana. Pointr je radne nastaven na pozadovany objekt, ale mel by byt nastaven na spravny typ: char *calloc(); int *ip; ip=(int*)calloc(n,sizeof(int)); Funkce cfree (p) uvolnuje misto v pameti, na ktery ukazuje pointr p. P bylo puvodne ziskano vyvolanim funkce calloc. Uvolnovani pameti n e m u s i byt delano poporadku. Je ale chybou uvolnovat pamet, ktera nebyla pridelena funkci calloc. V kapitole 8 si ukazeme implementaci funkce calloc.