|
ordine si redenumeste programul dorit la numele urmator din lista sin-
|
səhifə | 13/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| ordine si redenumeste programul dorit la numele urmator din lista sin-
optica de arhivare(catalogheaza programul automat).O astfel de aplicatie
va este utila in cazul in care realizati o biblioteca personala de functii
si va simplifica munca de organizare.
Nu redenumiti programele si filele clasice(vor fi mai greu de gasit!).
-84- [stdio.h-gets() si puts() ]
FUNCTIA gets()
Preia un sir de caractere din stream(din memoria de operare).
Functia colecteaza un sir de caractere din memoria de operare si il sal-
veaza in variabila specificata.Sirul va fi preluat incepand cu primul ca-
racter si terminand la primul caracter ce specifica trecerea la linia
urmatoare(caracter special "new line"= \n).In sirul salvat in variabila,
caracterul de sfarsit de rand (\n) va fi inlocuit cu un caracter null (\0)
(care specifica sfarsitul textului).
Sirul preluat poate contine si spatii goale,spatii TAB etc.
Sirul preluat nu se termina la marginea ecranului,ci doar in aparitia
caracterului de sfarsit de rand,iar daca sirul preluat este foarte lung,
acesta va fi suprascris peste datele din randurile urmatoare.Pentru un
control mai strict al sirului preluat se poate utiliza fgets().
SINTAXA GENERALA este: char *gets(char *s);
Daca operatia a fost executata cu succes,functia returneaza argumentul
sirului,iar in caz de eroare sau sfarsit de fisier,returneaza NULL.
EXEMPLU: #include
#include
char sir[80];
int main()
{
printf("Introduceti un sir de caractere:\n");
gets(sir);
printf("Sirul introdus este: %s\n",sir);
sleep(10);
}
FUNCTIA puts()
Introduce un sir in unitatea de iesire a datelor(stdout),adica pe
ecran,imprimanta etc.(si adauga un caracter de sfarsit de rand).
Functia copiaza sirul introdus pana la caracterul null de la sfarsit,pe
dispozitivul de iesire a datelor(ecran,imprimanta etc.) si adauga un ca-
racter de sfarsit de rand (\n) in locul celui null.
SINTAXA GENERALA este: int puts(const char *s);
Daca operatiunea a fost realizata cu succes,functia returneaza ultimul
caracter copiat (o valoare nenula) iar in caz contrar returneaza EOF.
EXEMPLU: #include
#include
int x;
int main()
{
for (x=0;x<10;x++)
{
puts("Exemplu de sir introdus pe ecran ! \n");
sleep(1);
};
}
O functie similara este fputs() care permite introducerea de date intr-un
fisier deschis in memoria de operare (inclusiv date binare).
Ambele functii permit comunicarea cu memoria de operare ("stream").
-85- [stdio.h-fopen() ]
FUNCTIA fopen()
Un mare numar dintre functiile din fila de antet STDIO.h sunt desti-
nate operatiunilor de comunicare cu memoria de operare.Toate aceste fun-
ctii au un f mic la inceputul denumirii(EXEMPLE:fclose,feof,fgetc,fopen,
fputc,fputs,fread etc.).Aceste functii actioneaza la nivel de "strem",
adica asupra fluxului de date recirculat permanent in memoria de operare.
Cu ajutorul acestor functii,se pot deschide in memoria de operare file si
fisiere identice cu cele de pe memoria de stocare(hard-disck) cu care se
pot efectua aceleasi operatii ca si cu fisierele reale.Aceste file si
fisiere se deschid pentru a proteja memoria de stocare de operatiile in-
utile.Astfel,daca intr-un fisier se opereaza un milion de operatii pana
cand se ajunge la rezultatul final,aceste operatii se vor efectua doar
in fisierul virtual din circuitul electic,iar in memoria de stocare se va
introduce doar rezultatul final.In plus,in aceste fisiere se pot efectua
si operatii care nu vor fi arhivate in memorie.Aceste fisiere "de lucru"
au o deosebita semnificatie si sunt extrem de utilizate in toate programe-
le de lucru.Mai mult,exista sisteme intregi de operare,programe si apli-
catii care ruleaza exclusiv in memoria de operare,protejand astfel sis-
temul de orice "virus" sau "denaturare" a memoriei de stocare.
Fopen() este functia care permite deschiderea unei file in memoria de
operare(in stream).Pentru contabilizarea tuturor operatiilor la nivel de
stream,se utilizeaza un pointer de tipul FILE *fp(tip special de date
structurate introdus in compilatoarele Microsoft).
Fopen() se utilizeaza pentru a deschide un stream (accesul la memorie).
SINTAXA GENERALA este:
FILE *fopen(const char *filename,const char *mode);
Fopen() deschide o fila cu numele specificat prin "*filename" la care aso-
ciaza un strem(rezerva un spatiu de memorie in care se vor putea efectua
operatiile ulterioare).Dupa precizarea identificatorului (numele filei),
functia returneaza un pointer ce va putea fi utilizat pentru identificarea
filei in operatiile ulterioare.
Prin "*mode" se specifica tipul de operatii ce se vor putea efectua in
fila respectiva,prin utilizarea unuia dintre simbolurile urmatoare:
SIMBOL SEMNIFICATIE
=========================================================================
r -deschisa doar pentru citirea datelor
w -deschisa pentru scriere(suprascrie o fila preexistenta)
a -adauga date la sfarsitul filei ,sau deschide una noua
r+ -actualizeaza o fila (citeste si scrie date)
w+ -creaza o fila noua pentru actualizare(sau o suprascrie)
a+ -adauga si actualizeaza date,sau creaza o fila noua
Toate simbolurile urmate de + permit atat scrierea cat si citirea datelor,
prin a se pot adauga date noi,iar prin r si w se citesc sau suprascriu
cele preexistente.Cand nu exista o fila cu numele specificat,se deschide
o fila noua.
Pentru a specifica explicit un fisier de tip text se poate adauga un t
la simbolul din *mode,iar pentru a specifica un fisier binar se poate uti-
liza un simbol b.Atat t cat si b se pot utiliza inainte sau dupa semnul +
EXEMPLE : a+t (adauga intr-un fisier text) sau rb(citeste un fisier binar)
sau rt,w+t,wt+,wb+,r+b etc.
Daca b sau t nu se specifica explicit,se va utiliza valoarea setata in
-86- [stdio.h-fopen() ]
variabila de tip global denumita _fmode(care poate fi setata O_TEXT,caz
in care va deschide fisiere de tip text,sau O_BINARY,caz in care va des-
chide fisiere binare).Constantele O_...din variabila _fmode sunt definite
in fila de antet fcntl.h.
Atunci cand o fila este deschisa pentru actualizare,se vor putea efectua
atat operatii de preluare a datelor cat si operatii de introducere a lor,
dar iesirile de date nu vor putra fi urmate de intrari de date decat dupa
o functie fseek sau rewind(utilizate pentru repozitionarea pointerului).
Daca operatia de deschidere a fisierului a fost realizata cu succes,
functia retruneaza un pointer catre fila nou deschisa,iar in caz contrar
returneaza NULL.
Daca o fila este deschisa cu a,caracterul EOF de la capatul inregis-
trarii anterioare nu va fi sters.Datele noi vor fi adaugate,dar la o re-
deschidere ulterioara,datele vor fi afisate doar pana la caracterul EOF,
fara a afisa si datele adaugate.
Daca fila este deschisa cu a+,atunci se va sterge si caracterul EOF,
iar la redeschiderea filei se va afisa si textul adaugat.
Daca filele se deschid cu w+ sau r+,se vor putea efectua atat ope-
ratii de scriere cat si operatii de citire a datelor,dar pentru a trece
de la scriere la citire sau reciproc,va trebui intercalata o functie fseek
fflush,fsetpos sau rewind pentru repozitionarea pointerului.
Pentru ca datele din fila virtuala deschisa in memoria de operare sa
fie salvate pe disc la fiecare operatie fflush sau _flushall,se poate ada-
uga si un c.Daca se adauga un n ("no-comit"),atunci datele din fisierul
virtual nu vor fi salvate pe disc(este setarea implicita).
EXEMPLU: #include
#include
int w;
FILE *fp;
int main()
{
fp=fopen("FILA1","a+");
if (fp==NULL)
printf("Fila nu a fost deschisa ");
else
printf("Fila a fost deschisa ");
printf("\n Adresa este:");
printf("\n %s",&fp);
printf("\n Valoarea este:");
printf("\n %c",fp);
for (w=0;w<100;w++)
{
printf("%d",w);
printf(" ");
};
sleep(10);
}
Aplicatia deschide fila FILA1,apoi afiseaza adresa si valoarea pointerului
spre fila deschisa,dupa care afiseaza cifrele de la 1 la 100 (in mod simi-
lar se pot introduce date in fisier.Toate operatiile se executa fara a
accesa memoria de stocare (hard-disck-ul).
-87-
Pentru a deschide orice fila in memoria de operare,puteti utiliza un
algoritm simplu de genul:
EXEMPLU: #include
#include
#include
char w[40];
FILE *fp;
int main()
{
clrscr();
printf("Introduceti numele filei : \n");
scanf("40s",&w);
fp=fopen(w,"a+");
printf("\n Adresa filei este: ");
printf("\n %s",&fp);
printf("\n Valoarea pointerului este:");
printf("\n %c",fp);
sleep(10);
return 0;
}
Pentru a deschide file care se salveaza in memoria de stocare(pe disc),se
poate utiliza functia open() din fila de antet io.h.In acest caz,filele
deschise for fi scrise pe disc si vor fi arhivate permanent(vor fi re-
gasite cu optiunea "Load" din meniul "File").
Numarul de file deschise in memoria de operare si volumul de date struc-
turat in interiorul lor,nu este limitat de cat de dimensiunea memoriei de
operare(spatiul logic existent).
Pentru exercitiu,incercati sa deschideti consecutiv mai multe file.
Pentru intelegerea operatiilor efectuate la nivel de "stream" si a expli-
catiilor din alte manuale,este utila o explicatie simplista a notiunii de
"strem".In memoria de operare,care este o memorie electrica,datele nu pot
fi stocate pe un suport fix,astfel incat,pentru mentinerea lor se formeaza
niste bucle electrice in care datele circula in circuit inchis(cu o anu-
mita interziere determinata de trecerea prin portile logice).Astfel,un
fisier nou deschis,este de fapt o astfel de bucla electrica in care datele
circula redundant intr-un circuit inchis.Introducerea de date in fisier
(sau in stream=flux sau curent) inseamna de fapt adaugarea unui anumit
numar de oscilatii,fata de cele preexistente,iar stergerea de date din
fisier se realizeaza prin inlaturarea unui anumit numar de impulsuri(osci-
latii electrice) din circuit.Copierea unui fisier in alt fisier se face
prin introducerea buclei electrice in cea specificata etc.Stergerea com-
pleta a datelor se face prin deschiderea circuitului (la masa).Acest con-
cept elementar,a reprezentat la vremea lui un salt imens pentru dezvolta-
rea ulterioara a tehnicii de calcul si a permis realizarea procesoarelor
actuale (cu volume de procesare de peste 1 Gb/s).
Atunci cand proiectati realizarea unui program,sau a unei aplicatii,
este bine sa aveti in vedere atat memoria fixa de stocare a datelor,cat
si cea electrica(memoria de lucru=de operare),astfel incat sa exploatati
la maximum potentialul tehnic existent,cu minimum de uzura si cu minimum
de costuri materiale(memoria fizica de stocare reinscriptibila este foarte
scumpa si perisabila).
-88- [stdio.h-fprintf() ]
FUNCTIA fprintf()
Este asemanatoare cu printf(),dar datele formatate vor fi scrise in
stream(adica in fluxul de date deschise pentru un anumit fisier).
Functia utilizeaza aceiasi specificatori de format ca si printf().
Atunci cand se introduc simultan mai multe date,functia trebuie sa contina
cate un specificator de format pentru fiecare argument al functiei,chiar
daca sunt date de acelasi tip.
SINTAXA GENERALA este:
int fprintf(FILE *fp,const char *format,...);
Daca functia a fost executata cu succes,returneaza numarul de caractere
scrise,iar in caz de eroare returneaza EOF (sfarsitul fisierului).
EXEMPLU: #include
#include
#include
char[80];
int y;
FILE *flux;
void main()
{
clrscr();
printf("Introduceti un anumit numar de caractere: \n");
scanf("%80s",&x);
fopen("TEXT.C","w+t");
y=fprintf("TEXT.C","%s",x);
printf("\n Numarul de caractere introdus in fisier este: \n");
printf("%d",y);
sleep(3);
}
Observati ca spre deosebire de printf(),functia trebuie sa contina si
numele fisierului("stream-ului") in care se vor scrie datele.
EXEMPLUL 2: #include
#include
#include
#include
FILE *numere;
int i=10;
float pi=3.14159265;
char text[40]="Exemple de numere reale:";
double long numar=7E+54*7E+83;
void main()
{
clrscr();
numere=fopen("NUMERE.C","w+");
fprintf(numere,"%s %i %f %LG",text,i,pi,numar);
fclose(numere);
system("type NUMERE.C");
sleep(5);
}
Observati ca s-au introdus patru tipuri de date(pentru fiecare exista un
specificator de format).Pentru afisarea datelor scrise in fisier s-a uti-
lizat si functia suplimentara "system" care apeleaza rutina MS-DOS.
-89- [stdio.h - fwrite()]
FUNCTIA fwrite()
-scrie date in stream (in flux)
Spre deosebire de functia fprint(),care scrie date formatate,functia
fwrite() scrie datele in formatul specificat prin comanda.Astfel se va
putea scrie un numar intreg in format de 10 biti,sau un caracter in format
de 10 biti etc.Prin definitia functiei se specifica atat numarul de ele-
mente scrise cat si formatul lor.
SINTAXA GENERALA este:
size_t fwrite( const void *buffer,size_t size,size_t count,FILE *stream)
unde:
*buffer-este pointerul catre datele ce urmeaza sa fie scrise(adresa de la
care se vor citi datele sau constanta ce va fi scrisa)
size_t size-este dimensiunea fiecarui element exprimata in biti
count-este numarul maxim de elemente ce vor fi scrise
stream-este pointerul spre fila de structura (fluxul de date deschis)
In urma executiei,functia returneaza numarul de elemente scrise in stream
in formatul specificat.Daca intervine o eroare,numarul de elemente scrise
va fi mai mic decat cel specificat prin "count" iar indicatorul de pozitie
in interiorul fluxului(filei virtuale) nu va putea fi determinat.
Atentie !-functia nu returneaza numarul de biti ocupati in memorie ci doar
numarul de elemente scrise.Pentru a obtine spatiul de memorie ocupat se
va inmulti numarul de elemente cu numarul de biti specificati pentru
format.
In urma executiei,pointerul orientat catre flux(cel specificat prin
*stream) va fi incrementat cu numarul de biti adaugati in flux.In caz ca
fluxul(fila virtuala) a fost deschis in modul "text",fiecare caracter de
sfarsit de rand(carriage-return) va fi inlocuit cu perecchea de caractere
ce specifica inceputul randului urmator(carriage return+linefeed),dar
aceasta inlocuire nu va afecta valoarea returnata de catre functie.
Functia este importanta,mai ales atunci cand doriti sa introduceti datele
cu un format diferit de cel standard (Exemplu :caractere scrise pe mai
mult decat un bit etc.) sau cand doriti sa realizati si o conversie de
format in acelasi timp cu scrierea datelor.
Pentru preluarea datelor scrise cu fwrite() se va utiliza functia fread(),
dupa ce se va utiliza functia rewind() pentru repozitionarea cursorului
la inceputul filei scrise(in caz contrar,cursorul ramane la sfarsitul fi-
lei si datele nu pot fi citite).
EXEMPLU: scrierea si citirea ulterioara a unui singur caracter izolat
1 #include
2 #include continuare:
3 #include
4 FILE *fila1; 13 printf("S-a introdus litera:");
5 char *t; 14 sleep(3);
6 int x; 15 rewind(fila1);
7 int y; 16 y=fread(&t,1,1,fila1);
8 void main() 17 printf("\n%c",t);
9 { 18 sleep(5);
10 clrscr(); 19 }
11 fila1=fopen("TEST.txt","wt+");
12 x=fwrite("a",1,1,fila1);
Numarul de elemente returnat de functii este salvat in x si respectiv y.
-90- [stdio.h - fread() ]
Pentru a salva mai mult decat un singur element,definitia functiei tre-
buie sa precizeze numarul maxim de elemente si formatul lor.
EXEMPLU:
#include
#include
#include
FILE *fila1;
char *text[80];
char *t[80];
void main()
{
clrscr();
printf("Introduceti un sir de caractere (fara spatii goale) \n");
scanf("%80s",&text);
fila1=fopen("TEST.txt","wt+");
fwrite(text,8,10,fila1);
printf("S-a introdus in memorie sirul:");
sleep(3);
rewind(fila1);
fread(&t,8,10,fila1);
printf("\n%s",t);
sleep(5);
}
In mod normal nu are rost sa utilizati formate mai mari decat cele stan-
dardizate,deoarece vor ocupa inutil toata memoria de operare,dar uneori
este necesar sa se realizeze compatibilitatea cu datele dintr-o anumita
fila sau dintr-un fisier etc.Toate operatiile din fisierele si filele vir-
tuale din "stream" sunt identice si compatibile cu cele din fisierele si
filele arhivate in memoria fizica,cu singura deosebire ca sunt volatile.
FUNCTIA fread()
-citeste date din stream
Functia se utilizeaza pentru a prelua date din flux,de obicei pentru date-
le scrise cu fwrite().Functia va prelua din flux numarul si formatul datei
pentru fiecare element,dupa cum este specificat prin definitia functiei.
SINTAXA GENERALA este:
size_t fread(void*buffer,size_t size,size_t count,FILE *stream);
unde:
buffer-este locatia la care se vor arhiva datele(adresa de arhivare)
size_t size-este dimensiunea in biti a fiecarui element citit
size_t count-este numarul maxim de elemente ce vor fi citite
stream-este pointerul spre fila de structura (numele fluxului deschis)
Dupa executie functia returneaza numarul de elemente citite efectiv.Daca
imtervine o eroare in timpul citirii,sau daca intervine sfarsitul filei,
inainte de epuizarea numarului de elemente specificate prin "count",atunci
numarul returnat va fi mai mic decat cel din "count".Pentru a face dife-
renta dintre o eroare si sfarsitul fisierului,se poate utiliza functia
feof() sau respectiv ferror().Daca numarul specificat prin "count" este
zero,atunci functia fread() va returna zero iar adresa va fi nemodificata.
Dupa citirea datelor,pointerul spre fila de structura(*stream) va fi in-
crementat cu numarul de biti cititi efectiv din flux.
-91- [stdio.h - rewind() ]
Daca fluxul de date(fila virtuala) a fost deschis in modul "text" atunci
Dostları ilə paylaş: |
|
|