Programarea Calculatoarelor M8

  • View
    237

  • Download
    0

Embed Size (px)

Text of Programarea Calculatoarelor M8

  • 8/8/2019 Programarea Calculatoarelor M8

    1/12

    Programarea Calculatoarelor(limbajul C)

    Curs 8 Lucrul cu pointeri ifiiere de date

    Universitatea Politehnica din BucuretiFacultatea de Electronic, Telecomunicaii i

    Tehnologia Informaiei

    .l. Bogdan IONESCUProf. Drago BURILEANUProf. Claudius DAN

    2010-20112

    Cuprins

    8.1. Lucrul cu pointeri

    8.2. Lucrul cu fiiere de date

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 1/66

    3Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 2/66

    8.1. Lucrul cu pointeri

    4Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 3/66

    Ce reprezint un pointer ?

    > Pentru a nelege noiunea de pointer vom relua n discuienoiunea de variabil.

    > Variabil = un container sau o zon de memorie n caresunt stocate anumite valori.

    2009

    > Zona de memorie nu este oarecare, ci aceasta are o anumitadres unic (un numr) pe baza creia se poate face referinla ea.

    2567843

    valoarea variabilei

    adresa de memorie

    > Variabila este identificat printr-un nume alfanumeric unic.

    VarA

    nume

    5Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 4/66

    Ce reprezint un pointer ? (continuare)

    2009

    2567843

    valoarea variabilei

    adresa de memorie

    VarA

    nume

    Ce se ntmpl dac scriem:

    printf(%d, VarA);

    Dar dac scriem:

    printf(%d, &VarA);

    >2009

    >2567843

    VarA indic

    valoarea

    &VarA indic

    adresa

    6Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 5/66

    Ce reprezint un pointer ? (continuare)

    > Un pointer este tot o variabil, adic o locaie de memorie.

    > Acesta difer de variabilele clasice prin faptul c, n loc sstocheze valori, acesta stocheaz doar adrese ale locaiilordin memorie.

    > De aici i denumirea de pointer indicator, prin intermediuladresei pe care o stocheaz, putem spune c acesta indicspre coninutul unei alte locaii de memorie.

    PointerA

    2009

    2567843

    adresa variabilei pointer

    10000

    2567843PointerA

    valoarea pointerului

  • 8/8/2019 Programarea Calculatoarelor M8

    2/12

    7Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 6/66

    Lucrul cu pointeri

    > Pointerii constituie fundamentul limbajului C, acetia oferindo multitudine de avantaje:

    - rapiditate n manipularea datelor, exemplu: vrem s

    copiem valorile vectorului A n vectorul B, folosindpointerii este suficient s stocm adresa primului elementdin A n adresa primului element din B,

    - eficientizare a memoriei, variabilele definite ca pointeripot fi alocate dinamic: se aloc cnd vrem, ct vrem ict timp vrem (se poate elibera memoria),

    - anumite calcule nu pot fi exprimate dect pe bazapointerilor,

    8Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 7/66

    Lucrul cu pointeri (continuare)

    > Avantaje (continuare):

    - o funcie poate returna mai multe valori cu ajutorulpointerilor, returnnd astfel adresa la care se gsesc

    acestea (de exemplu, adresa de nceput a unui vector)- transmiterea valorilor prin adres (pointer) nfuncii permite modificarea valorilor acestora, ceea ce nueste valabil cnd parametrul funciei este transmis prinvaloare (cazul clasic),

    - etc.

    > Principalul dezavantaj este dat manipularea acestora, cenecesit anumite precauii, anumite greeli de manipularenefiind sesizate de compilator !!!

    9Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 8/66

    Lucrul cu pointeri (continuare)

    > n limbajul C studiat pn n acest punct, ai lucrat deja cupointeri, i anume la:

    - lucrul cu vectori i matrice,

    - lucrul cu funcii.

    - lucrul cu iruri de caractere,

    - lucrul cu structuri de date i uniuni,

    *;

    > Modul de definire al unui pointer:

    > Efect: variabila va fi un pointer ce indic olocaie de memorie ce stocheaz valori de tip .

    10Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 9/66

    Lucrul cu pointeri (continuare)

    int *PointerInt;double *PointerReal;

    > Exemple:PointerInt va conine adresa uneilocaii de memorie ce stocheaz

    ntregi (32 bii),PointerReal va conine adresa uneilocaii de memorie ce stocheazdouble (64 bii),

    > Atenie: tipul datelor indicate este specificat tocmai pentru c

    acestea sunt stocate diferit, astfel nu putem suprapune undouble peste int.

    > Care sunt ustensilelede care dispunem n lupta cu pointerii:- operatorul unar& = adresa unei variabile,

    - operatorul de indirectare * = coninutul obiectului indicatde pointer (coninutul de la adresa stocat de pointer).

    11Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 10/66

    Lucrul cu pointeri (continuare)

    int x=1, y=2;int *ip;

    > Exemplu utilizare pointeri:

    adr.100

    x

    1

    adr.200

    y

    2

    adr.1000

    ip

    ?*!#

    > Efect:- la adresa variabilei x (ex.100) am pus valoarea 1,

    - la adresa lui y (ex. 200) am pus valoarea 2,

    - la adresa pointerului ip (ex. 1000) am pus valoarea ???

    > Cnd un pointer este declarat, nu conine o adres valid,

    de regul indic ctre o zon de memorie care, de cele maimulte ori nici nu aparine programului.

    > Dup declarare, precum variabilele,pointerul trebuie iniializat.

    adr.100 adr.200 adr.1000

    x y ip

    1 100

    12Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 11/66

    Lucrul cu pointeri (continuare)

    > Exemplu utilizare pointeri (continuare):

    ip=&x;

    adr.1000

    ip

    adr.100 adr.200

    x y

    1 2 100

    > Traducere: la adresa de memorie a variabilei pointerip seva stoca adresa (dat de operatorul &) variabilei x.

    pointerul ip indic acum ctre variabila x.

    y=*ip; 1

    > Traducere: variabila y preia valoarea de la adresa stocat npointerul ip sau cu alte cuvinte, coninutul obiectului indicat deip (returnat de operatorul *).

    ???

    ???

  • 8/8/2019 Programarea Calculatoarelor M8

    3/12

    adr.100 adr.200 adr.1000

    2

    x y ip

    adr.100 adr.200 adr.1000

    2 100

    x y ip

    13Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 12/66

    Lucrul cu pointeri (continuare)

    > Exemplu utilizare pointeri (continuare):

    x=ip; 100

    > Traducere: variabila x va lua valoarea variabilei pointerip, ianume adresa coninut de aceasta, care este adresa lui x.

    *ip=3; 3 100

    > Traducere: coninutul obiectului indicat de pointerul ip, ianume locaia de memorie de la adresa 100 va primi valoarea 3.

    variabila x are valoarea 3 (echivalent x=3).

    ???

    ???

    14Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 13/66

    Lucrul cu pointeri (continuare)

    > Recapitulare:

    int *ip;

    ipnseamn:coninutul variabilei pointer ip i anumeo adres la o variabil de tip ntreg.

    &ipnseamn:adresa din memorie a variabilei pointer ipi anume locaia unde stocheaz adresele

    *ipnseamn:coninutul obiectului indicat de pointer ianume coninutul locaiei de memorie dela adresa memorat de pointer (adr. ip)

    adr.A adr.B

    ip x

    15Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 14/66

    Aritmetica pointerilor

    > Fiind variabile, pointerii permit efectuarea a o serie deoperaii specifice variabilelor.

    int *ip;*ip=100;

    Care este efectul acestor instruciuni ?

    adr.

    ip

    ?*!#

    adr. ?*!#

    100

    > Greeal tipic: un pointer trebuie iniializat, deoarece altfeleste posibil s indice o locaie inaccesibil.

    Corect ar fi:

    int *ip, x;ip=&x;*ip=100;

    adr.B 100

    char*mychar;short *myshort;long *mylong;

    16Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 15/66

    Aritmetica pointerilor (continuare)

    > Exemplu 1*:

    *http://www.cplusplus.com/doc/tutorial/pointers.html

    - mycharindic o locaie de memorie pe8 bii (1 byte),- myshort indic o locaie de memoriepe 16 bii (2 bytes),- mylong indic o locaie de memorie pe32 bii (4 bytes),

    mychar++;

    myshort++;mylong++;

    mychar=1000;

    myshort=2000;mylong=3000;

    17Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 16/66

    Aritmetica pointerilor (continuare)

    > Exemplu 2:

    int *p, x;p=&x;*p++=10;

    - p este un pointer care indic variabilantreag x.

    >Atenie: operatorii ++ i -- au prioritate mai mare dectoperatorul * (vezi Cursul 5).

    > Astfel, *p++ este echivalent cu *(p++).

    p p++

    adr.A

    8 bii

    adr.A+1

    8 bii

    x

    8 bii 8 bii

    adr.A+2 adr.A+3

    8 bii

    adr.A+4

    18Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 17/66

    Aritmetica pointerilor (continuare)

    > Exemplu 2 (continuare)

    adr.A

    8 bii

    adr.A+1

    8 bii

    p

    x

    8 bii 8 bii

    adr.A+2 adr.A+3

    p++

    10

    adr.A+4

    > Teoretic, *(p++)=10 se traduce prin:

    - p nu mai are ca valoare adresa lui x (adr. A) ci p++, ianume adresa p+4bytes (adr.A+4).

    - la adresa stocat la adr.A+4 se va pune valoarea 10.

    > Practicam omis faptul c p++ este o incrementare post:

    - la adresa stocat n p se va pune valoarea 10.

    - dup aceasta, p este incrementat i indic adr.A+4.

  • 8/8/2019 Programarea Calculatoarelor M8

    4/12

    int *p, x=15;p=&x;(*p)++;

    adr.A adr.B

    p x

    adr.B 15+1

    adr.A adr.B

    p x

    adr.A adr.B

    p x

    19Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 18/66

    Aritmetica pointerilor (continuare)

    > Exemplu 3:

    ??? 15

    adr.B 15

    > (*p)++ coninutul locaiei de memorie indicate de p este mritcu 1, echivalent cu x++.

    20Curs Programarea C alculatoarelor, .l. Bogdan IONESCU, 2010-2011 19/66

    Aritmetica pointerilor (continuare)

    > Exemplu 4:

    int numere[5], n;int *p;p=numere;

    *p=10;p++;

    *p=20;p=&numere[2];*p=30;p=numere + 3;

    *p=40;p=numere;

    *(p+4)=50;for(n=0; n Exemplu 4 (cont.)

    int numere[5], n;int *p;p=numere;

    *p=10;p++;

    *p=20;p=&numere[2];*p=30;p=numere + 3;

    *p=40;p=numere;

    *(p+4)=50;for(n=0; n Exemplu 4 (cont.)

    int numere[5], n;int *p;p=numere;

    *p=10;p++;

    *p=20;p=&numere[2];*p=30;p=numere + 3;

    *p=40;p=numere;

    *(p+4)=50;for(n=0; n n general, n limbajul C, parametrii unei funcii sunt transmiiprin valoare.

    funcia apelat primete o copie a variabilei, adic valoareavariabilei copiat la o alt adres de memorie dect ceaa variabilei originale

    > Exemplu:

    void schimba(int a, int b);

    variabilele a i b sunt transmiseprin valorile acestora, deci nuvor fi modificate de funcie.

    > O alt modalitate de transmitere a parametrilor este prinreferin sau adres.

    funcia apelat primete o copie a adresei variabilei ceconine parametrul efectiv (un pointer).

    24Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 23/66

    Pointeri i funcii (continuare)

    > Exemplu:

    void schimba(int *pa, int *pb);

    funcia primete dou valori deadrese ce corespund locaiilorla care se afl variabilele cevrem s le modificm.

    void schimba(int *pa, int *pb){

    int tmp;tmp=*pa;*pa=*pb;*pb=tmp;

    }

    funcia interschimb valorile adou variabile de tip intreg.

    tmp preia coninutul locaiei dememorie indicat de pa (*pa),

    coninutul lui pa (*pa) preiaconinutul lui pb (*pb),

    coninutul lui pb (*pb) iavaloarea tmp.

    > Detaliu funcie:

  • 8/8/2019 Programarea Calculatoarelor M8

    5/12

    adr.pa adr.pb

    pa pb

    1.

    adr.a adr.b

    a b

    int main()

    {int a=3, b=6;schimba( );

    }

    25Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 24/66

    Pointeri i funcii (continuare) void schimba(int *pa, int *pb){

    int tmp;tmp=*pa;*pa=*pb;*pb=tmp;

    }

    adr.a adr.b

    > Cum apelm funcia din

    programul principal ?

    &a, &b > S vedem ce se ntmpl n

    memorie ?

    3 6

    adr.pa adr.pb

    pa pb

    3.

    adr.a adr.b

    a b

    adr.tmp

    tmp

    adr.pa adr.pb

    pa pb

    2.

    adr.a adr.b

    a b

    adr.tmp

    tmp

    26Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 25/66

    Pointeri i funcii (continuare) void schimba(int *pa, int *pb){

    int tmp;tmp=*pa;*pa=*pb;*pb=tmp;

    }

    adr.a adr.b

    int main(){int a=3, b=6;schimba( );

    }

    &a, &b

    3 6 ???

    adr.a adr.b3 6 3

    adr.pa adr.pb

    pa pb

    5.

    adr.a adr.b

    a b

    adr.tmp

    tmp

    adr.pa adr.pb

    pa pb

    4.

    adr.a adr.b

    a b

    adr.tmp

    tmp

    27Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 26/66

    Pointeri i funcii (continuare) void schimba(int *pa, int *pb){

    int tmp;tmp=*pa;*pa=*pb;*pb=tmp;

    }

    adr.a adr.b

    int main(){

    int a=3, b=6;schimba( );

    }&a, &b

    6 6 3

    adr.a adr.b6 3 3

    28Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 27/66

    8.2. Lucrul cu fiiere de date

    29Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 28/66

    Fiiere de date

    > Datele folosite la un moment dat, n timpul execuiei unuiprogram sunt stocate temporarn memoria intern (ex. RAM);

    > Datele ce sunt pstrate pe termen lung sunt stocate

    permanentn memoria extern (ex. HDD);

    informaie brut

    00010100101100011010111111000100111101100001111111

    program: Windows 7 Explorer

    preluate n memoria RAM cnd sunt folosite;

    computer management Windows XP

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 29/66

    Fiiere de date (continuare)

    Pentru a putea accesa informaia de pe dispozitivele externede stocare aceasta trebuie indexat sau organizat;

    A. unitile fizice sunt mprite (opional) la nivel logic (nu fizic)

    n partiii ce sunt desemnate prin litere, ex. C:, D:, F: etc.

    Disc-0

    Disc-1

    C:29.29GB

    D:119.75GB

    G:960MB

    H:1.95GB

    Disc-2

  • 8/8/2019 Programarea Calculatoarelor M8

    6/12

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 30/66

    Fiiere de date (continuare)

    Pentru a putea accesa informaia de pe dispozitivele externede stocare aceasta trebuie indexat sau organizat;

    B. informaia stocat pe fiecare unitate logic (partiie) este

    organizat ierarhic (arborescent):

    nivelul rdcinROOT

    C:29.29GB

    fiiere = colecii de date stocateunitar i identificate prin:.

    .txt .doc .pdf .bmp .cpp .mpg

    identificatoralfanumeric

    ~3 litere ce descriutipul coninutului;

    ------------------------

    ...

    ------------.exe

    .com

    .bat

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 31/66

    Fiiere de date (continuare)

    Pentru a putea accesa informaia de pe dispozitivele externede stocare aceasta trebuie indexat sau organizat;

    B. informaia stocat pe fiecare unitate logic (partiie) este

    organizat ierarhic (arborescent):

    nivelul rdcinROOT

    C:29.29GB

    ------------

    ------------

    ------------windowswindows

    directoare = colecii de fiiere i/saudirectoare (sunt identificate prin nume)

    ------------...

    ...

    nivelul 3

    ------------

    ------------myimgmyimg

    ------------

    ------------myvideomyvideo

    ------------

    ------------

    ------------mydocmydoc

    ...

    ...

    nivelul 1 nivelul 2 nivelul N

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 32/66

    Fiiere de date (continuare)

    > Exemplu:

    partiii (C:,D:, E: ...)

    directoare,ex.

    WINDOWS

    sub-directoare,ex. system

    fiiere, ex.explorer.exe

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 33/66

    Fiiere de date (continuare)

    > Cum facem referire la un anumit fiier dintr-un anumit director,de exemplu fiierul explorer.exe ?

    definim calea ctreacesta (path):

    c:\windows\explorer.exe

    > / marcheaz con.directorului curent;

    E:\

    windows\

    explorer.exe

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 34/66

    Manipularea fiierelor n C

    > Citirea - scrierea datelor n fiiere reprezint de fapt operaiide intrare (datele sunt preluate din fiier = input) ieire (datelesunt stocate pe HDD = output);

    > Uneori este avantajos s prelum datele direct dintr-un fiier,astfel nefiind necesar intervenia utilizatorului:

    volum mare de date de intrare;

    datele de intrare sunt aceleai la fiecare rulare (ex. teste);

    datele de intrare sunt furnizate de un alt programindependent de utilizator ...

    > Similar, datele de ieire ale programului pot fi stocate:

    rmn disponibile dup ncheierea programului;

    pot fi folosite ca date de intrare pentru alt program ...

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 35/66

    Manipularea fiierelor n C (continuare)

    > Limbajul de programare C pune la dispoziia programatoruluiurmtoarele operaii de lucru cu fiiere de date:

    - crearea i denumirea fiierelor;

    - deschiderea unui fiier pentru manipulare date;

    - scrierea datelor ntr-un fiier (creare fiier nou sauadugare de date la un fiier existent);

    - citirea coninutului unui fiier (secvenial, aleator);

    - nchiderea fiierului;

    > funciile se gsesc n biblioteca stdio.h

  • 8/8/2019 Programarea Calculatoarelor M8

    7/12

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 36/66

    Manipularea fiierelor n C (continuare)

    > Un f iier este refereniat printr-o variabil pointer:

    FILE *fisier1;FILE *fisier2;

    fisier1 este un pointer la o structur de tipfiier de date,fisier2 este un alt pointer la o structur detip fiier de date.

    > Ca i n cazul pointerilor, fiierele trebuie iniializate i anumele trebuie asociat un fiier fizic de pe dispozitivul de stocare:

    FILE *fopen(const char*nume_fisier, const char*mod);

    returneaz unpointer la fiier.

    se specific modulde deschidere alfiierului

    se specific numelefiierului i caleaacestuia.

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 37/66

    Manipularea fiierelor n C (continuare)

    modul de deschidere al fiierului:

    FILE *fopen(const char*nume_fisier, const char*mod);

    - r (read only) permite deschiderea unui fiier doarpentru a fi citit coninutul acestuia,

    - w (write) creaz un fiier gol n care se pot scrie date.Dac fiierul cu acest nume exist deja, coninutul acestuiaeste ters!

    - a (append) deschide fiierul menionat pentru aaduga date n continuarea celor existente. Dac fiierul nuexist acesta este creat.

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 38/66

    Manipularea fiierelor n C (continuare)

    modul de deschidere al fiierului (continuare):

    FILE *fopen(const char*nume_fisier, const char*mod);

    - r+ deschide un fiier pentru actualizarea datelor,permind att scriere ct i citire,

    - w+ creaz un fiier nou n care se vor putea scrie cti citi date. Dac exist un fiier cu acelai nume atunciconinutul acestuia este ters.

    - a+ deschide un fiier pentru adugare de date ct ipentru citire. Toate operaiile de scriere vor fi efectuateexclusiv n continuarea datelor existente (protejare coninutiniial). Dac fiierul nu exist atunci va fi creat.

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 39/66

    Manipularea fiierelor n C (continuare)

    > Exemplul 1:

    FILE *fisier;fisier=fopen(c:\\test.txt, w);

    - fisiereste un pointer la unobiect de tip FILE,

    > Observaie: modurile de deschidere enunate anterior serefer la fiiere de tip text (coninut alfanumeric), pentru fiierebinare se adaug caracterul b;

    - se creaz fiierul test.txtla locaia specificat, ianume pe partiia c:(director rdcin) i sereturneaz controlul pentruscriere la pointerul fisier.

    De ce apare \\ ?

    backslash este un caracterspecial, comanda \ + \ = \ !

    if(fisier==NULL)printf(Fisierul nu a putut fi creat);

    dac pointerul este nul(nu indic nimic) problem la deschidere!

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 40/66

    Manipularea fiierelor n C (continuare)

    > Exemplul 2:

    FILE *fisier;fisier=fopen(c:\\Demo\\Tmp\\test.txt, w);

    unde este creat fiierul ?

    c:\Demo\Tmp\test.txt> Exemplul 3:

    FILE *fisier;fisier=fopen(test.txt, w);

    dar acum ?

    n directorul curent

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 41/66

    Manipularea fiierelor n C (continuare)

    > Dup folosire un fiier trebuie nchis (eliberare flux de date):

    int *fclose(FILE *fisier); - nchide fluxul de date deservitde pointerul fiier,- dac operaia este reuit sereturneaz codul 0.

    > Exemplu complet:

    FILE *fisier;

    fisier=fopen(c:\\proba\\test.txt, w);if(fisier==NULL)printf(Fisierul nu a putut fi creat);

    else{ ... fclose(fisier); }

  • 8/8/2019 Programarea Calculatoarelor M8

    8/12

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 42/66

    Manipularea fiierelor n C (continuare)

    > Scrierea datelor n fiier:

    > Funcia fprintffuncioneaz identic ca funcia printfdoar cdatele nu sunt afiate pe ecran, ci salvate ntr-un fiier text;

    intintintint fprintf(FILE *fisier, const char*format, a, b, 15, ... );

    format (ir de caractere)specific modul deafiare (formatare) ct itipul datelor afiate

    dup , se specificvariabilele sau

    constanteleanunate n format.

    fisierestepointerul cerefereniazconinutulfiierului

    > Fiierul text poate fi vzut ca o imagine a datelor de pe ecran(acestea sunt salvate identic, pstrnd modul de formatare);

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 43/66

    Manipularea fiierelor n C (continuare)

    > Exemplul 1:

    FILE *fisier;int v=20; float i=1.8; charnume[20], prenume[20];

    printf(Nume=); scanf(%s,nume);printf(Prenume=); scanf(%s,prenume);

    fisier=fopen(c:\\test.txt, w);fprintf(fisier, #Date personale#\n);fprintf(fisier, Nume=%s\n,nume);fprintf(fisier, Prenume=%s\n,prenume);fprintf(fisier, Varsta=%d\n,v);fprintf(fisier, Inaltime=%.2f\n,i);fprintf(fisier, #sfarsit#);fclose(fisier);

    c:\> Nume=Vlad (enter)Prenume=Ionescu (enter)

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 44/66

    Manipularea fiierelor n C (continuare)

    > Exemplul 2:

    FILE *fisier;int matrice[20][20], dim, i, j;

    printf(Dim=); scanf(%d,&dim);CitireMatrice(matrice, dim); // functie definita anterior

    fisier=fopen(c:\\test.txt, w);fprintf(fisier, %d\n, dim);

    for(i=0

    ;i Exemplul 3:

    FILE *fpar, *fimpar;int vect[100], dim, i;

    printf(Dim=); scanf(%d,&dim);for(i=0; i Exemplul 3: continuare

    FILE *fpar, *fimpar;int vect[100], dim, i;// citire vector// scriere vector in fisierfpar=fopen(c:\\par.txt, a);fimpar=fopen(c:\\impar.txt, a);

    fprintf(fpar,-sfarsit-);fprintf(fimpar,-sfarsit-);

    fclose(fpar);fclose(fimpar);

    - am deschis fiierele de date nmodul de adugare de informaii(append) ???- fiierele par.txt i impar.txt nuexist vor fi create.

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 47/66

    Manipularea fiierelor n C (continuare)

    > Exemplul 3: corect

    FILE *fpar, *fimpar;int vect[100], dim, i;// citire vector// scriere vector in fisierfpar=fopen(c:\\pare.txt, a);fimpar=fopen(c:\\impare.txt, a);

    fprintf(fpar,-sfarsit-);fprintf(fimpar,-sfarsit-);

    fclose(fpar);fclose(fimpar);

    - fiind n modul de adugare,textul va fi scris n continuareadatelor existente deja n fiier.

  • 8/8/2019 Programarea Calculatoarelor M8

    9/12

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 48/66

    Manipularea fiierelor n C (continuare)

    PEnun: S se defineasc o structur de date ce permitestocarea urmtoarelor informaii relative la o persoan:nume, prenume, vrst, adres, telefon, email. S serealizeze o funcie ce permite citirea acestor date pentruelevii unei clase de liceu. S se exporte datele obinutentr-un fiier denumit astfel: DateEleviClasa_.txt,unde va fi specificat de utilizator.

    Variabile de intrare/lucru:

    struct elev;Variabile de ieire:

    FILE *fisier;

    int NrElevi, i;charnumec[10];

    > Scrierea datelor n fiiere:

    struct elev clasa[40]; Funcii:CitireDateClasa;ExportDateFisier;

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 49/66

    Manipularea fiierelor n C (continuare)

    #include #include #include // biblioteca de lucru cu siruri de caractere

    struct elev{charnume[100], prenume[100], adresa[200], telefon[14], email[100];int varsta;

    } clasa[40];

    void CitireDateClasa(struct elev clasa[40], int NrElevi);void ExportDateFisier(FILE *fisier, charnumefisier[20],

    struct elev clasa[40], charnumec[10], int NrElevi);int main(){int i, NrElevi;charnumec[10], numefisier[100];FILE *fisier;

    printf("Date de intrare\nNumar elevi="); scanf("%d",&NrElevi);printf("Numele clasei="); scanf("%s",numec); continuare

    > Programul principal:

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 50/66

    Manipularea fiierelor n C (continuare)

    continuare

    int main(){

    // citire date eleviCitireDateClasa(clasa, NrElevi);

    // generare nume fisier care sa contina numele clasei// c:\+DateEleviClasa_++.txt

    strcpy(numefisier,"c:\\DateEleviClasa_");strcat(numefisier,numec);strcat(numefisier,".txt");

    // exportare date clasa in fisierul denumit numefisierExportDateFisier(fisier, numefisier, c lasa, numec, NrElevi);

    }

    > Programul principal (continuare):

    - copiaz irul de caractere dindreapta n variabila ir decaractere din stnga (numefisier);

    - concateneaz dou iruri decaractere i le stocheaz nvariabila din stnga (numefisier);

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 51/66

    Manipularea fiierelor n C (continuare)

    void CitireDateClasa(struct elev clasa[40], int NrElevi){int i;

    for(i=0; i Funcia CitireDateClasa:

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 52/66

    Manipularea fiierelor n C (continuare)

    void ExportDateFisier(FILE *fisier, charnumefisier[20], struct elev clasa[40],charnumec[10], int NrElevi)

    {int i;fisier=fopen(numefisier,"w");

    if(fisier==NULL) { printf("Eroare, fisierul nu a putut fi creat!"); return; }else{

    fprintf(fisier, "#Date elevi clasa %s\n", numec);fprintf(fisier, "Numar total elevi %d\n", NrElevi);for(i=0; i Funcia ExportDateFisier:

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 53/66

    Manipularea fiierelor n C (continuare)

    > Citirea datelor dintr-un fiier:

    > Funcia fscanffuncioneaz identic ca funcia scanfdoar cdispozitivul de intrare nu este tastatura ci fiierul de date;

    intintintint fscanf(FILE *fisier, const char*format, &a, &b, ... );

    format (ir de caractere)specific tipul datelor cevor fi citite din fiier.

    dup , se specificunde vor fi stocate

    datele citite (adresede memorie).

    fisierestepointerul cerefereniazconinutulfiierului

    > Funcia fscanfreturneaz fie numrul de obiecte citite corect(variabile) sau n cazul n care datele nu pot fi citite returneazEOF (= sfrit de fiier).

  • 8/8/2019 Programarea Calculatoarelor M8

    10/12

    > Exemplul 1: avem la dispoziie fiierul

    FILE *fisier;charlinie[256];

    int stop;fisier= fopen(c:\\test.txt,r);do{stop=fscanf(fisier,%s,linie);if(stop!=EOF)printf(am citit:%s\n,linie);

    } while (stop!=EOF);fclose(fisier);

    - se citete progresiv cte unir de caractere pn cndfuncia fscanfreturneaz EOF(ajunge la captul fiierului).- pe msur ce se citesc date,poziia curent n fiier semodific;

    c:\>am citit:#DatePersonale#

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 54/66

    Manipularea fiierelor n C (continuare)

    - se deschide fiierul de datedorit n modul de citire (read);

    am citit:Nume=Vladam citit:Prenume=Ionescuam citit:Varsta=20am citit:Inaltime=1.80

    EOF

    am citit:#sfarsit#

    > Exemplul 2: avem la dispoziie fiierul

    FILE *fisier;charlinie[256];

    int stop;fisier= fopen(c:\\test.txt,r);do{stop=fscanf(fisier,%s,linie);if(stop!=EOF)printf(am citit:%s\n,linie);

    } while (stop!=EOF);fclose(fisier);

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 55/66

    Manipularea fiierelor n C (continuare)

    - cum este citit textul n acestcaz ? (indicaie: analogie citireiruri de caractere cu scanf)

    c:\>am citit:#Date

    EOF

    am citit:Personale#am citit:Nume=Vladam citit:Prenume=Ionescuam citit:Varsta=20...

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 56/66

    Manipularea fiierelor n C (continuare)

    > Pentru a citi fiierul ca un ir de caractere avem nevoie de uncontrol mai fin a ceea ce citim:

    > Funcia fgetc returneaz caracterul din poziia curent la carese citete din fiier, iar dup aceasta avanseaz automat cu uncaracter (efect similar funciei getc).

    intintintint fgetc(FILE *fisier); fisiereste pointerul cerefereniaz coninutul fiierului

    > Avem la dispoziie fiierul text urmtor:

    > textul de fapt arat aa:

    124\nSa se citeasca acesttext linie cu linie.\nAceastaeste linia 2 urmata\nde linia3 si asa mai departe.EOF

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 57/66

    Manipularea fiierelor n C (continuare)

    > Exemplul 3: vom citi progresiv caractere de la inceputulfiierului pn cnd ntlnim EOF:

    FILE *fisier; charc, linie[256]; int pos=0;

    fisier=fopen(c:\\test.txt,r);

    do{ c=fgetc(fisier);

    if((c!='\n') && (c!=EOF))linie[pos++]=c;

    else

    { linie[pos]='\0';printf(%s\n,linie);pos=0; }

    } while (c!=EOF);

    fclose(fisier);

    - linie stocheaz la unmoment dat o linie din fiier;-pos va memora poziiacurent n linie;

    - citim din fiier un caractercct timp nuam ajuns la captul fiierului;

    - dac cnu este sfrit de linie i nici de

    fiier atunci il adugm la line pepos;- dac ceste sfrit de linie sau de fiieratunci nseamn c am obinut o liniecomplet afim pe ecan;

    FILE *fisier; charc, linie[256]; int pos=0;

    fisier=fopen(c:\\test.txt,r);

    do{ c=fgetc(fisier);

    if((c!='\n') && (c!=EOF))linie[pos++]=c;

    else{ linie[pos]='\0';

    printf(%s\n,linie);pos=0; }

    } while (c!=EOF);

    fclose(fisier);

    iteraia 1: c=1, linie=1

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 58/66

    Manipularea fiierelor n C (continuare)

    > Cum se execut:

    iteraia 7: c= , linie=Sa iteraia 8: c=s, linie=Sa s

    iteraia 2: c=2, linie=12iteraia 3: c=4, linie=124iteraia 4: c=\n, linie=124\0iteraia 5: c=S, linie=Siteraia 6: c=a, linie=Sa

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 59/66

    Manipularea fiierelor n C (continuare)

    FILE *fisier; charc, linie[256]; int pos=0;

    fisier=fopen(c:\\test.txt,r);

    do{ c=fgetc(fisier);

    if((c!='\n') && (c!=EOF))linie[pos++]=c;

    else{ linie[pos]='\0';

    printf(%s\n,linie);pos=0; }

    } while (c!=EOF);

    fclose(fisier);

    > Dup citirea linie cu line vrem s citim numrul de la nceputulfiierului, astfel:

    - n urma citirii pas cu pas nacest punct poziionarea n fiiereste pe EOF; modalitate de derulare la

    nceput a fiierului ?

  • 8/8/2019 Programarea Calculatoarelor M8

    11/12

    Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 60/66

    Manipularea fiierelor n C (continuare)

    FILE *fisier;charc, linie[256]; int pos=0;...// codul anterior de citire pas cu pasrewind(fisier);fscanf(fisier,%d,&pos);printf(Numarul este %d,pos);fclose(fisier);

    > Funcia rewind permite poziionarea n fiierul curent la

    nceputul acestuia.

    void rewind(FILE *fisier); fisiereste pointerul la fiier

    c:\> 124Sa se citeasca acest si asa mai departe.Numarul este 124

    > Exemplul 4: se citeasc valorile unei matrice ptraticede numere ntregi dintr-un fiier de date. Pe prima linie estestocat numrul de elemente.

    FILE *fisier;int dim, matrice[100][100], i, j;

    fisier= fopen(c:\\test.txt,r);fscanf(fisier,%d, &dim);

    for(i=0;i

  • 8/8/2019 Programarea Calculatoarelor M8

    12/12

    67Curs Programarea C alculatoarelor, .l. Bogdan I ONESCU, 2010-2011 66/66

    Sfritul Cursului 8