Pridať komentár

Príspevok, na ktorý odpovedáte

Re: C na GNU/Linux 14.07.2008 | 04:47
Avatar vid   Používateľ

Vyborne! Davno som nevidel clanok co by to pekne zhrnul. 5/5

Par detailov:
- uviedol by som tam priklad pouzitia "errno". To je myslim dost zaklad, aj ked uznavam ze casto nie potrebny.
- velky odkaz na glibc manual na zaciatku alebo na konci, nielen v texte

Este mozno niekomu nemusi byt z textu jasne na co su dve sady funkcii na pristup k suborom, cez systemove handle, a cez streamy. Spomina sa len ze streamy su buffrovane, ale myslim ze nebude odveci trochu viac to rozviest. Tie streamy maju zmysel hlavne pri spracovani textu, tj. textove streamy. Pri binarnych streamoch je asi naozaj jedinym rozdielom len to buffrovanie. Pri texte vsak toho treba robit viac.
http://www.gnu.org/software/libc/manual/html_node/Binary-Streams.html
http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html

Na niektorych non-POSIX systemoch sa napriklad pri citani musia 2-bytove konce riadkov CRLF prelozit na LF (v Ccku '\n'), a pri zapise naopak. Preto na non-POSIX systemoch sa ani neda spolahlivo vyuzivat fseek() so SEEK_REL. Na POSIX systemoch to neplati, ale je to jeden z dovodov preco su veci riesene tak ako su, a je to dolezite vediet pri portabilnom kode.

Dalsia vec je, ze pri citani je buffrovanie aspon jedneho znaku nevyhnutne pre funkcie typu scanf(). Napriklad ked nacitavame cislo, musime spracuvat znaky az kym neprijde nejaky znak ktory nieje cislica. Tento znak je teda uz z handle precitany, ale scanf() ktory cita cislo ho nesmie spracovat. Tento znak sa teda musi niekam ulozit, a pouzit pri nasledujucom citani. Preto nieje mozne urobit funkciu typu scanf() bez pouzitia buffra, a preto neexistuje varianta tejto funkcie priamo pre systemove handle.
http://www.gnu.org/software/libc/manual/html_node/Unreading.html

Plus mala poznamka pre kolegov detailistov: glibc implementacia nacitania cisla z textu pomocou scanf() sa neda pouzit pokial chceme poriadnu kontrolu vstupu. Je tam totizto spravena taka dost somarina, ze ak je cislo na vstupe vecsie ako velkost premennej do ktorej ho zapisujeme, tak si veselo pretecie. Napriklad ked do 32bit premennej skusite pomocou scanf nacitat 4294967297, tak v tej premennej budete mat 1. Standard jasne nedefinuje co urobit v tomto pripade, takze logicke by bolo vratit ERANGE, lenze vela ludi so mnou ocividne nesuhlasi. Preto ten scanf() treba brat trosku s rezervou.

2 + 5 plus tisíc (číslom)

Maximálna veľkosť je: 2,0 MB