fisiere in c

30
Fişiere – generalitati. •Colecţie de date memorate pe un suport extern (floppy, harddisk, etc) identificată printr-un nume. •Entităţi ale sistemului de operare: numele lor respectă convenţiile sistemului, fără legătură cu un limbaj de programare Numărul de elemente ale unui fişier este variabil (poate fi nul). Se folosesc pentru •date iniţiale sau rezultate mai numeroase

Upload: sandu

Post on 17-Dec-2015

307 views

Category:

Documents


5 download

DESCRIPTION

prezentare despre fisiere 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); }