Limbajul c si C++ abc-doar


ordine si redenumeste programul dorit la numele urmator din lista sin-



Yüklə 4,6 Mb.
səhifə13/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   9   10   11   12   13   14   15   16   ...   55

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

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   9   10   11   12   13   14   15   16   ...   55




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin