» Utilizator
Salut, vizitatorule!

SkullBox este o comunitate formata din programatori si administratori de sisteme sau retele care iti sta la dispozitie cand ai o problema legata de calculatoare. Daca esti un utilizator existent, autentifica-te.

Daca nu te-ai inregistrat inca pe forum, alatura-te noua astfel marind comunitatea si ajutandu-i pe cei care au nevoie de informatii.

Daca te-ai inregistrat dar inca nu ai primit codul de activare, il poti cere aici.




Autentifica-te cu numele de utilizator si parola pentru a putea posta pe forum sau pentru a accesa ariile disponibile doar utilizatorilor inregistrati.
 » Concurs
GameDev
 » Statistici
  • 46957 de mesaje.
  • 5871 de topicuri.
  • 825 de utilizatori.
  •  
  • cdoryn74 e ultimul utilizator inregistrat.
[Detalii]

 » Parteneri » Sponsori

 » Recomandăm
HostVision

» Avem un concurs pentru bloggeri si forumisti. Participi? «
Pagini: [1]
Print
[Curs] C - Lectia 09 - Lucrul cu fisierele [1815 afisari]
3Nigma
*


Mesaje: 981
OfflineOffline

WWW

M-am gandit si eu sa fac un mic tutorial in C despre "Operatii ce se pot realiza asupra unui fisier"! Poate il scutesc un pic pe OSHO de ceva treaba Smile.
Ok..sa incepem cu simple operatii de citire/scriere pe fisiere.
Exista mai multe modalitati de a realiza citirea/scrierea asupra unui fisier.Eu va voi prezenta doar una dintre ele.
Metoda utilizata de mine consta in deschiderea unui fisier pentru operatii de scriere/citire,citirea/scrierea pe fisier realizata caracter cu caracter
si in cele din urma inchiderea fisierului.

Deschiderea fisierului pentru citire/scriere!
In primul rand pentru a accesa functia de deschidere a unui fisier trebuie sa includeti headerul stdio.h deasupra proiectului.
Code:
#include<stdio>
Functia care o vom folosi pentru a deschide un fisier este fopen si are urmatorul prototip in header:
Code:
FILE *fopen(const char *locatiefisier,const char *mod_deschidere);
locatiefisier  - contine locatia fisierului pe care doriti sa-l deschideti. Exemplu ar fi "C:inferno.log"
mod_deschidere - reprezinta modalitatea de utilizare a fisierului (ex citire,adaugare,scriere)
Modurile de deschidere sunt:

· a - deschide un fisier pentru operatiuni de adaugare.Daca fisierul nu exista,sistemul il creeaza!
· r - deschide un fisier pentru operatiuni de citire.
· w - creaza un fisier nou si il deschide pentru operatiuni de scriere,daca mai exista un fisier cu acelasi nume,functia suprascrie fisierul
· r+ - deschide un fisier atat pentru operatiuni de scriere cat si pentru citire
· w+ - creaza un fisier nou si il deschide atat pentru operatiuni de scriere cat si pentru citire,daca mai exista un fisier cu acelasi nume,functia suprascrie fisierul
· a+ - deschide un fisier atat pentru operatii de citire cat si pentru operatii de adaugare.Daca fisierul nu exista,sistemul il creaza!

Functia fopen odata apelata,va returna un pointer de tip FILE asa cum specifica headeru stdio.h.
Daca fisierul nu s-a putut deschide,functia va returna valoarea de NULL.
O modalitate de a verifica daca deschiderea unui fisier s-a puttu realiza este cu ajutorul conditiei if.
Exemplu:
Code:
if((fisier_deschis=fopen("<locatie_fisier>","r"))!=NULL)
{
  //Fisierul s-a putut deschide!
}
else
{
  //Fisierul NU s-a putut deschide!
}
Cum am spus,fopen returneaza un pointer de fisier pe care il vom folosi mai tarziu pentru a citi sau scrie pe un fisier!
In cazul exemplului de mai sus..pointerul ce-l returneaza fopen este atribuit lui fisier_deschis pe care il vom declara :
Code:
FILE *fiser_deschis;
Pentru tutoarilul defata vom lua <locatie_fisier> ca fiind C:YServer.txt sau puteti voi sa dati orice alta locatie de fisier!

Citirea si scrierea pe un fisier!
Acum ca am invatat sa deschide un fisier putem face operatii de I/O pe fisierul deschis!
Functiile ce le vom folosi pentru operatii de I/O sunt fgetc pentru citire si fputc pentru scriere pe fisier!
Prototipul lor in biblioteca stdio.h este urmatorul:
Code:
int fgetc(FILE *pointer_de_intrare);
int fputc(int caracter_transmis,FILE *pointer_de_iesire);
Acum sa le implementam in exemplul nostru.Sa zicem ca dorim sa afisam continutul fisieului deschis!
Code:
FILE *fisier_deschis;
int litera_citita;
if((fisier_deschis=fopen("C:YServer.txt","r"))!=NULL)
{
[b]while((litera_citita=fgetc(fisier_deschis))!=EOF)
cout<<(char)litera_citita;[/b]
}
else
{
  //Fisierul NU s-a putut deschide! si atentionam utilizatorul
  cout<<"Fisierul nu s-a putut deschide!";
}
Dupa cum vedeti am folosit o structura repetitva while.Practic acest lucru informeaza programul ca el va citi fisierul,litera cu litera,pana va ajunge la finalul lui!
Cand va ajunge la finalul fisierului,ciclul while se va termina!
In structura while avem:
Code:
cout<<(char)litera_citita;
Am folosit un cast "(char)" deoarece functia returneaza,dupa cum vedeti,un int si noi nu vrem sa afisam pe ecran cifre ci literele corespeunzatoare int-ului conform
tabelului ASCII! (char)<variabila_de_tip_int> vede <variabila_de_tip_int> ca fiind corespondentul ei in ASCII!
Functiile de I/O prezentate de mine sunt de citire/scriere caracter cu caracter desi exista si functii de citire linie cu linie,eu nu le voi prezenta
in tutorialul de fata!Practit,functiile create mai sus scriu/citesc un caracter dupa care muta pozitia cursorului la urmatorul caracter.Daca s-a atins sfarsitul fisierului,
functia va returna,asa cum am vazut in exemplu o constanta EOF(End Of FIle)

Inchiderea unui fisier!
Dupa ce am realizat operatia de I/O si nu mai avem nevoie ca fisierul sa fie deschis pur si simplu il inchidem cu o functie special creata,tot din biblioteca
stdio.h si anume fclose.
Prototipul ei este urmatorul:
Code:
int fclose(FILE *pointer_la_fisierul_deschis);
fclose returneaza 0 daca fisierul a fost inchis cu succes si o constana EOF(end of file) daca a aparut o eroare).Testatarea o putem face printr-un banal if.
Code:
if(fclose(fisier_deschis)==EOF)
cout<<"A aparut o eroare la inchiderea fisierului!";
Daca nu apelati functia de inchidere a fisierului,nu va faceti griji, Smile programul le va inchide singur la terminarea lui!
Sa implementam asta si in exemplul nostru:
Code:
FILE *fisier_deschis;
int litera_citita;
if((fisier_deschis=fopen("C:YServer.txt","r"))!=NULL)
{
 while((litera_citita=fgetc(fisier_deschis))!=EOF)
cout<<litera_citita;
[b]fclose(fisier_deschis);[/b]
}
else
{
  //Fisierul NU s-a putut deschide! si atentionam utilizatorul
  cout<<"Fisierul nu s-a putut deschide!";
}

Daca ar fi sa facem un cod complet cu tot cu headere si main ar arata cam asa:
Code:
#include<conio>
#include<iostream>
#include<stdio>
void main()
{
FILE *fisier_deschis;
int litera_citita;
if((fisier_deschis=fopen("C:YServer.txt","r"))!=NULL)
{
 while((litera_citita=fgetc(fisier_deschis))!=EOF)
cout<<(char)litera_citita;
[b]fclose(fisier_deschis);[/b]
}
else
{
  //Fisierul NU s-a putut deschide! si atentionam utilizatorul
  cout<<"Fisierul nu s-a putut deschide!";
}
fgetchar();
}

In acest tutorial ati invatat:

· deschiderea fisierlor pentru operatii de I/O
· realizarea de operatii I/O pe un singur caracter cu avansare de cursor la urmatorul caracter
· inchiderea fisierului

Simplu,nu? Smile
Mai tarziu in acest topic va voi arata cum sa faceti operatii de "suprafata" asupra fisierelor in c(cum ar fi stergere,redenumire,etc) acum is un pic obosit...
Pentru sugetii si comentarii postati aici!
©3Nigma
Logged

Search for knowledge in the darkest places and in the blackest hours! You might get lucky and find more than you are looking for...

"Ambition is a lame excuse for the ones that are not brave enough to be lazy..."
15-10-2006, 22:01 
 
Agkelos
*


Mesaje: 6024
OfflineOffline

WWW

Acu' pe cand m-am apucat sa reiau cursul de C... Sad
Anyway, buna treaba :thumbup:
Imi permit sa redenumesc lectia si sa trec linkul in cursurile de C Big grin
Logged

Blog | Twitter

De nu va zice omul intru inima sa "Eu singur si Dumnezeu suntem in lume" nu va avea odihna. - Avva Alonie
15-10-2006, 22:11 
 
3Nigma
*


Mesaje: 981
OfflineOffline

WWW

oK...acum ca am vazut cum putem scrie/citi un fisier sa trecem la cateva operatii "de suprafata" asupra fisierelor si anume:

· Stergerea de fisiere
· Redenumire de fisiere
· Aflarea dimensiunii unui fisier

Trebuie amintit ca,asemeni scrieri/citirii de fisiere, biblioteca stdio.h gestioneaza functiile de mai sus!

Stergerea de fisiere!
Functia folosita pentru a sterge un fisier de pe HDD este remove.Prototipul functiei remove din stdio.h este urmatorul:
Code:
int remove(const char *locatie_fisier);
*locatie_fisier  - reprezinta,asa cum ii sugereaza si numele,locatia fisierului pe care doriti sa-l stergeti.
De exemplu sa zicem ca am dori sa stergem "C:YServer.txt",atunci functia ar arata cam asa:
Code:
remove("C:YServer.txt");
Functia remove returneaza 0 daca stergere a avut loc cu succes si -1 daca nu s-a puttu sterge fisierul dorit!

Redenumire de fisiere!
Pentru a redenumi un fisier,c++ ne pune la dispozitie o functie cu acest scop si anume rename.
rename este declarata in stdioo.h,daca nu ma inseala memoria Smile,astfel:
Code:
int rename(const char *nume_fisier_vechi,const char *nume_fisier_nou);
Sa luam un exemplu practic...sa zicem ca am dori sa redenumim fisierul de mai sus cu "fisier_nout.txt",in cazul acesta am apela functia rename
astfel:
Code:
rename("C:YServer.txt","C:fisier_nout.txt");
Functia rename returneaza 0 daca fisierul a fost redenumit cu succes si -1 daca a aparut o eroare!

Aflarea dimensiunii unui fisier!
Pentru aflarea dimenisunii unui fisier dat,pe langa functia care returneaza marimea unui fisier ar mai trebui sa stiti cate ceva despre Indicatori de Fisiere.

Indicatori de fisier
Indicatorii de fisiere ,pe scurt vorbind,definesc modul in care este deschis un fisier,printr-o valoarea numerica.(ex Doar de citire(ReadOnly-> O_RDONLY),Doar pentru scriere(S_IWRITE).
Nu ma sa intru in detaliu la "Indicatori de fisier" deoarece ei reprezinta lucrul cu fisierele la un nivel jos + ca sa nu uita de unde am pornit:
Dorim sa aflam dimensiunea unui fisier!
Ok...pentru aceasta vom folosi o functie de nivel jos in c ce va returna un indicator de fisier pe care il vom folosi pentru a determina dimensiunea fisierului.
Functia care ne rertureanza indicatorul de fisier dorit este open.
Exemplu de folosire:
Code:
int fisier;
fisier=open("C:YServer.txt",O_RDONLY);
Daca functia nu s-a executat cu succes,va returna -1.In caz contrar,ea va returna un indcator de fisier.
O_RDONLY - specifica modul in care vom deschide fisierul(pentru ca noi vrem doar sa-i aflam marimea si nu sa scriem pe el...folosim O_RDONLY)
Headerul ce contine macrovariabilele precum O_RDONLY este fcntl.h si trebuie inclus in proiect
"C:YServer.txt" - reprezinta o locatie de fisier si poate fi oricare.Eu am ales aceasta locatie pentru a pastra fisierul de lucru de la inceputul postului! Smile
Nu trebuie sa stiti exact ce este un "Indicator de fisier" ci este de ajuns sa stiti ca valoarea unui indicator de fisier se va folosi ca parametru pentru a
apela functia de stabilire a dimensiuni fisierului!
Mai trebuie specificat ca,asemanator operatiilor de citire/scriere,odata ce nu mai aveti nevoie de indicatorul de fisier trebuie distrus cu comanda:
Code:
close(<nume_indicator_de_fisier>);

Inapoi la aflarea dimensiunii unui fisier!
Acum ca avem habar,cat de cat, ce sunt "indicatorii de fisier" putem trece la aflarea dimensiuni fisierului propriu-zisa.Acest lucru il facem cu ajutorul functiei
filelength continuta in headerul io.h.
Prototipul functiei asa cum este declarata in io.h este:
Code:
long filelength(int indicator_de_fisier);
indicator_de_fisier -> acum observati de ce trebuia sa aveti habare de "Indicatori de fisiere!"
filelength returneaza o valoare de tip long care reprezinta dimensiunea,in octeti a fisierului specificat.
Haideti sa realizam o aplicatie practica.Sa zicem ca am dori sa aflam dimensiunea lui: "C:YServer.txt".Ca sa vedeti cum am putea aface acest lucru puteti analiza
cu usurinta codul de mai jos:
Code:
#include<iostream>
#include<conio>
#include<stdio>
//contine prototpiul functiei 'filelength'
#include<io>
//includem si fcntl.h deoarece aici se tine prototipul penru variabila 'O_RDONLY' din
//apelarea functie e'open'
#include<fcntl>
void main()
{
int indicator;
long dimensiune_fisier;
if((indicator=open("C:YServer.txt",O_RDONLY))!=-1)
dimensiune_fisier=filelength(indicator);
cout<<"Dimensiunea fisierului este: "<<dimensiune_fisier<<" de octeti!";
//nemaavand nevoie de indicatorul de fisier,il distrugem:
close(indicator);
//asteptam ca utilizatorul sa apase o tasta
getchar();
}

Destul de simplu zic eu... Alte functii "de suprafata" pentru fisiere ... later!
Pentru critici si comentarii postati aici!
©3Nigma
Logged

Search for knowledge in the darkest places and in the blackest hours! You might get lucky and find more than you are looking for...

"Ambition is a lame excuse for the ones that are not brave enough to be lazy..."
16-10-2006, 15:59 
Pages: [1]
Print
SkullBox Forum  |  Development  |  Java / C / C++ / C# (Moderators: AnaKonD, astan)  |  Topic: [Curs] C - Lectia 09 - Lucrul cu fisierele
Jump to: