CATEGORII DOCUMENTE |
DOCUMENTE SIMILARE |
|
TERMENI importanti pentru acest document |
|
Conversii de format in memorie
Functiile scanf si printf au corespondente functiile sscanf si
sprintf care executa aceleasi tipuri de conversii, dar care
opereazza asupra unui sir nu asupra unui fisier. Formatul general
este:
sprintf(string, control, arg1, arg2,)
sscanf(string, control, arg1, arg2,)
sprintf formateaza argumentele arg1, arg2, etc, conform sirului
'control' ca mai inainte, dar plaseaza rezultatele in 'string'
in loc de iesirea standard. Desigur 'string' trebuie sa fie
suficient de mare pentru a primi rezultatul. Ca exempolu, daca
'name' este un tablou de caractere si n este un intreg, atunci:
sprintf(name, 'temp%d', n);
creaza un sir de forma tempnnn in 'name', unde nnn este valoarea
lui n.
sscanf face conversia inversa -imparte sirul 'string'
conform formatului din 'control' si plaseaza valorile
rezultate in arg1, arg2, etc. Aceste argumente trebuie sa fie
pointeri. Astfel: sscanf(name, 'temp%d', @n); n la valoarea
digitilor din sir care urmeaza dupa temp in 'name'.
Exercitiul 7.2. Rescrieti exemplul de calculator din
capitolul 4 utilizind scanf si/sau sscanf pentru a face intrarea
si conversia numerelor.
7.6 Acces la fisiere
Programele scrise pina acum toatecitesc 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 8).
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[]
else
}
filecopy(fp) /*copy file fp to standard output */
FILE *fp
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.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 909
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved