Download - fisiere in C

Transcript
  • Fiiere generalitati.

    Colecie de date memorate pe un suport extern (floppy,harddisk, etc) identificat printr-un nume.Entiti ale sistemului de operare: numele lor respectconveniile sistemului, fr legtur cu un limbaj de programareNumrul de elemente ale unui fiier este variabil (poate fi nul). Se folosesc pentrudate iniiale sau rezultate mai numeroasepstrarea permanent a unor date de interes pentru anumite aplicaii

  • Operarea cu fisier

    se definete o variabil de tip FILE * pentru accesarea fiierului;

    2. se deschide fiierul pentru un anumit mod de acces, folosind funcia de biblioteca fopen, care realizeaz i asocierea ntre variabila fiier i numele extern al fiierului

    3. se prelucreaz fiierul - citire/scriere cu funciile specifice

    4. se nchide fiierul folosind funcia de biblioteca fclose

  • Operaiile specifice prelucrrii fiierelor sunt

    crearea unui fiiercitirea de articole din fiier (consultarea fiierului)actualizarea (sau modificarea) fiieruluiadugare de articole la sfritul fiieruluipoziionarea n fiier.tergerea unui fiierschimbarea numelui unui fiier

  • Prelucrarea fiierelor se realizeaz pe dou niveluri:

    nivelul inferior (fizic), care apeleaz direct la sistemul de operare.nivelul superior(logic) care utilizeaz structuri speciale FILE Funciile de pe nivelul superior nu asigur o independen total fa de sistemul de operare. Funciile standard de intrare / ieire au prototipurile n fiierul antet .

  • FILE* si nume fisierului fizic

    Asocierea dintre numele extern (un ir de caractere) i variabila din program se face la deschiderea unui fiier, printr-o funcie standard.

    Fisierul logic este legat de un pointer FILE*. Numele fisierului fizic apare in program o singura data in momentul dechiderii fisierului si serveste pentru comunicare cu cel fizic.

  • Accesul la fisiere.Fiierele standard au pointerii predefinii: stdin,stdout,stderr,stdprn,stdaux.

    Declararea unui pointer la fiier are sintaxa :FILE *pf;

    Pentru deschiderea unui fiier se folosete funcia FILE * fopen(char *nume_fis, char *mod_acces);

  • int fputs (const char *str, FILE *stream)produce afiarea unui text n fluxul standard de ieire#include < stdio.h > int main (void) { // Linia write test se introduce in fluxul //standard stdout fputs (write test\n,stdout); return 0; }

  • Deschiderea unui fisier.Deschiderea unui fiier stabileste o conexiune logic ntre fiier i variabila pointer i stabilete un mod de acces la fiieraloc o zon de memorie pentru realizarea mai eficient a operaiilor de intrare / ieire

    Moduri de acces :r - deschiderea unui fisier existent pentru citire w - pentru scriere sau crearea unui fisier noua - deschiderea unui fisier existent pentru adaugarer+ - deschiderea unui fisier existent pentru citire si scrierew+- crearea unui fisier nou pentru scriere si citirea+ - deschidere pentru adaugare si citire

  • Tipuri de fiiere n CFiiere textconin o succesiune de linii, separate prin NewLinefiecare linie are 0 sau mai multe caractere tipribile i/sau tabFiiere binare conin o succesiune de octei ( In cazul fisierilor binare la litera unui modul de acces se adauga litera b, rb,wb, ect.)

  • Fiiere text i fiiere binare

    ntr-un fiier text, toate datele sunt memorate ca iruri de caractere, organizate pe linii, separate ntre ele prin marcajul sfrit de linie \n.

    ntr-un fiier binar, datele sunt pstrate n formatul lor intern (2 octei pentru int, 4 octei pentru float, etc).

    La fiierele text marcajul de sfrit de fiier (caracterul 0X1A) exist fizic n fiier. La ntlnirea acestui caracter funcia fgetc() ntoarce EOF (-1). Marcajul de sfrit de fiier se genereaz de la tastatur prin Ctrl-Z.

    La fiierele binare, marcajul de sfrit de fiier nu exist fizic n fiier, ci este generat de funcia fgetc().

  • Fisiere textCaracter terminator de linie: fiierele Unix/Linux: un singur caracter terminator de linie \nfiierele Windows i MS-DOS: caracterele \r i \n (CR, LF) ca terminator de linie Un fiier text poate fi terminat printr-un caracter terminator de fiier (Ctrl-Z = EOF = -1) Sfritul unui fiier disc poate fi detectat i pe baza lungimii fiierului (numr de octei), memorat pe disc. Se realizeaz conversia automat din/n format extern (ir de caractere) n/din format intern (binar virgul fix sau virgul mobil)

  • Exemple deschidem fis. inp.txt pentru citire FILE *f; // declaram un pointer la fisier f= fopen(inp.txt , r); Pentru excluderea posibilei greseli putem utiliza:

    if ( f = fopen(inp.txt , r ) != NULL ) { //prelucrarea fisierului }

  • Exemplu1. Citire si afisare linii din fisiervoid main() { FILE *fp; char s[80]; if ( (fp=fopen("c:\\test.c , "r")) == NULL ) { printf ( "Nu se poate deschide fiierul!\n ); exit (1);} while ( fgets(s, 80, fp) != NULL ) printf ( "%s", s); fclose (fp); }

  • Inchiderea unui fiierint fclose(FILE *pf);ntoarce 0 la nchidere normal i EOF la producerea unui incidentfiierele standard nu se nchid de ctre programatorpentru un fiier de ieire, se scriu datele rmase nescrise din buffer n fiier, aa c operaia de nchidere este obligatorien cazul unui fiier de intrare, datele necitite din bufferul de intrare sunt abandonatese elibereaz bufferele alocatese ntrerupe conexiunea pointer fiier

  • Operatii de intrare / iesire.

    TipfisierConversieUnitatetransferataFunctiifolosite

    textfaracaracterfgetc()fputc()liniefgets()fputs()culiniifscanf()fprintf()binarfaraarticolfread()fwrite()

  • Operaii de I/ O pentru iruri de caractere

    char *fgets( char *s, int n, FILE *pf );citete caractere din fiierul cu pointerul pf, pn la ntlnirea primului caracter \n (cel mult n-1 caractere) n tabloul s; pune la sfrit \n i \0ntoarce s sau NULL la ntlnire sfrit de fiier sau la eroareint fputs( char *s, FILE *pf );copiaz irul n fiierul de ieirenu copiaz terminatorul de ir \0ntoarce un rezultat nenegativ (numrul de caractere scrise n fiier), sau EOF la producerea unei erori

  • Exemplul 2: Copierea unui fisier.

    #define MAX 100 void copiere2(FILE *d, FILE *s) { char linie[MAX]; while(fgets(linie, MAX, s)) fputs(linie, d); }

  • Operaii de intrare / ieire cu formatint fprintf(FILE *pf, char *format,lista_expr);transfer n fiierul specificat, valorile expresiilor, convertite, potrivit formatului n caracterentoarce numrul de caractere scrise, sau o valoare negativ, dac s-a produs o eroare.

    int fscanf(FILE *pf, char *format, lista_adrese_var);se citesc date din fiierul pf, sub controlul formatului, iniializndu-se variabilele din listfuncia ntoarce numrul de cmpuri citite sau EOF n caz de producere a unui incident la citire sau ntlnire a marcajului de sfrit de fiier.

  • Ex. 3. Se citeste o valoare de tip int din fisierul l1.txt si se scrie in fisierul out_f.txt...void main(){ FILE *f; int dig; if (( f = fopen( "l1.txt , "r )) == NULL) { printf("\n"); exit(0); } fscanf( f, "%d", &dig); fclose(f); f=fopen( "out_f.txt", "w"); fprintf (f," %d",dig); fclose(f); }

  • Exemplu 5. Un program pentru scriere unui numar de valori de tip int in fisier binarvoid main(){FILE *f_out; int number; randomize(); f_out = fopen("int.dat","wb" ); if ( ! f_out ) {puts("Is it impossible to create file !"); exit(1); } for(int i=0; i
  • Intrri / ieiri n modul de acces binar sunt operaii de transfer (citiri / scrieri) fr conversiise fac la nivel de articolpoziia n fiier este actualizat dup fiecare citire / scriere

    unsigned fread(void *zona, unsigned la, unsigned na, FILE *pf);

    citete cel mult na articole, de lungime la fiecare, din fiierul pf n zonantoarce numrul de nregistrri citite sau 0 n caz de eroare sau sfrit de fiier

  • Intrri / ieiri n modul de acces binar

    unsigned fwrite(void *zona, unsigned la, unsigned na, FILE *pf);

    scrie na articole de lungime la, din zona n fiierul pfntoarce numrul de articole scrise.Pentru a copia un fiier binar (sau text) folosind funciile fread() i fwrite() vom considera lungimea articolului 1 octet.

  • Exemplul 4: Copierea unui fisier in mod binar.

    void copiere(FILE * d, FILE * s){ int noc; // numar de octeti cititi char zona[MAX]; while((noc = fread(zona,1,MAX,s))>0) fwrite(zona, 1, noc, d);}

  • Functii pentru acces directint fseek (FILE *fp, long int offset, int poziie)

    poziioneaz indicatorul de poziie la valoarea dat de offset fa de poziie:SEEK_SET = 0 - Cutarea se face de la nceputul fis.SEEK_CUR = 1 - Cutare din poziia curentSEEK_END = 2 - Cutare de la sfritul fiierului

    Intr-un fiier text poziionarea este posibil numai fat de nceputul fiierului, iar poziia se obine printr-un apel al funciei ftell

  • Poziionarea n fiier long ftell(FILE *pf);ntoarce poziia curent n fiier, exprimat prin numrul de octei fa de nceputul fiierului

    void rewind(FILE *pf);realizeaz o poziionare la nceputul fiierului, fiind echivalent cu: fseek(pf, 0L, SEEK_SET);

  • Exemplul 4: Dimensiunea unui fisier.

    long FileSize(FILE *pf){ long pozv, noct; pozv = ftell(pf);//salvare poz curenta //pozitionare la sfarsit fseek(pf, 0L, SEEK_END); noct = ftell(pf); // nr de octeti //revenirea la pozitia veche fseek(pf, pozv, SEEK_SET); return noct;}

  • Descriptor al fisierului int fileno (const FILE *stream) ;

    "fileno" intoarce numarul- descriptor fisierului. Pentru "stdin", "stdout", and "stderr" fileno intoarce 0, 1, and 2 respectiv. Pentru cele lalte 3-19.In caz de eroare "fileno" returneaza -1

  • Tratarea erorilor

    int feof(FILE *pf);ntoarce o valoare diferit de 0, dac s-a detectat marcajul de sfrit de fiier

    int ferror(FILE *pf);ntoarce o valoare diferit de 0, dac s-a detectat o eroare n cursul operaiei de intrare / ieire

  • Exemplu.6. Se cauta vaoarea maxima float din fisier si se inlocueste cu valoarea=0void main(){ FILE *f_inp; int n_max; int handle; float val, max, zero=0; f_inp = fopen ( "float.dat ", "rb" ); if ( !f_inp ) { puts(" It is impossible to read file !"); exit(1); } handle = fileno (f_inp); //handle obtine valoarea intoarsa de functia fileno()

  • Exemplu 6. continuare n_max=0; fread(&max, sizeof(float) , 1 , f_inp); for(int i=1; I < filelength (handle); i++) { fread(&val, sizeof(float) , 1 , f_inp); if (val > max) { max=val; n_max=i; } } fseek( f_inp, n_max * sizeof(float), SEEK_SET); fwrite(&zero, sizeof(float), 1, f_inp); fclose(f_inp); }


Top Related