Capitolul 7.6. Acces la fisiere

Vezi subiectul anterior Vezi subiectul urmator In jos

Capitolul 7.6. Acces la fisiere

Mesaj  zooky la data de Mier Mar 18, 2009 2:35 pm

Programele scrise pina acum toate citesc intrarea standard si scriu iesirea standard.

Urmatorul pas in I/O este de a scrie un program care acceeaza un fisier care nu este deja conectat programului. Un program care ilustreaza necesitatile pentru astfel de operatii este "cat", care conecteaza un set de fisiere specificate spre iesirea standard. "cat" este utilizat pentru tiparirea fisirelor la terminal si ca un scop general este utilizat ca un colector de intrare pentru programele care nu au capabilitatea de a accesa fisirele prin nume. De exemplu comanda:

cat x. c y. c

tipareste continutul fisierelor x. c si y. c la iesirea standard.

Intrebarea este cum sa aranjam ca fisierele specigficate sa fie citite adica cum sa controlam numele externe cu declaratiile care de fapt citesc datele.

Regulile sint simple. Inainte de a se citi sau scrie intr-un fisier, l trebuie deschis cu ajutorul functiei fopen din biblioteca standard. fopen ia un nume extern (ca x. c sau y. c ), face citeva manipulari si negocieri cu sistemul de operare(detalii care nu ne intereseaza) si reruneaza un nume intern care trebuie utilizat ulterior la citirile si scrierile fisireului.

Acest nume intern este de fapt un pijnter numit "file pointer", la o structura care contine informatii despre fisiere ca, adresa unui buffer pozitia curenta in bufer, daca se citeste sau se scrie in fisier, s. am. d. Utilizatorii nu trebuie sa cunoasca detaliile deoarece o parte din definirile standard I/O obtinutede la "stdio.h" este o definire de structura numita FILE. Singura declaratie necesara pentru un pointer de fisier (file pointer) este exemplificata de

FILE*fopen(), *fp;

Aceasta spune ca fp este un pointer la FILE, si fopen returneaza un pointer la FILE. Observati ca FILE este un nume de tip, la fel cu "int" nu o eticheta de structura: este implementat ca un typedef(Detalii in capitolul Cool.

Actuala apelare a lui fopen in program este:

fp=fopen(name, mode);

Primul argument a lui fopen este numele (name) fisierului, care este un sir de caractere. Al doilea argument este modul "mode", de asemenea un sir de caractere care indica cum se intentioneaza sa fie utilizat fisier ul. Modurile permise sint citire (read-"r"), scriere(write-"w") sau adaugare ("a").

Daca deschideti un fisier care nu exista: pentru scriere sau adaugare, el este creat (daca este posibil). Daca se deschide un fisier existent in scriere, acest fisier este sters. Incercarea de a citi un fisier care nu exista constituie o eroare. Mai exista si alte manevre care cauzea erori ca incercarea de aciti un fisier pt. care nu aveti permisiunea. Daca exista vreo eroare, fopen returneaza in pointerul nul valoarea NULL (care pt. convenienta este de asemenea definita in stdio.h).

Urmatorul pas este de aciti sau scrie fisierul odata deschis. Aici exista mai multe posibilitati dintre care getc si putc sint cele mai simple. getc returneaza urmatorul caracter din fisier ;are nevoie de fisier pentru a-i specifica care fisier.
Astefl

c=getc(fp)

plaseaza urmatorul caracter din fisierul referit prin fp in c si EOF cind ajunge la sfirsitul fiserului.

putc este inversul lui getc:
putc(c, fp)

pune caracterul c in fisierul fp si returneaza c. La fel cu getchar si puchar, getcsi putc pot fi macrouri in loc de functii.

Cind este demarat un program, trei fisiere sint deschise in mod automat si sint furnizate pointerele pentru ele. Aceste fisiere sint intrarea standard, iesirea standard, si iesirea standard pentru erori ; pointerele de fisiere corespunzatoare sint stdin, stdout si stderr. Normal toate acestea sint conectate la terminal, dar stdin si stdout pot fi redirectate asa cum s-a descris in paragraful 7.2.
getchar si putchar pot fi definite cu ajutorul lui getc si putc, stdiu si stdout astfel:

#define getchar() getc(stdiu)
#define putchar(c)putc(c, stdout)

Pentru intrarea sau iesirea formatata afisierelor, functiunile fscanf s si fprintf pot fi utilizate. Acestea sint identice cu scanf si printf, de retinut ca primul argument, este un pointer de fisier care specifica fisierul de citit sau scris ; sirul de control este al doilea argument.

Cu aceste preliminarii, sintem acum in pozitia de a rescrie programul "cat" de concatenare a fisierelor. Premisa de baza este cea care a fost gasita convenabila pentru atitea programe pina acum: dacaexista linii de comanda cu argumente, sint executate in ordine. Daca nu exista argumente este preluata intrarea standard. Sub aceasta forma programul poate fi folosit de sine statator sau ca o parte a unora mai mari.

#include <stdio.h>
main(argc, argv) /* cat:concatenate files */
int argc;
char *argv[]
{
FILE*fp, *fopen();
if(argc==1) /* no args;copy standard inp */
filecopy(stdiu);
else
while(--argc>0)
if((fp=fopen(*++argv, "r"))==NULL){
printf("cat:can't open%s`n", *argv);
break;
}else{
filecopy(fp);
fclose(fp);
}
}
filecopy(fp) /*copy file fp to standard output */
FILE *fp
{
int c:
while((c=getc(fp))!=EOF)
putc(c, stand);
}

Pointerele de fisiere stdiu si stdout sint predefinite in biblioteca standard I/O ca iesirea si intrarea standard: ele pot fi utilizate oriunde poate fi utilizat un obiect de tipul FILE, Ele sint constante , nu variabile asa ca nu incercati sa le asigurati.

Functia fclose este inversul lui fopen ; ea intrerupe conexiunea intre pointerul fisierului si numele extern al fisierului, care a fost stabilita de fopen, eliberind pointerul fisierului pentru un alt fisier. Deoarece cele mai multe sisteme de operare limiteaza numarul de fisiere dechise simultan de un program, este o idee buna de a le elibera in momentul cind nu maio este nevoie de ele, asa cum am facut in programul cat.
Exista de asemenea un alt motiv pentru a face fclose pe un alt fisier in iesire -curata bufferul in care putc colecteaza iesirea. fclose este apelat automat pentru fiecare fisier dechis atunci cind programul se termina normal.
avatar
zooky
Moderator
Moderator

Numarul mesajelor : 147
Data de inscriere : 15/03/2009
Varsta : 24
Localizare : Cernatesti City

Vezi profilul utilizatorului http://e-learning.forumhit.ro

Sus In jos

Vezi subiectul anterior Vezi subiectul urmator Sus


 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum