Laborator 9 - Suport teoretic

Operatii cu fisiere text

Operatii cu fisiere text

Un fisier reprezinta o secventa de octeti. Pentru a citi dintr-un fisier sau pentru a scrie intr-un fisier, e nevoie de 3 pasi:
  1. Deschiderea fisierului, care poate consta in:
    • Deschiderea unui fisier existent
    • Crearea unui fisier nou
  2. Efectuarea operatiilor de scriere si/sau citire
  3. Inchiderea fisierului.

Deschiderea unui fisier

Pentru deschiderea unui fisier existent sau crearea unui fisier nou, se foloseste functia fopen

Sintaxa functiei

fopen in limbaj de programare de nivel inalt este:
FILE * fopen(const char* nume_fisier, const char * mod_acces)
Functia fopen respecta conventia cdecl si se gaseste in msvcrt.dll .

Argumentele functiei fopen:

Primul argument al functiei este adresa unui sir de caractere reprezentand numele fisierului: Al doilea argument este adresa unui sir de caractere, reprezentand modalitatea in care se va deschide fisierul.
Mod Semnificatie Descriere
r citire (read) -    Deschide un fisier text pentru citire. Fisierul trebuie sa existe deja pe disc.
w scriere (write) -    Daca nu exista un fisier cu acel nume, creaza fisierul si il deschide pentru scriere.
-    Daca un fisier cu acel nume exista deja, deschide acel fisier pentru scriere. Continutul initial va fi sters. Scrierea se va face de la inceputul fisierului.
a adaugare (append) -    Daca nu exista un fisier cu acel nume, creaza fisierul si il deschide pentru scriere.
-    Daca un fisier cu acel nume exista deja, deschide acel fisier pentru scriere, dar scrierea se va face la sfarsitul fisierului, in continuarea continutului existent. Continutul initial al fisierului va fi pastrat.
r+ citire si scriere fisier existent -    Deschide un fisier text pentru citire si scriere. Fisierul trebuie sa existe deja pe disc.
w+ citire si scriere -    Daca nu exista un fisier cu acel nume, creaza fisierul si il deschide pentru citire si scriere.
-    Daca un fisier cu acel nume exista deja, deschide acel fisier pentru citire si scriere. Continutul initial va fi sters. Scrierea se va face de la inceputul fisierului.
a+ citire si adaugare -    Daca nu exista un fisier cu acel nume, creaza fisierul si il deschide pentru citire si scriere.
-    Daca un fisier cu acel nume exista deja, deschide acel fisier pentru citire si scriere. Continutul initial al fisierului va fi pastrat. Citirea se va face de la inceputul fisierului. Scrierea se va face in continuarea continutului existent.

Observatii:

  • Numele unui fisier trebuie sa includa si extensia (ex: nume.txt, exemplu.asm).
  • Fisierele se vor crea sau deschide din directorul curent (in acelasi director in care se afla fisierul sursa asm). Important: pentru a putea deschide un fisier existent folosind numele acestuia, fisierul trebuie sa se afle in acelasi director cu fisierul sursa .asm, altfel acesta nu va fi gasit.
  • Operatiile de scriere nu vor reusi pentru fisiere deschise doar cu drepturi de citire (ex: ”r”). Operatiile de citire nu vor reusi pentru fisiere deschise doar cu drepturi de scriere sau adaugare (ex: ”w”, ”a”)
  • Ambele argumente ale functiei fopen reprezinta siruri de caractere care trebuie sa se termine cu valoarea 0 (asemenea formatului pentru functia printf).

Valoarea returnata de functia fopen:

Daca fisierul este deschis cu succes, functia fopen va completa in registrul EAX un identificator (descriptor de fisier) care va fi folosit in continuare pentru a lucra cu acel fisier (pentru operatii de scriere, citire, etc.). Altfel (in caz de eroare), functia fopen va completa in registrul EAX valoarea 0.

Alte observatii:

Este important sa se verifice valoarea returnata de functie in EAX (daca nu a fost eroare), inainte de a efectua alte operatii cu acel fisier. Daca in cadrul unui program se deschid mai multe fisiere diferite folosind functia fopen, fiecare valoare returnata de functiei trebuie salvata separat, deoarece reprezinta o valoare distincta prin care este identificat un fisier. Dupa finalizarea lucrului cu un fisier deschis, este important sa se si inchida acel fisier (de obicei se face la finalul programului – inainte de exit). Pentru a inchide un fisier (deschis in prealabil de functia fopen) se foloseste functia fclose.

Scrierea intr-un fisier

Pentru a scrie un text intr-un fisier se foloseste functia fprintf.

Sintaxa functiei

fprintf in limbaj de programare de nivel inalt este:
int fprintf(FILE * stream, const char * format, <variabila_1>, <constanta_2>, <...>)
Functia fprintf respecta conventia cdecl si se gaseste in msvcrt.dll . Sintaxa functiei fprintf este asemantoare cu sintaxa functiei printf (folosita pentru afisare in consola). Diferenta este faptul ca functia fprintf are ca prim parametru identificatorul fisierului in care se va scrie textul, in plus fata de parametrii functiei printf.

Argumentele functiei fprintf

Primul argument al functiei reprezinta descriptorul de fisier (identificatorul) returnat de apelul functiei fopen. Urmatorul argument al functiei este un sir de caractere ce contine formatul afisarii, urmat de un numar de argumente (valori constante sau nume de variabile) egal cu cel specificat in cadrul formatului. Asemenea functiei printf, sirul de caractere transmis in parametrul format poate contine anumite marcaje de formatare, ce incep cu caracterul ’%’, care vor fi inlocuite de valorile specificate in urmatoarele argumente, formatate corespunzator.
Specificator Ce se afiseaza Exemplu Dimensiune reprezentare valoare
c Caracter a byte
d sau i Intreg zecimal cu semn 392 dword
u Intreg zecimal fara semn 7235 dword
x Numar in hexazecimal fara semn 7fa dword
s String (sir de caractere, terminat cu 0) exemplu sir de bytes terminat in 0

Citirea dintr-un fisier

Pentru a citi un text dintr-un fisier se foloseste functia fread.

Sintaxa functiei

fread in limbaj de programare de nivel inalt este:
int fread(void * str, int size, int count, FILE * stream)
Functia fread respecta conventia cdecl si se gaseste in msvcrt.dll .

Argumentele functiei fread

Primul argument al functiei fread reprezinta adresa unui sir de elemente in care se vor completa datele citite din fisier. Al doilea argument reprezinta dimensiunea unui element care va fi citit din fisier. Al treilea argument reprezinta numarul maxim de elemente care se vor citi din fisier. Ultimul argument al functiei reprezinta descriptorul de fisier (identificatorul) returnat de apelul functiei fopen. In cazul citirii fisierelor text, primul argument al functiei fread este un sir de bytes si al doilea argument este 1 (=dimensiunea unui byte). Al treilea argument este dimensiunea sirului de bytes (numarul de elemente).

Valoarea returnata de functia fread:

Functia fread va completa in registrul EAX numarul de elemente citite. Daca acest numar este mai mic decat valoarea argumentului count, atunci fie apelul functiei fread a intampinat o eroare la citire, fie s-a ajuns la finalul fisierului.

Observatii:

Fisierele text pot fi avea dimensiuni prea mari pentru putea citi continutul acestora cu un singur apel al functiei fread. In acest caz este nevoie de apeluri repetate ale functiei fread, pana cand intreg continutul fisierului este citit. In sectiunea „Exemple” vom prezenta un program care exemplifica acest scenariu. Pentru a verifica daca s-a ajuns la finalul fisierului cu operatia de citire se poate verifica daca valoarea returnata de fread este 0.

Inchiderea unui fisier deschis

Dupa finalizarea lucrului cu un fisier deschis, acesta trebuie inchis. Acest pas nu trebuie sa lipseasca dintr-un program care a deschis fisiere. Pentru inchiderea unui fisier se foloseste functia fclose.

Sintaxa functiei

fclose in limbaj de programare de nivel inalt este:
int fclose(FILE * descriptor)
Functia fclose respecta conventia cdecl si se gaseste in msvcrt.dll .

Argumentul functiei fclose

Argumentul functiei fclose este descriptorul de fisier (identificatorul) returnal de apelul functiei fopen.