CATEGORII DOCUMENTE |
Deschiderea unui fisier
Orice fisier inainte de a fi prelucrat trebuie deschis, motiv pentru care operatia de deschidere a unui fisier este de mare importanta. Deschiderea unui fisier existent se realizeaza prin intermediul functiei _open. La revenirea din ea se returneaza un asa numit descriptor de fisier. Acesta este un numar intreg. El identifica in continuare fisierul respectiv in toate operatiile realizate asupra lui.
In forma cea mai simpla functia _open se apeleaza printr-o expresie de atribuire de forma:
df = _open(spf,mod)
unde:
df - este un numar intreg care reprezinta descriptorul de fisier
spf - este specificatorul fisierului care se deschide
mod - defineste modul de prelucrare a fisierului
Specificatorul de fisier este fie un sir de caractere, fie un pointer spre un astfel de sir de caractere. Continutul sirului de caractere depinde de sistemul de operare folosit. In cea mai simpla forma el este un nume sau mai general o cale care indica plasamentul pe disc al fisierului care se opereaza. Fisierele deschise la acest nivel pot fi prelucrate in citire (consultare), scriere (adaugare de inregistrari) sau citire/scriere (actualizare sau punere la zi).
Calea spre fisier trebuie sa respecte conventiile sistemului de operare MS-DOS in general. In cea mai simpla forma ea este un sir de caractere care defineste numele fisierului, urmat de extensia fisierului. Aceasta presupune ca fisierul se gaseste in directorul curent. Daca fisierul nu se afla in fisierul curent, atunci numele este precedat de o constructie de forma:
litera:nume_1nume_2.nume_k
unde:
litera - defineste discul (in general A, B pentru floppy-disk si C, D,.. pentru hard-disk)
nume_i - este un nume de subdirector.
Deoarece calea se include intre ghilimele, caracterul '' se dubleaza. Spre exemplu, putem folosi o comanda de deschidere de forma:
int d;
d=_open("A:JOCBIO.C",O_RDWR);
caz in care fisierul BIO.C din directorul JOC de pe dscheta A se deschide in citire/scriere.
In functie de operatia dorita, mod poate avea valorile:
0 - pentru citire
1 - pentru scriere
2 - pentru citire/scriere
Deschiderea unui fisier nu reuseste daca unul dintre parametri este eronat. In acest caz functia _open returneaza valoarea (-1).
int _open( const char *filename, int oflag [, int pmode] );
este definitia generala a functiei _open.
Modul de acces mod se poate furniza in mod explicit printr-o variabila de tip intreg (oflag) care poate avea valorile:
Variabila mod |
Modul de deschidere a fisierului |
_O_RDONLY |
Fisierul se deschide numai in citire (read-only) Nu se poate specifica impreuna cu _O_RDWR sau _O_WRONLY |
_O_WRONLY |
Fisierul se deschide numai in scriere (write-only) Nu se poate specifica impreuna cu _O_RDWR sau _O_RDONLY |
_O_RDWR |
Fisierul se deschide in citire/scriere (read/write) |
_O_APPEND |
Fisierul se deschide pentru adaugarea de inregistrari la sfarsitul sau. |
_O_CREAT |
Creaza si deschide un nou fisier pentru scriere. Nu are nici un efect daca fisierul este deja existent. |
_O_BINARY |
Fisierul se prelucreaza in mod binar |
_O_TEXT |
Fisierul este de tip text, adica se prelucreaza pe caractere sau octeti (implicit) |
Mentionam ca in MSDN aceste variabile se mai numesc si oflag (open-flag) si sunt definite in fisierul header FCNTL.H.
In cazul in care oflag este _O_CREAT, atunci este necesara specificarea constantelor optionale pmode, care se gasesc definite in SYSSTAT.H. Acestea sunt:
_S_IREAD - este permisa numai citirea fisierului
_S_IWRITE - este permisa si citirea (permite efectiv citirea/scrierea fisierului)
_S_IREAD | _S_IWRITE - este permisa si scrierea si citirea fisierului.
Argumentul pmode este cerut numai cand se specifica _O_CREAT. Daca fisierul exista deja, pmode este ignorat. Altcumva, pmode specifica setarile de permisiune asupra fiserului care sunt activate cand fisierul este inchis pentru prima oara.
_open aplica masca curenta de permisiune la fisier inainte de setarea accesului la fisier.
Pentru a crea un fisier nou se va utiliza functia _creat pentru a-l deschide. De fapt se deschide prin creare un fisier inexistent. Functia este definita astfel:
int _creat( const char *filename, int pmode );
in care parametrii au fost descrisi mai sus.
Protectia unui fisier este dependenta de sistemul de operare. Spre exemplu, in UNIX protectia se defineste prin 9 biti atasati oricarui fisier, grupati in 3 grupe de cate 3 biti. Fiecare bit controleaza o operatie de citire, scriere, executie. Protectia operatiilor se exprima fata de proprietar, grup sau oricine altcineva. Numarul octal 0751 permite proprietarului toate cele 3 operatii indicate mai sus (7 = 1112), grupul la care apartine proprietarul poate citi si executa fisierul (5 = 1012) iar alti utilizatori pot numai executa fisierul (1 = 0012). Functia _creat poate fi apelata si in cazul in care se deschide un fisier deja existent, caz in care se pierde continutul vechi al fisierului respectiv si se creaza in locul lui unul nou cu acelasi nume.
Fiecare din functiile _open sau _creat returneaza un specificator de fisier (handle) pentru fisierul deschis. Acest specificator este o valoare intreaga pozitiva. Implicit, stdin are specificatorul 0, stdout si stderr au specificatorii 1 respectiv 2 iar fisierele disc care sunt deschise primesc pe rand valorile 3, 4,..etc. pana la numarul maxim admis de fisiere deschise.
Valoarea returnata -1 indica o eroare de deschidere, in care caz variabila errno este setata la una din valorile:
EACCES - (valoare 13) s-a incercat deschiderea pentru scriere a unui fisier read-only sau modul de partajare a fisierului nu permite operatia specificata sau calea nu specifica un nume de fisier ci de director.
EEXIST - (valoare 17) flagurile _O_CREAT si _O_EXCL sunt specificate, dar numele de fisier este al unui fisier deja existent.
EINVAL - (valoare 22) unul dintre argumentele oflag sau pmode sunt invalide.
EMFILE - (valoare 24) nu mai sunt disponibile specificatoare de fisier (prea multe fisiere deschise).
ENOENT - (valoare 2) fisierul sau calea nu au fost gasite.
Variabila globala errno pastreaza codurile de eroare folosite de functiile perror (print error) sau strerror (string error) pentru tratarea erorilor. Constantele manifest pentru aceste variabile sunt declarate in STDLIB.H dupa cum urmeaza:
extern int _doserrno;
extern int errno;
errno este setata de o eroare intr-un apel de functie la nivel de sistem (la nivelul inferior). Deoarece errno pastreaza valoarea setata de ultimul apel, aceasta valoare se poate modifica la fiecare apel de functie sistem. Din aceasta cauza errno trebuie verificata imediat inainte si dupa un apel care poate s-o modifice. Toate valorile errno, definite drept constante manifest in ERRNO.H, sunt compatibile UNIX. Valorile valide pentru aplicatiile Windows pe 32 de biti sunt un subset al acestor valori UNIX. Valorile specificate mai sus sunt valabile pentru aplicatii Windows pe 32 de biti.
La o eroare, errno nu este setata in mod necesar la aceeasi valoare cu codul erorii de sistem. Numai pentru operatii de I/O se foloseste _doserrno pentru a accesa codul erorilor sistemului de operare echivalent cu codurile semnalate de errno. Exemplu:
Acest program foloseste _open pentru a deschide un fisier numit OPEN.C pentru citire si un fisier numit OPEN.OUT scriere. Apoi fisierele sunt inchise
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <stdio.h>
void main( void )
fh2=_open('OPEN.OUT',_O_WRONLY|_O_CREAT,_S_IREAD|_S_IWRITE);
if( fh2 == -1 )
perror( 'Open failed on output file' );
else
Prin executia acestui program se vor obtine urmatoarele mesaje pe display:
open failed on input file: No such file or directory
Open succeeded on output file
Press any key to continue
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1344
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved