This is an old revision of the document!
Responsabil:
În urma parcurgerii acestui laborator studentul va fi capabil să:
Un fişier este o structură dinamică, situată în memoria secundară (pe disk-uri). Limbajul C permite operarea cu fişiere:
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:
Pentru a prelucra un fişier, trebuie parcurse următoarele etape:
Mai jos se prezintă restul funcţiilor de prelucrare a fişierelor:
FILE *fopen(const char *nume_fis, const char *mod);
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:
informaţiei deja existente în fişier, deci pointerul de acces se plasează la sfârşitul fişierului )
de o scriere şi reciproc. Întâi trebuie repoziţionat cursorul de acces printr-un apel la fseek.
int fclose(FILE *fp);
închide fişierul şi eliberează zona tampon; returnează 0 la succes, EOF la eroare
int fseek(FILE *fp, long offset, int whence);
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:
long ftell(FILE* fp);
întoarce poziţia curentă în cadrul lui fp
int fgetpos(FILE* fp, fpos_t* ptr);
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).
int fsetpos(FILE* fp, const fpos_t* ptr);
această funcţie setează poziţia curentă în fişierul fp la valoarea ptr, obţinută anterior prin funcţia fgetpos.
int feof(FILE *fis);
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.
FILE* freopen(const char* filename, const char* mode, FILE* fp);
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.
int fflush(FILE* fp);
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/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:
Modul binar se utilizează de obicei pentru a scrie în fişier datele exact aşa cum sunt reprezentate în memorie (cu functiile fread, fwrite) - de exemplu pentru un număr intreg se va scrie reprezentarea internă a acestuia, pe 2 sau pe 4 octeti.
Modul text este utilizat mai ales pentru scrierea cu format (cu funcţiile fprintf, fscanf) - în cazul acesta pentru un număr întreg se vor scrie caracterele ASCII utilizate pentru a reprezenta cifrele acestuia (adică un şir de caractere cum ar fi “1” sau “542”).
int fprintf(FILE* fp, const char *format, ...); int fscanf(FILE* fp, const char *format, ...);
Funcţiile sunt utilizate pentru citire/scriere în mod text şi sunt asemănătoare cu printf/scanf (diferenţa fiind că trebuie dat pointerul la fişier ca prim parametru).
int fgetc(FILE* fp); // întoarce următorul caracter din fişier, EOF la sfârşit de fişier
char *fgets(char* s, int n, FILE* fp); // întoarce următoarele n caractere de la pointer sau pâna la sfârşitul de linie
int fputc(int c, FILE* fp); //pune caracterul c in fişier
int ungetc(int c, FILE* fp); // pune c în bufferul asociat lui fp (c va fi următorul caracter citit din fp)
size_t fread(void* ptr, size_t size, size_t nrec, FILE* fp); size_t fwrite(const void* ptr, size_t size, size_t nrec, FILE* fp);
Cu aceste funcţii lucrăm cand deschidem fişierul în mod binar; citirea/scrierea se face fără nici un fel de conversie sau interpretare. Se lucrează cu “înregistrări”, adică zone compacte de memorie: funcţia fread citeşte nrec înregistrări începănd de la poziţia curentă din fişierul fp, o înregistrare având dimensiunea size. Acestea sunt depuse în tabloul ptr. “Înregistrările” pot fi asociate cu structurile din C - adică în mod uzual, tabloul ptr este un tablou de structuri (dar în loc de structuri putem avea şi tipuri simple de date).
nume depunător şir de maxim 30 de caractere data depunerii o structură având câmpurile întregi: zi,lună,an suma depusă o valoare reala. Observaţie: Articolele sunt grupate pe zile in ordine cronologică. Datele se introduc de la consolă, fiecare pe 3 linii.
2 ferit indraznit indraznet istet descurcaret
DA NU DA DA
Explicaţie: Ultimele 2 litere ale cuvintelor "ferit" si "indraznit" coincid, pe când "indraznit" cu "indraznet" nu coincid.