- Învatati sa cititi datele dintr-un fisier
- Învatati sa afisati continutul unui fisier
- Învatati sa scrieti date intr-un fisier
1. Citirea dintr-un fisier
PHP furnizeaza o varietate de functii pentru citirea fisierelor. Una dintre acestea este fread(), care are urmatoarea forma:
fread(identificator_fisier, lungime)
Argumentul 'identificator_fisier' este valoarea returnata de functia fopen(), iar argumentul 'lungime' specifica numarul maxim de octeti care vor fi cititi. Octetii cititi din fisier sunt returnati sub forma de valoare de tip sir. Daca operatia de citire întâlneste sfârsitul fisierului, PHP va returna mai putin de lungime octeti data.
Iata un exemplu de citire si de afisare a unui text dintr-un fisier, folosind functia fopen() (Fisierul "carte.txt" folosit ca test in exemplele de mai jos trebuie sa se afle in acelasi director in care este si scriptul php):
<?php
$fh = @fopen("carte.txt", "rb");
if (!$fh) {
echo "Nu a fost deschis fisierul carte.txt.";
}
else {
$s = fread($fh, 256);
echo "<br /> Citeste: $s";
fclose($fh);
}
?>
Exemplul citeste maximum 256 de octeti din fisier daca fisierul a fost deschis.
-
Am folosit caracterul @ in fata functiei "fopen()" pentru a impedica afisarea erorilor de la server in cazul cand fisierul nu poate fi deschis. Este deja functia "if()" care verifica si afiseaza mesaj in caz de nedeschidere a fisierului.
Pentru a citi un numar mai mare sau mai mic de octeti, modificati valoarea argumentului lungime al functiei
fread().
PHP include o functie conexa, denumita fgetc(), care citeste un octet din fisierul specificat.
Pentru a citi si a afisa întregul continut al fisierului, puteti folosi functia filesize() pentru a furniza valoarea argumentului lungime, astfel:
<?php
$nume = "carte.txt";
$fh = @fopen($nume, "rb");
if (!$fh) {
echo "Nu a fost deschis fisierul carte.txt.";
}
else {
$l = filesize($nume);
$s = fread($fh, $l);
echo "<br /> Citeste: $s";
fclose($fh);
}
?>
2. Citirea unei linii de text
Se obisnuieste frecvent citirea linie cu linie a unui text dintr-un fisier.
Functia fgets() citeste o linie dintr-un fisier; functia are urmatoarea forma:
fgets(identificator_fisier, lungime)
- Argumentul 'identificator_fisier' este o valoare returnata de functia fopen(); aici, argumentul 'lungime' specifica numarul maxim de octeti dintr-o linie care vor fi cititi, minus o unitate, pentru a permite includerea caracterului de terminare a liniei (acesta poate fi omis si va citi toata linia). Octetii cititi din fisier sunt returnati ca valoare de tip sir.
Iata un exemplu care prezinta modul de citire si de afisare a primilor 125 octeti din prima linii a unui fisier :
<?php
$nume = "carte.txt";
$fh = @fopen($nume, "rb");
if (!$fh) {
echo "Nu a fost deschis fisierul carte.txt.";
}
else {
$s = fgets($fh, 126);
echo "<br /> Citeste: $s";
fclose($fh);
}
?>
- In exemplul de mai sus, daca prima linie din fisierul "carte.txt" are mai mult de 125 de caractere, va afisa doar primele 125, daca are mai putin de 125 de caractere, va afisa doar caracterele care sunt incluse in prima linie.
3. Citirea linie cu linie a unui întreg fisier
În general, dintr-un fisier trebuie citit mai mult decât prima linie a acestuia. Pentru aceasta, un script trebuie sa dispuna de o modalitate de a determina momentul când fisierul a fost citit în totalitate.
Functia feof() are chiar acest scop, returnând o valoare care arata daca s-a ajuns sau nu la sfârsitul fisierului. Functia are urmatoarea forma:
feof(identificator_fisier)
Argumentul 'identificator_fisier' este valoarea returnata de functia fopen().
Functia feof() returneaza TRUE daca fisierul specificat este la sfârsit; în caz contrar, returneaza FALSE.
Iata cum se poate folosi functia feof() pentru a controla procesul de citire a unui întreg fisier, linie cu linie:
<?php
$nume = "carte.txt";
$fh = @fopen($nume, "rb");
if (!$fh) {
echo "Fisieru carte.txt nu a putut fi deschis";
}
while (!feof($fh)) {
$s = fgets($fh, 256);
echo "<br /> Citeste : $s";
}
fclose($fh);
?>
- Instructiunea "while" asigura faptul ca functia
fgets() este apelata în mod repetat, pâna la citirea tuturor liniilor.
O alta modalitate simpla de a citi linie cu linie un întreg fisier consta în a folosi functia
file(). Aceasta functie returneaza un tablou în care fiecare element contine o linie a fisierului specificat.
Iata un exemplu care foloseste functia
file() pentru a citi si pentru a afisa continutul unui fisier:
<?php
$tablou = file("carte.txt");
foreach ($tablou as $s) {
echo "<br /> Citeste : $s";
}
?>
Aceasta metoda nu este adecvata pentru fisiere de foarte mari dimensiuni, deoarece în tablou este încarcat întregul continut al fisierului, ceea ce poate necesita o cantitate de memorie superioara celei disponibile.
4. Afisarea continutului unui fisier
PHP furnizeaza doua functii care faciliteaza afisarea continutului unui fisier.
- Una dintre functii, fpassthru(), necesita un argument care specifica identificatorul fisierului care urmeaza sa fie afisat:
- $fh = fopen("carte.txt", "rb");
fpassthru($fh);
Dupa ce a afisat fisierul, functia îl închide automat.
- Cealalta functie,
readfile(), necesita numai numele sau calea fisierului:
5. Navigarea printr-un fisier
Fiecare fisier are un pointer asociat care indica pozitia octetului unde se va produce urmatoarea operatie.
Puteti folosi functia rewind() pentru a readuce pointerul la începutul fisierului. Functia are urmatoarea forma ('identificator_fisier' este identificatorul de fisier returnat de functia fopen()):
rewind(identificator_fisier)
Nu puteti readuce pointerul unui fisier la începutul propriu-zis al unui fisier daca fisierul a fost deschis pentru un acces de tip atasare, adica într-unul din modurile 'a' sau 'a+'.
Iata un exemplu care prezinta modul de utilizare a functiei rewind() pentru a afisa de doua ori continutul unui fisier:
<?php
$nume = "carte.txt";
$fh = @fopen($nume, "rb");
if (!$fh) {
echo "Fisieru carte.txt nu a putut fi deschis";
}
while (!feof($fh)) {
$s = fgets($fh, 256);
echo "<br /> Citeste : $s";
}
// Deruleaza la inceputul fisierului si reia redarea acestuia
rewind($fh);
while (!feof($fh)) {
$s = fgets($fh, 256);
echo "<br /> Citeste \$s : $s";
}
fclose($fh);
?>
Daca se produce vreo eroare, functia
rewind() returneaza zero.
Desi functia
rewind() este utila în caz de nevoie, necesitatea de a readuce un pointer de fisier la începutul fisierului nu este chiar atât de frecventa.
Functia
fseek() furnizeaza o mai mare flexibilitate, permitându-va sa pozitionari pointerul de fisier astfel încât sa puteti citi sau scrie în orice punct al fisierului.
Functia are doua forme, cea mai simpla fiind urmatoarea:
fseek(identificator_fisier, offset)
unde 'identificator_fisier' este identificatorul de fisier returnat de functia fopen(), iar 'offset' este pozitia dorita a pointerului de fisier, specificata în octeti, în raport cu începutul fisierului.
In caz de reusita, functia
fseek() returneaza 0; în caz contrar, returneaza -l .
O forma alternativa a functiei asigura un grad superior de flexibilitate, avand urmatoarea forma:
fseek(identificator_fisier, offset, baza)
unde 'identificator_fisier' si 'offset' au semnificatiile definite anterior, iar 'baza' ia una ; dintre urmatoarele valori:
- SEEK_SET, care stabileste pozitia pointerului de fisier în raport cu începutul fisierului
- SEEK_CUR, care stabileste pozitia pointerului de fisier în raport cu valoarea curenta a pointerului
- SEEK_END, care stabileste pozitia pointerului de fisier relativ la sfârsitul fisierului
Valoarea argumentului 'offset' poate fi pozitiva, negativa sau zero.
De exemplu, pentru a pozitiona pointerul cu 1000 de octeti înainte de sfârsitul fisierului, emiteti urmatorul apel de functie:
- fseek($fh, -1000, SEEK_END)
Pentru a obtine valoarea curenta a pointerului de fisier, folositi functia
ftell(), care are urmatoarea forma:
- ftell(identificator_fisier)
Functia returneaza valoarea curenta a identificatorului de fisier, respectiv valoarea zero daca functia esueaza.
6. Scrierea într-un fisier
Pentru a scrie intr-un fisier se foloseste functia fwrite(), aceasta are urmatoarea forma:
fwrite(identificator_fisier, date);
- Unde 'identificator_fisier' este identificatorul de fisier returnat de functia fopen(), iar 'date' este o valoare sir care determina datele care urmeaza a fi scrise.
Daca executia functiei reuseste, returneaza numarul octetilor scrisi; în caz contrar, returneaza valoarea —l.
Iata un exemplu care prezinta modul de scriere a datelor într-un fisier:
<?php
$nume = "carte.txt";
$fh = @fopen($nume, "ab");
if (!$fh) {
echo "Nu a fost deschis fisierul carte.txt.";
}
else {
$ok = fwrite($fh, "Acestea sunt datele adaugate \n");
echo "<br /> Rezultatul scris este: $ok";
fclose($fh);
}
?>
Acest script va avea urmatoarele date de iesire:
Rezultatul scris este: 30
- Programul prezentat în exemplul anterior scrie în fisierul "carte.txt" o linie de text. Deoarece fisierul a fost deschis folosind modul "a", datele sunt atasate la fisier; cu alte cuvinte, datele sunt scrise la sfarsit, dupa toate datele existente în fisier.
Observati ca a fost scris si un caracter de terminare a liniei ("\n"), astfel încât fisierul sa poata fi citit linie cu linie la un moment de timp ulterior. Daca lucrati cu un fisier text, în general e util sa includeti un caracter de terminare a liniei la sfârsitul fiecarei linii scrise în fisier.
Programul din exemplu scrie în fisier o singura linie de text. Totusi, puteti scrie mai multe linii, daca doriti. Daca apelati functia
fwrite() din interiorul unei bucle, aveti posibilitatea de a scrie mai multe linii. Dupa ce ati scris toate liniile de care aveti nevoie, închideti fisierul prin apelarea functiei
fclose().
PHP mai furnizeaza si o forma alternativa a functiei
fwrite():
- fwrite(identificator_fisier, date, lungime);
Aceasta forma include un al treilea argument, si anume "lungime", care va permite sa specificati numarul maxim de octeti care vor fi scrisi.
Argumentul "lungime" al functiei fwrite() trebuie utilizat atunci când se scrie în fisiere binare sub Microsoft Windows.
Windows prefera secventa de terminare a liniei "\r\n". Atunci când scrieti programe PHP pentru sisteme Windows, este de preferat sa folositi secventa "\r\n" de terminare a liniei.
- PHP dispune de o alta functie pentru scrierea fisierelor, fputs(). Totusi, în afara de nume, fputs() este similara cu functia fwrite().
- O lista cu mai multe functii utile in lucrul cu fisiere gasiti la pagina ->
Functii pentru fisiere si directoare.