|
|
səhifə | 15/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| 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
Dostları ilə paylaş: |
|
|