This shows you the differences between two versions of the page.
programare-ca:laboratoare:lab11 [2012/12/11 12:41] mihaela.vasile created |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 11. Operatii cu fişiere. Aplicaţii folosind fişiere. ===== | ||
- | **Responsabil:** | ||
- | * [[mihaela.vasile@gmail.com|Mihaela Vasile]] | ||
- | |||
- | ==== Obiective ==== | ||
- | |||
- | În urma parcurgerii acestui laborator studentul va fi capabil să: | ||
- | * lucreze cu fişiere text (deschidere, închidere, citire, scriere) | ||
- | * înteleaga un fişier binar şi să lucreze cu el; | ||
- | * să se poziţioneze in interiorul unui fişier; | ||
- | * poată determina poziţia în cadrul unui fişier; | ||
- | * înteleagă diferen0ţa între organizarea internă a fişierelor pe sistemele de operare Linux şi Windows. | ||
- | |||
- | ==== Noţiuni teoretice ==== | ||
- | |||
- | === Introducere === | ||
- | |||
- | Un fişier este o structură dinamică, situată în memoria secundară (pe disk-uri). Limbajul C permite operarea cu fişiere: | ||
- | * de tip text - un astfel de fişier conţine o succesiune de linii, separate prin NL ('\n') | ||
- | * de tip binar - un astfel de fişier conţine o succesiune de octeti, fără nici o structură. | ||
- | |||
- | Prelucrarea unui fişier presupune asocierea acestuia cu un canal de I/E (numit flux sau stream). Există trei canale predefinite, care se deschid automat la lansarea unui program: | ||
- | * stdin - fişier de intrare, text, este intrarea standard - tastatura | ||
- | * stdout - fişier de iesire, text, este ieşirea standard - ecranul monitorului. | ||
- | * stderr – fişier de iesire, text, este ieşirea standard unde sunt scris mesajele de eroare - ecran. | ||
- | |||
- | Pentru a prelucra un fişier, trebuie parcurse următoarele etape: | ||
- | * se defineşte o variabilă de tip FILE * pentru accesarea fişierului; FILE * este un tip structură definit în stdio.h, care conţine informaţii referitoare la fişier şi la tamponul de transfer de date între memoria centrală şi fişier (adresa, lungimea tamponului, modul de utilizare a fişierului, indicator de sfârsit, de poziţie în fişier) | ||
- | * se deschide fişierul pentru un anumit mod de acces, folosind funcţia de bibliotecă fopen, care realizează şi asocierea între variabila fişier şi numele extern al fişierului | ||
- | * se prelucrează fişierul în citire/scriere cu funcţiile specifice | ||
- | * se inchide fişierul folosind funcţia de bibliotecă fclose. | ||
- | |||
- | Mai jos se prezintă restul funcţiilor de prelucrare a fişierelor: | ||
- | |||
- | <code c> | ||
- | FILE *fopen(const char *nume_fis, const char *mod); | ||
- | </code> | ||
- | |||
- | deschide fişierul cu numele dat pentru acces de tip mod. | ||
- | |||
- | Returnează pointer la fişier sau NULL dacă fişierul nu poate fi deschis; valoarea returnată este memorată în variabila fişier, care a fost declarată pentru accesarea lui. | ||
- | |||
- | Modul de deschidere poate fi: | ||
- | * "r" - readonly , este permisă doar citirea dintr-un fişier existent | ||
- | * "w" - write, crează un nou fişier, sau dacă există deja, distruge vechiul continut | ||
- | * "a" - append, deschide pentru scriere un fişier existent ( scrierea se va face în continuarea | ||
- | informaţiei deja existente în fişier, deci pointerul de acces se plasează la sfârşitul fişierului ) | ||
- | * "+" - permite scrierea şi citirea - actualizare (ex: "r+", "w+", "a+"). O citire nu poate fi direct urmată | ||
- | de o scriere şi reciproc. Întâi trebuie repoziţionat cursorul de acces printr-un apel la fseek. | ||
- | |||
- | * "b" - specifică fişier de tip binar | ||
- | * "t" - specifică fişier de tip text (implicit), la care se face automat conversia CR-LF("\n\f") în sau din CR ('\n'). | ||
- | |||
- | <code c> | ||
- | int fclose(FILE *fp); | ||
- | </code> | ||
- | |||
- | închide fişierul şi eliberează zona tampon; returnează 0 la succes, EOF la eroare | ||
- | |||
- | <code c> | ||
- | int fseek(FILE *fp, long offset, int whence); | ||
- | </code> | ||
- | |||
- | repoziţionează pointerul asociat unui fişier . Offset - numărul de octeţi între poziţia dată de whence şi noua poziţie. | ||
- | |||
- | whence - are una din cele trei valori posibile: | ||
- | * SEEK_SET = 0 - Căutarea se face de la începutul fişierului | ||
- | * SEEK_CUR = 1 - Căutare din poziţia curentă | ||
- | * SEEK_END = 2 - Căutare de la sfârşitul fişierului | ||
- | |||
- | <code c> | ||
- | long ftell(FILE* fp); | ||
- | </code> | ||
- | |||
- | întoarce poziţia curentă în cadrul lui fp | ||
- | |||
- | <code c> | ||
- | int fgetpos(FILE* fp, fpos_t* ptr); | ||
- | </code> | ||
- | |||
- | această funcţie memorează în variabila fptr poziţia curentă în cadrul fişierului fp (ptr va putea fi folosit ulterior cu funcţia fsetpos). | ||
- | |||
- | <code c> | ||
- | int fsetpos(FILE* fp, const fpos_t* ptr); | ||
- | </code> | ||
- | această funcţie setează poziţia curentă în fişierul fp la valoarea ptr, obţinută anterior prin funcţia fgetpos. | ||
- | |||
- | <code c> | ||
- | int feof(FILE *fis); | ||
- | </code> | ||
- | |||
- | returnează 0 dacă nu s-a detectat sfârşit de fişier la ultima operaţie de citire, respectiv o valoare nenulă (adevărată) pentru sfârşit de fişier. | ||
- | |||
- | <code c> | ||
- | FILE* freopen(const char* filename, const char* mode, FILE* fp); | ||
- | </code> | ||
- | se închide fişierul fp, se deschide fişierul cu numele filename în modul mode şi acesta se asociază la fp; se întoarce fp sau NULL în caz de eroare. | ||
- | |||
- | <code c> | ||
- | int fflush(FILE* fp); | ||
- | </code> | ||
- | |||
- | Această funcţie se utilizează pentru fişierele deschise pentru scriere şi are ca efect scrierea în fişier a datelor din bufferul asociat acestuia, care înca nu au fost puse în fişier. | ||
- | |||
- | === Citirea şi scrierea în/din fişiere === | ||
- | |||
- | Citirea/scrierea în fişiere se poate face în doua moduri (în functie de tipul fişierului): în mod text sau în mod binar. Principalele diferenţe dintre cele doua moduri sunt: | ||
- | * în modul text, la sfarsitul fişierului se pune un caracter suplimentar, care indica sfârşitul de fişier. În DOS � |