+skyler_sdf Posted February 10, 2012 Report Posted February 10, 2012 Operaţii de intrare / ieşire Întrucât limbajul C nu a fost dezvoltat pentru un sistem particular de operare, şi datorită faptului că s-a dorit realizarea unei portabilităţi cât mai mari, atât a unui compilator C, cât şi a programelor scrise în acest limbaj, el nu posedă facilităţi de intrare / ieşire. Există totuşi un sistem de intrare / ieşire constituit dintr-un număr de subprograme care realizează funcţii de intrare / ieşire pentru programe scrise în C, dar care nu fac parte din limbajul C. Aceste subprograme se găsesc în biblioteca C. Scopul acestui capitol este de a descrie cele mai utilizate subprograme de intrare / ieşire şi interfaţa lor cu programele scrise în limbajul C. Intrări şi ieşiri standard; fişiere Sistemul I/O oferă utilizatorului trei „fişiere” standard de lucru. Cuvântul fişier a fost pus între ghilimele, deoarece limbajul nu defineşte acest tip de dată şi pentru că fişierele reprezintă mai degrabă nişte fluxuri de intrare / ieşire standard puse la dispoziţia utilizatorului. Aceste fişiere sunt: – fişierul standard de intrare (stdin); – fişierul standard de ieşire (stdout); – fişierul standard de afişare a mesajelor (stderr). Toate aceste trei fişiere sunt secvenţiale şi în momentul execuţiei unui program C sunt implicit definite şi deschise. stdin şi stdout sunt asociate în mod normal terminalului de la care a fost lansat programul în execuţie. Sistemul I/O permite redirectarea acestor fişiere pe alte periferice şi închiderea lor la încheierea execuţiei programului. Redirectarea fişierului stdin se specifică prin construcţia: <specificator-fişier-intrare în linia de comandă prin care a fost lansat programul. Redirectarea fişierului stdout se specifică prin construcţia: >specificator-fişier-ieşire în linia de comandă prin care a fost lansat programul. Redirectarea fişierului stdout pe un alt periferic, în scopul efectuării unei operaţii de adăugare (append) se specifică prin construcţia: >>specificator-fişier-ieşire stderr este întotdeauna asociat terminalului de la care a fost lansat programul în execuţie şi nu poate fi redirectat. Astfel că o linie de comandă a unui program poate arăta astfel: Prog <intrare-standard >ieşire-standard alţi parametri Prog < intrare-standard >> ieşire-standard alţi parametri Fiecare din parametri poate lipsi; în lipsa unui specificator de intrare sau ieşire standard se foloseşte terminalul curent. Asocierea unui fişier cu intrarea sau ieşirea standard este făcută de sistemul de operare, programul primind doar informaţii despre ceilalţi parametri din linia de comandă. Pentru a se putea face o referire la fişiere orice program C trebuie să conţină fişierul stdio.h, care se include printr-o linie de forma: #include <stdio.h> Pentru claritatea şi lizibilitatea programelor scrise în C, cât şi pentru crearea unei imagini sugestive asupra lucrului cu fişiere, în fişierul de definiţii standard stdio.h s-a definit un nou nume de tip de dată şi anume FILE care este o structură. Pentru a referi un fişier, este necesară o declaraţie de forma: FILE *fp; unde fp va fi numele de dată cu care se va referi fişierul în orice operaţie de intrare / ieşire asociată. Iată câteva informaţii păstrate de structura FILE: – un identificator de fişier pe care sistemul de operare âl asociază fluxului pe durata prelucrării; acesta poate fi aflat cu ajutorul funcţiei fileno; – adresele zonelor tampon asociate; poziţia curentă în aceste zone; – indicatorii de sfârşit de fişier şi de eroare; – alte informaţii. Accesul la fişiere, deschidere şi închidere Nume fopen - deschide un flux Declaraţie FILE *fopen(const char *num, const char *mod); Descriere Funcţia fopen deschide fişierul al cărui nume este un şir indicat de num şi îi asociază un flux. Argumentul mod indică un şir care începe cu una din secvenţele următoare: r deschide un fişier pentru citire; r+ deschide pentru citire şi scriere; w trunchiază fişierul la lungime zero sau creează un fişier pentru scriere; w+ deschide pentru adăugare la sfârşit, în citire şi scriere; fişierul este creat dacă nu există, altfel este trunchiat; a deschide pentru adăugare la sfârşit, în scriere; fişierul este creat dacă nu există; a+ deschide pentru adăugare la sfârşit, în citire şi scriere; fişierul este creat dacă nu există; Nume fclose - închide un flux Declaraţie int fclose( FILE *flux); Descriere Funcţia fclose închide fişierul asociat fluxului flux. Dacă flux a fost deschis pentru ieşire, orice date aflate în zone tampon sunt scrise în fişier în prealabil cu un apel fflush. Valori returnate În caz de succes se returnează 0. În caz de eroare se returnează EOF şi variabila globală errno indică codul erorii. Nume tmpfile - creează un fişier temporar Declaraţie FILE *tmpfile(); Descriere Funcţia tmpfile generează un nume unic de fişier temporar. Acesta este deschis în mod binar pentru scriere / citire ("wb+"). Fişierul va fi şters automat la închidere sau la terminarea programului. Valoare returnată Funcţia returnează un descriptor de flux în caz de succes, sau NULL dacă nu poate fi generat un nume unic de fişier sau dacă fişierul nu poate fi deschis. În caz de eroare variabila globală errno indică codul erorii. Nume fflush - forţează scrierea în flux Declaraţie int fflush(FILE *flux); Descriere Funcţia fflush forţează o scriere a tuturor datelor aflate în zone tampon ale fluxului flux. Fluxul rămâne deschis. Valori returnate În caz de succes se returnează 0. În caz de eroare se returnează EOF şi variabila globală errno indică codul erorii. Nume fseek, ftell, rewind - repoziţionează un flux Declaraţie int fseek(FILE *flux, long ofs, int reper); long ftell(FILE *flux); void rewind(FILE *flux); Descriere Funcţia fseek setează indicatorul de poziţie pentru fişierul asociat fluxului flux. Noua poziţie, dată în octeţi, se obţine adunând ofs octeţi (offset) la poziţia specificată de reper. Dacă reper este SEEK_SET, SEEK_CUR, sau SEEK_END, ofs este relativ la începutul fişierului, poziţia curentă a indicatorului, respectiv sfârşitul fişierului. Funcţia fseek şterge indicatorul de sfârşit de fişier Funcţia ftell obţine valoarea curentă a indicatorului de poziţie pentru fişierul asociat fluxului flux. Funcţia rewind poziţionează indicatorul de poziţie pentru fişierul asociat fluxului flux la începutul fişierului. Este echivalentă cu: (void)fseek(flux, 0L, SEEK_SET) cu completarea că funcţia rewind şterge şi indicatorul de eroare al fluxului. Valori returnate Funcţia rewind nu returnează nici o valoare. În caz de succes, fseek returnează 0, şi ftell returnează offset-ul curent. În caz de eroare se returnează EOF şi variabila globală errno indică codul erorii. Nume fileno – returnează descriptorul asociat fluxului Declaraţie int fileno(FILE *flux); Descriere Funcţia fileno examinează argumentul flux şi returnează descriptorul asociat de sistemul de operare acestui flux. Nume fgets - citeşte un şir de caractere dintr-un flux text Declaraţie char *fgets(char *s, int size, FILE *flux); Descriere Funcţia fgets citeşte cel mult size-1 caractere din flux şi le memorează în zona indicată de s. Citirea se opreşte la detectarea sfârşitului de fişier sau new-line. Dacă se citeşte caracterul new-line acesta este memorat în s. După ultimul caracter se memorează null. Apeluri ale acestei funcţii pot fi combinate cu orice apeluri ale altor funcţii de intrare din bibliotecă (fscanf, de exemplu) pentru un acelaşi flux de intrare. Valori returnate Funcţia returnează adresa s în caz de succes, sau NULL în caz de eroare sau la întâlnirea sfârşitului de fişier dacă nu s-a citit nici un caracter. Nume fputs - scrie un şir de caractere într-un flux text Declaraţie int fputs(const char *s, FILE *flux); Descriere Funcţia fputs scrie şirul s în flux fără caracterul terminator null. Apeluri ale acestei funcţii pot fi combinate cu orice apeluri ale altor funcţii de ieşire din bibliotecă (fprintf, de exemplu) pentru un acelaşi flux de ieşire. Valori returnate Funcţia returnează o valoare non-negativă în caz de succes, sau EOF în caz de eroare. Nume fread, fwrite - intrări / ieşiri pentru fluxuri binare Declaraţie unsigned fread(void *ptr, unsigned size, unsigned nel, FILE *flux); unsigned fwrite(const void *ptr, unsigned size, unsigned nel, FILE *flux); Descriere Funcţia fread citeşte nel elemente, fiecare având mărimea size octeţi, din fluxul indicat de flux, şi le memorează în zona indicată de ptr. Funcţia fwrite scrie nel elemente, fiecare având mărimea size octeţi, din fluxul indicat de flux, pe care le ia din zona indicată de ptr. Valori returnate Funcţiile returnează numărul de elemente citite sau scrise cu succes (şi nu numărul de caractere). Dacă apare o eroare sau se întâlneşte sfârşitul de fişier, valoarea returnată este mai mică decât nel (posibil zero). Nume scanf, fscanf, sscanf - citire cu format Declaraţie int scanf(const char *fmt, ...); int fscanf(FILE *flux, const char *fmt, ...); int sscanf(char *str, const char *fmt, ...); Descriere Funcţiile din familia ...scanf scanează intrarea în concordanţă cu şirul de caractere fmt după cum se descrie mai jos. Acest format poate conţine specificatori de conversie; rezultatele unor astfel de conversii (dacă se efectuează) se memorează prin intermediul argumentelor pointer. Funcţia scanf citeşte şirul de intrare din fluxul standard stdin, fscanf din flux, şi sscanf din şirul indicat de str. Nume printf, fprintf, sprintf - scriere cu format Declaraţie int printf(const char *fmt, ...); int fprintf(FILE *flux, const char *fmt, ...); int sprintf(char *str, const char *fmt, ...); Descriere Funcţiile din familia ...printf generează o ieşire în concordanţă cu format după cum se descrie mai jos. Funcţia printf afişează ieşirea la fluxul standard stdout; fprintf scrie ieşirea la flux; sprintf scrie ieşirea în şirul de caractere str. Nume perror - afişează un mesaj de eroare sistem Declaraţie void perror(const char *s); #include <errno.h> const char *sys_errlist[]; int sys_nerr; Descriere Rutina perror afişează un mesaj la ieşirea standard de eroare, care descrie ultima eroare întâlnită la ultimul apel sistem sau funcţie de bibliotecă. Mai întâi se afişează argumentul s, apoi virgula şi blanc, şi în final mesajul de eroare şi new-line. Se recomandă (mai ales pentru depanare) ca argumentul s să includă numele funcţiei în care a apărut eroarea. Codul erorii se ia din variabila externă errno. Lista globală de erori sys_errlist[] indexată cu errno poate fi folosită pentru a obţine mesajul de eroare fără new-line. Ultimul indice de mesaj din listă este sys_nerr-1. Se recomandă o atenţie deosebită în cazul accesului direct la listă deoarece unele coduri noi de eroare pot lipsi din sys_errlist[]. Dacă un apel sistem eşuează variabila errno indică codul erorii. Aceste valori pot fi găsite în <errno.h>. Funcţia perror serveşte la afişarea acestui cod de eroare într-o formă lizibilă. Dacă un apel terminat cu eroare nu este imediat urmat de un apel perror, valoarea variabilei errno se poate pierde dacă nu e salvată. Nume clearerr, feof, ferror - verifică şi resetează starea fluxului Declaraţie void clearerr(FILE *flux); int feof(FILE *flux); int ferror(FILE *flux); Descriere Funcţia clearerr şterge indicatorii de sfârşit de fişier şi eroare ai fluxului. Funcţia feof testează indicatorul de sfârşit de fişier al fluxului, şi returnează non-zero dacă este setat. Acesta este setat dacă o operaţie de citire a detectat sfârşitul de fişier. Funcţia ferror testează indicatorul de eroare al fluxului, şi returnează non-zero dacă este setat. Acesta este setat dacă o operaţie de citire sau scriere a detectat o eroare (datorată de exemplu hardware-ului). 1
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now