Limbajul c si C++ abc-doar



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

EXEMPLU: #include

#include

#include

char mesaj[]="Acesta este un exercitiu de scriere pe ecran!";

int i=0;

main()

{

clrscr();

while (mesaj[i])

{

fputchar(mesaj[i]);

i++;

sleep(1);

}

sleep(5);

}

Conditia specificata prin while se poate citi astfel: "bucla se va execu-

ta atat timp cat constanta de tip caracter denumita mesaj returneaza o

valoare nenula" iar in cadrul buclei,la fiecare pas se incrementeaza cu

1 valoarea lui i (pana la epuizarea constantei de tip caracter).
Pe langa functiile fgetc(),fputc(),fgetchar() si fputchar(),limbajul

C++ admite si functiile fgetwc(),fputwc(),_fgetwchar() si _fputwchar(),

care sunt identice ca actiune,dar returneaza caracterul scris cu majuscula.


-99- [ stdio.h - fputs() ]

FUNCTIA fgets()

-preia un sir din stream(din fila virtuala)

SINTAXA GENERALA este: char *fgets(char *s,int n,FILE *stream);

Functia citeste caractere din fluxul de date specificat prin "stream" si

le salveaza in variabila de tip caracter specificata prin "*s".Functia

se va opri din citire dupa in numar de caractere egal cu cel specificat

prin "int n minus unu" sau daca intalneste caracterul "new line"(daca

cursorul a ajuns la capatul randului).Sirul de caractere preluat va fi

salvat in variabila s,la capatul acesteia.Sfarsitul sirului va fi marcat

printr-un caracter nul ce se va adauga la capatul randului.

Daca functia a fost executata cu succes,returneaza valoarea sirului

spre care pointeaza pointerul *s.In caz de eroare sau daca pozitia curso-

rului este la sfarsitul filei,functia va returna un caracter nul.

EXEMPLU: #include

#include

char text[]="abcdefghijklmnopqrstuvwxyz";

FILE *fila1;

char mesaj[80];

int nr;

main()

{

fila1 = fopen("PAGINA.TXT","w+");

fwrite(text,28,1,fila1);

for (nr=0;nr<26;nr++)

{

fseek(fila1,0,SEEK_SET);

fgets(mesaj,nr,fila1);

printf("%s\n",mesaj);

sleep(1);

};

sleep(3);

}

Functia este utila pentru a prelua siruri de caractere din memoria de

operare(de exemplu continutul mesajelor primite prin e-mail).

Limbajul C++,include si functia fgetws() care este identica,dar caractere-

le vor fi preluate cu majuscule.
FUNCTIA fputs()

-scrie un sir de caractere in stream(in fila virtuala)

SINTAXA GENERALA este: int fputs(const char *s,FILE *stream);

Functia scrie in fluxul de date din memoria de operare specificat prin

"stream" sirul de date continut in constanta de tip caracter specificata

prin "*s" la care va adauga si un caracter nul pentru marcarea sfarsitului

de sir.Functia nu adauga caracterul "new line" si nici caracterul nul de

la sfarsitul sirului(nu se dubleaza caracterul nul de sfarsit de sir).

Daca functia a fost executata cu succes,returneaza o valoare nenula,

iar in caz de eroare returneaza EOF.

Sirul va fi scris in stream la pozitia curenta a cursorului.

Limbajul C++ recunoaste si functia fputws(),care este identica dar toate

caracterele preluate din variabila vor fi scrise in stream(sau in fila

virtuala) cu majuscule.


-100-

EXEMPLU: #include

#include

char marcaj[80];

FILE *fila1;

char mesaj[80];

int nr;

main()

{

printf("Introduceti un sir de caractere(fara spatii)\n");

scanf("%80s",&marcaj);

fila1=fopen("PAGINA.TXT","w+");

fputs(marcaj,fila1);

for (nr=0;nr

{

fseek(fila1,0,SEEK_SET);

fgets(mesaj,nr,fila1);

printf("%s\n",mesaj);

sleep(1);

};

sleep(3);

}

Observati ca daca introduceti de la tastatura si un spatiu gol,acesta va

vi interpretat ca si sfarsitul sirului si va intrerupe citirea datelor.

Pentru determinarea lungimii sirului introdus de la tastatura am utilizat

si functia strlen() din .Incercati sa realizati un exemplu in

care sa deschideti mai multe file virtuale in care sa scrieti un set de

date.
FUNCTIA fdopen()

-deschide o fila in functie de numarul de manipulare a filei

SINTAXA GENERALA este: FILE *fdopen(int handle,char *type);

Functia asociaza un stream unei file ce a fost deschisa anterior.Pentru

deschiderea filei nu mai este necesar sa se precizeze calea de acces ci

doar numarul de manevrare a filei-cel specificat prin handle- care a fost

obtinut anterior prin executarea unei functii :open,creat,dup sau dup2.

-handle este numarul returnat de catre functiile open,creat,dup sau dup2

-*type specifica modul de deschidere al filei(atributele) si poate fi:

r -deschide fila doar pentru citire(read-only)

w -deschide fila pentru scriere(write)

a -deschide fila pentru adaugare(scrie la sfarsitul filei)

r+ -deschide fila pentru actualizare(read and write)

w+ -creaza o noua fila pentru actualizare(scrie si citeste)

a+ -deschide fila pentru adaugari/actualizari(sau creaza fila)

Pentru filele de tip text se poate adauga litera t astfel incat *type va fi

rt,wt,at,r+t,w+t sau a+t,iar pentru a specifica explicit o fila binara se

poate utiliza litera b,astfel incat *type va fi:rb,wb,ab,r+b,w+b sau a+b.

Daca nu se specifica explicit,functia va fi executata in functie de modul

de setare al variabilei fmode(O_BINARY,O_TEXT- care sunt definite in fila

de antet ).

Daca functia a fost executata cu succes returneaza un pointer spre noul

stream(spre fila virtuala nou deschisa),sau NULL in caz de eroare.


-101- [ stdio.h - freopen() ]

Dupa redeschiderea filei cu fdopen(),poate urma atat o operatie de

preluare a datelor cat si o operatie de introducere de date,dar daca se

vor executa operatii succesive este necesar sa se repozitioneze cursorul

cu ajutorul unei functii fseek() sau rewind().

Functia se utilizeaza doar pentru file care au fost deschise anterior

la care s-a arhivat intr-o variabila numarul de inregistrare=manipulare.

Limbajul C++ recunoaste si functia _wfdopen(),care este similara dar

utilizeaza doar majuscule pentru numele filei.

Compilatoarele Microsoft accepta si literele c(commit) respectiv n(no-

commit) care se pot utiliza pentru a desemna atributele filei(rc,wc,ac etc)

si specifica daca fila poate fi scrisa direct pe disc la prima apelare a

functiei fflush() sau _flushall() sau nu.Litera c permite scriere directa

pe disc(commit) iar n(valoarea implicita) nu permite scrierea directa pe

disc(nocommit).

Functia se utilizeaza in programe si aplicatii care deschid aceeasi

fila de mai multe ori in cursul executiei programului.

EXEMPLU: #include

#include

#include

#include

int handle;

FILE *stream;

main()

{

handle=open("C:\USR\TC\OUT\TEXT.C",O_CREAT);

printf("\n%s\n","S-a deschis fila solicitata:");

printf("%s\n","Numarul de manevrare al filei este:");

printf("%d\n",handle);

sleep(3);

stream=fdopen(handle,"r");

printf("\n%s\n","S-a redeschis fila:");

printf("%s","Pointerul spre fila este: \n");

printf("%d\n",stream);

sleep(5);

}
Observati ca am apelat initial functia open() din fila de antet

pentru care am utilizat si constanta O_CREAT definita in fila de antet

,pentru a returna numarul de manevrare a filei,numar ce poate

fi utilizat apoi in repetate randuri de catre functia fdopen().In caz

ca in calculatorul d-voastra programul TC este salvat in alt director

decat USR,corectati calea de acces spre fila solicitata(chiar daca fila

se creaza doar virtual in memoria de oparare).
FUNCTIA freopen()

-redeschide o fila sau deschide o fila noua

SINTAXA GENERALA este:

FILE *freopen(const char *filename,const char *mode,FILE *stream);

unde: const char *filename -este calea de acces la fila,scrisa explicit

const char *mode -este atributul de deschidere a filei

FILE *stream -este fila virtuala din memoria de operare(fluxul)


-102- [stdio.h - freopen() ]

Pentru descrierea caii de acces se va utiliza formula obisnuita.

Atributele de deschidere a filei sunt identice cu cele de la open(),fopen

() si fdopen() si se specifica prin literele r,w,a,r+,w+,a+,t si b.

Daca functia a fost executata cu succes returneaza un pointer spre fila

nou deschisa iar in caz de eroare returneaza NULL.Pointerul returnat se

va putea utiliza pentru redeschiderea ulterioara a filei.

Limbajul C++,recunoaste si functia _wfreopen(),care este identica dar

opereaza doar cu majuscule pentru numele filei.

EXEMPLU: #include

#include

#include

FILE *stream;

main()

{

stream=freopen("freopen.out","w",stderr);

if(stream==NULL)

fprint(stdout,"error on freopen \n");

else

{

fprint(stream,"This will go to the file freopen.out \n");

fprint(stdout,"succesfully reassigned \n");

fclose(stream);

};

system("type freopen.out");

perror("Eroare=");

sleep(5);

}

Pentru a observa efectiv redeschiderea succesiva a unui alt fisier,salvati

intr-o fila denumita TEXT1.c urmatorul mesaj: "TEXT EXEMPLIFICATIV" si

apoi in alta fila denumita TEXT2.c mesajul: EXEMPLU DE EDITARE IN MOD TEXT

utilizand New si Write to din meniul File,apoi scrieti urmatorul exemplu:

EXEMPLU: #include

#include

#include

#include

int handle;

FILE *stream;

main()

{

handle=open("C:\USR\TC\TEXT1.C",O_RDONLY);

printf("\n Fisierul TEXT1 contine mesajul: \n");

system("type TEXT1.C");

freopen("C:\USR\TC\TEXT2.C","r+",stream);

printf("\n Fisierul TEXT2 contine mesajul: \n");

system("type TEXT2.C");

perror("\n Eroare= ");

sleep(10);

}

Pentru verificare am utilizat functia type din MS-DOS si functia perror().

Daca programul d-voastra este in alt director decat USR,corectati calea

de acces astfel incat programul sa poata identifica fisierele text.


-103- [ stdio.h - fcloseall() ]

FUNCTIA fclose()

-inchide un stream(fluxul de date utilizat pentru a deschide o fila)

SINTAXA GENERALA este: int fclose(FILE *stream);

Se utilizeaza pentru a inchide o fila virtuala din memoria de operare(mai

exact fluxul de date utilizat pentru deschiderea filei in memoria de ope-

rare).La inchidere se vor elibera si toate tampoanele de memorie asociate

filei respective,inclusiv tampoanele de memorie utilizate de catre sistem

pentru manipularea filei.Tampoanele atribuite cu ajutorul functiilor

setbuf si setvbuf nu vor fi sterse automat si necesita comenzi speciale.

In caz ca functia a fost executata cu succes,returneaza zero,iar in caz

de eroare returneaza EOF.

Functia inchide doar fila specificata prin FILE *stream(cea spre care

este orientat pointerul specificat).

EXEMPLU: #include

#include

FILE *stream;

main()

{

stream=fopen("FILA1.txt","a+");

printf(" \n S-a deschis fila virtuala!");

sleep(3);

fclose(stream);

printf(" \n S-a inchis fila virtuala(fluxul de date)!");

sleep(5);

}
FUNCTIA fcloseall()

-inchide toate filele din memoria de operare(stream-urile) cu exceptia

celor standardizate(stdin,stdout,stdprn si stderr sau stdaux)

SINTAXA GENERALA este: int fcloseall();

Functia returneaza numarul de file inchise daca a fost executata cu succes

sau EOF in caz de eroare.Functia elibereaza si tampoanele asociate filelor

inchise.In C++ are forma _fcloseall().

EXEMPLU: #include

#include

int nr;

main()

{

fopen("FILA1.txt","w+");

fopen("FILA2.txt","w");

fopen("FILA3.txt","a+");

fopen("FILA4.txt","a");

nr=fcloseall();

printf(" \n Numarul de file inchise este: ");

printf("\n%d",nr);

sleep(5);

}

Functia se utilizeaza pentru a elibera memoria de operare si tampoanele de

memorie asociate filelor si este cu atat mai importanta cu cat memoria de

operare este mai mica.Rezultatul returnat nu include si filele deschise

doar pentru citire(cele cu atributul "r").


-104- [stdio.h - ferror() ]

FUNCTIA feof()

-detecteaza caracterul EOF(end of file) intr-un stream(fila virtuala)

SINTAXA GENERALA este: int feof(FILE *stream);

Functia este un macro,care detecteaza prezenta caracterului ASCII EOF.

Daca indicatorul EOF a fost identificat in fila respeciva,nu se vor mai

putea efectua operatii de citire din fila respectiva(read returneaza EOF),

pana cand nu se va apela o functie rewind() pentru reluarea citirii sau

pana cand se va inchide fila.Indicatorul EOF se reseteaza automat dupa

fiecare operatie de input(introducere de date noi).

Daca functia a fost executata cu succes,returneaza o valoare nonzero

daca a identificat caracterul EOF,sau respectiv zero (0) daca nu a iden-

tificat caracterul EOF.In caz de eroare,functia nu returneaza nimic.

FILE *stream este pointerul orientat spre fila virtuala.

Se pot utiliza si functiile fsetpos,fseek sau clearerr pentru a reseta

functia read si a permite citirea ulterioara a datelor.

EXEMPLU: #include

#include

FILE *pagina1;

int z;

int y;

main()

{

pagina1=fopen("FILA1.TXT","r");

control();

for (z=0;z<3;z++)

{

getc(pagina1);

};

control();

}

control()

{

if feof(pagina1)

{

printf("Sfarsitul filei virtuale!\n");

}

else

{

printf("Pagina virtuala este activa!\n");

}

y=feof(pagina1);

printf("%d\n",y);

fclose(pagina1);

sleep(4);

}
FUNCTIA ferror()

-detecteaza aparitia unei erori in stream (in fila virtuala)

SINTAXA GENERALA este: int ferror(FILE *stream);

Functia feof() este de fapt un macro care detecteaza aparitia erorilor de

scriere si/sau citire in interiorul unei file virtuale(stream).


-105- [ stdio.h - perror() ]

Daca functia detecteaza o eroare,returneaza o valoare nonzero,iar in

caz contrar returneaza zero.Dupa resetarea indicatorului de eroare,valoa-

rea acestuia va ramane neschimbata pana cand se apelaeaza una dintre fun-

ctiile rewind() sau clearerr() sau pana cand se inchide fila virtuala.

EXEMPLU: #include

#include

FILE *pagina1;

int z;

int y;

char text;

main()

{

pagina1=fopen("FILA.TXT";"r");

control();

fputc(10,pagina1);

control();

}

control()

{

y=ferror(pagina1);

printf("%d\n",y);

if ferror(pagina1)

{

printf("Eroare ! \n");

}

else

{

printf("Nu s-a depistat nici o eroare ! \n");

}

sleep(4);

}

Eroarea consta din incercarea de a scrie intr-o fila deschisa "read-only".
FUNCTIA perror()

-afiseaza un mesaj de eroare de sistem

SINTAXA GENERALA este: void perror(const char *s);

Functia va scrie in fila virtuala stderr(de obicei pe ecran),mesajul de

eroare generat de ultima rutina executata din program care a determinat

resetarea variabilei errno(variabila care arhiveaza ultimul mesaj de eroa-

re generat de executia aplicatiei).

Pentru prezentarea mesajului de eroare se poate utiliza un sir constant de

caractere(un mesaj),introdus prin pointerul *s(care este orientat spre

constanta ce contine mesajul dorit).

Aria de memorie in care sunt arhivate mesajele de eroare va fi accesa-

ta de catre variabila de sistem _sys_errlist care va transfera mesajul

actual in variabila de stocare errno.Variabila errno poate fi utilizata

pentru a afla mesajul de eroare asociat numarului de eroare generat.

Mesajele nu contin si caracterul new-line(vor fi scrise fara paragraf).

Variabila globala _sys-nerr inregistreaza numarul de intrari in aria de

mesaje(numarul de erori).

Limbajul C++ accepta si functia _wperror(),identica dar cu majuscule.


-106- [ stdio.h - perror() ]

Pentru ca functia sa returneze mesajul de eroare actual,trebuie sa fie

apelata imediat dupa functia care a depistat eroarea,deoarece in caz ca

exista mai multe erori consecutive,mesajele se vor suprascrie si nu va

fi returnat decat ultimul dintre ele.

EXEMPLU: #include

#include

FILE *pagina1;

main()

{

pagina1=fopen("***";"r");

perror("Eroarea este");

sleep(5);

}

In acest caz eroarea este generata de incercarea de a deschide o fila

care nu exista.Functia este utila pentru a depana programe si aplicatii.

Principalele mesaje de eroare sunt:

Constanta Mesajul propriu zis Valoarea

E2BIG Argument list too long 7

EACCES Permision denied 13

EAGAIN No more process,not enough memory

or maximum nesting level reached 11

EBADF Bad file number 9

ECHILD No spawned processes 10

EDEADLOCK Resource deadlock would occur 36

EDOM Math argument 33

EEXIST File exists 17

EINVAL Invalid argument 22

EMFILE Too many open files 24

ENOENT No such file or directory 2

ENOEXEC Exec format error 8

ENOMEM Not enough memory 12

ENOSPC No space left on device 28

ERANGE Result too large 34

EXDEV Cross-device link 18

Alte versiuni de program contin mesaje asemanatoare:

1.Arg list too big 2.Attempted to remove current directory 3.Bad adress

4.bad file number 5.Block device required 6.Broken pipe 7.Cross-device

link 8.Error 0 9.Exec format error 10.Executabile file in use 11.File

already exists 12.File too large 13.Illegal seek 14.Inappropiate I/O

control operationa 15.Input/output error 16.Interrupted function call

17.Invalid acces call 18.Invalid argument Resource busy 19.Invalid data

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   11   12   13   14   15   16   17   18   ...   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