|
fiecare pereche de caractere speciale de tip "carriage return-linefeed"
|
səhifə | 14/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| fiecare pereche de caractere speciale de tip "carriage return-linefeed"
va fi inlocuita prin caracterul special "linefeed",fara ca aceasta modi=
ficare sa afecteze rezultatul returnat.Daca citirea a fost intrerupta de
catre o eroare,numarul de elemente citite partial va returna o valoare
nedeterminata(nu returneaza valoare).
Functia se utilizeaza pentru a prelua date din fila virtuala,atunci cand
cunoasteti exact formatul datelor arhivate(in caz contrar este mai utila
functia fscanf() care citeste datele in format standard).
EXEMPLU :
#include
#include
#include
FILE *fila1;
int *t;
int *z;
void main()
{
clrscr();
printf("Introduceti un numar mai mic decat 32000 : \n");
scanf("%d",&z);
fila1=fopen("NUMERE.bin","wb+");
fwrite(&z,80,1,fila1);
printf("\n Numarul este:");
sleep(3);
rewind(fila1);
fread(&t,80,1,fila1);
printf("\n%d",t);
printf("\n In reprezentare hexazecimala numarul este:");
printf("\n%x",t);
sleep(7);
}
In exemplu,un numar preluat de la tastatura este scris in memorie si apoi
este citit si convertit la valoarea hexazecimala.Numerele in format hexa-
zecimal se utilizeaza mai ales pentru desemnarea unor adrese de memorie,
sau pentru economisirea memoriei de operare(ocupa mai putin spatiu).
In etapa actuala,aceste "economii" de cate un singur bit par desuete,dar
in epoca de pionierat ele au insemnat un important succes pentru opera-
tiile cu numere mari.
FUNCTIA rewind()
repozitioneaza pointerul filei la inceputul fluxului(filei virtuale)
SINTAXA GENERALA este: void rewind(FILE *stream);
Functia nu returneaza nici o valoare.Se utilizeaza pentru a repozitiona
cursorul la inceputul filei.Se utilizeaza mai ales pentru citirea datelor
sau pentru suprascrierea lor.Rezultatul functiei este similar cu:
void fseek(stream,0L,SEEK_SET);
dar spre deosebire de fseek() sterge indicatorul de eroare cat si indica-
torul de sfarsit de fila(EOF) si nu returneaza nici o valoare.
EXEMPLE:-vezi exemplele de la fwrite() si fread()
-92- [ stdio.h - ftell() ]
FUNCTIA ftell()
returneaza pozitia curenta a cursorului
Se utilizeaza pentru a afla pozitia la care se afla cursorul in stream,sau
in fila deschisa in stream(in memoria de operare).Pozitia este exprimata
in octeti(bytes),incepand cu primul octet din fila(daca fila este binara)
sau respectiv cu primul caracter sau spatiu daca fila este de tip text.
Valoarea returnata de catre functia ftell poate fi utilizata pentru o
alta apelare succesiva a unei functii ftell().
SINTAXA GENERALA este: long int ftell(FILE *stream)
Daca functia este aplicata cu succes,va returna pozitia curenta a cursoru-
lui.In caz de eroare,functia returneaza -1L si seteaza variabila errno la
o valoare pozitiva(inregistreaza eroarea),care poate fi EBADF(bad file
pointer),ESPIPE(illegal seek on device)sau EINVAL(invalid stream argument)
In cazul filelor de tip text,valoarea returnata reflecta pozitia logica a
cursorului care poate fi diferita de cea fizica,deoarece in mod text la
fiecare sfarsit de rand se asociaza un caracter carriage-return.Pentru a
determina o anumita pozitie fizica din stream(memoria de operare) se poate
asocia functia ftell() cu functia fseek().
Daca functia se aplica unor unitati de lucru ce nu pot fi accesate la
nivel fizic al memoriei(Exemple:ecranul sau imprimanta),atunci valoarea
returnata de catre functie va fi nedefinita.
In caz ca o fila este deschisa pentru anexare de date(cu a+),cursorul
va fi deplasat intotdeauna la sfarsitul filei,inainte de a incepe orice
operatie de adaugare a datelor,iar functia ftell() va returna pozitia la
care va incepe urmatoarea operatie I/O.
In modul text,CTRL+Z va fi interpretat ca si caracter end-of-file.
Daca nu s-a efectuat nici o operatie I/O cursorul va fi la inceputul filei
EXEMPLU:
#include
#include
#include
FILE *flux1;
int z;
main()
{
clrscr();
for (z=1;z<15;z++)
{
flux1=fopen("FILA1.TXT","a+");
fprintf(flux1,"text");
printf("Pozitia cursorului este la octetul %d\n",ftell(flux1));
sleep(2);
};
}
Observati ca la fiecare pas al buclei for,cursorul inainteaza cu cate
patru octeti ca urmare a adaugarii cuvantului "text" in memorie.
Daca pentru exercitiul de mai sus deschideti fisierul doar pentru scriere
(cu w+) in loc de adaugare(cu a+),atunci la fiecare pas al buclei cuvantul
"text" va fi suprascris iar pozitia finala a cursorului va ramane nemodi-
ficata pe octetul cu numarul 4 (cuvantul "text" este format din patru
caractere si ocupa 4 octeti de memorie).
-93- [ stdio.h - fseek() ]
FUNCTIA fseek()
repozitioneaza cursorul in stream
Se utilizeaza pentru a schimba pozitia curenta a cursorului in interiorul
fluxului de date(stream) sau in interiorul filei deschisa in stream.
SINTAXA GENERALA este:
int fseek(FILE *stream,long offset,int whence);
unde FILE *stream este pointerul spre fila(flux)
long offset este numarul de octeti cu care se va deplasa cursorul
int whence este reperul fata de care se va face deplasarea,care poate
fi 0,1,sau 2 cu semnificatia 0=inceputul filei 1=pozitia curenta si
2=sfarsitul filei (ca in tabelul urmator):
CONSTANTA whence(reperul) locatia de reper
------------------------------------------------------------------
SEEK_SET 0 inceputul filei
SEEK_CUR 1 pozitia curenta
SEEK_END 2 sfarsitul filei
Noua pozitia a cursorului va fi deplasata fata de reperul precizat prin
whence cu atatia octeti cati sunt precizati prin offset.
Dupa aplicarea functiei fseek() poate urma o operatie de input sau de out-
put(de introducere sau de preluare a datelor din memorie).
Daca functia a fost executata cu succes,returneaza valoarea zero iar
in caz contrar returneaza o valoare nonzero.In unele situatii este posibil
ca functia sa returneze zero si fara sa fi efectuat deplasarea cursorului
deoarece sistemul DOS care realizeaza efectiv deplasarea cursorului nu
verifica noua pozitie ci doar daca functia a fost apelata corect.Functia
returneaza un cod de eroare doar daca a fost apelata pentru o fila nedes-
chisa in memorie sau pentru o unitate nedeschisa(inactiva).In aceste
cazuri va seta variabila errno la una dintre urmatoarele valori:
EBADF(bad file pointer) EINVAL(invalid argument) ESPIPE(illegal seek on
device).
Dupa deplasarea cursorului,urmatoarea operatie I/O se va efectua la noua
locatie.Functia se poate utiliza pentru a repozitiona cursorul in orice
locatie a filei,sau chiar in afara filei (dincolo de EOF).Functia sterge
indicatorul EOF si neaga efectul oricarei apelari anterioare prin ungetc.
Daca fila a fost deschisa pentru anexarea de date (cu a+),atunci pozitia
curenta a cursorului este determinata de ultima operatie I/O si nu de cea
a viitoarei pozitii pentru adaugarea de date,iar in caz ca nu a fost efec-
tuata nici o operatie I/O,pozitia cursorului va fi la inceputul filei.
Pentru filele de tip text,functia poate returna valori derutante date
de caracterele de tip carriage return-line feed de la capatul randurilor.
Valorile cert exacte sunt cele fara deplasare (cu offset zero) sau cele
la care se utilizeaza ca reper inceputul filei iar offset-ul pentru depla-
sare se calculeaza prin raportare la valoarea returnata de functia ftell()
Deasemenea,in filele de tip text,CTRL+Z va fim interpretat ca si caracter
de tip end-of-file(EOF),fapt ce poate determina confuzii in cazul depla-
sarilor prin raportare fata de sfarsitul filei.Exista si situatii in care
caracterul EOF este sters,iar raportarea fata de el este confuziva.
Functia se poate utiliza repetat in interiorul aceleiasi file,iar
pentru cresterea sigurantei se poate combina cu functia ftell(),astfel
incat deplasarile cursorului sa fie cat mai corecte.
-94- [stdio.h - fgetpos() ]
EXEMPLU:
#include
#include
#include
FILE *flux1;
main ()
{
clrscr();
flux1=fopen("FILA1.TXT","w+");
fprintf(flux1,"Exercitiu de editare in memoria de RAM");
fseek(flux1,0,1);
printf("Pozitia cursorului este la octetul %d\n",ftell(flux1));
sleep(3);
fseek(flux1,-23,1);
printf("Pozitia noua a cursorului este la octetul %d\n",ftell(flux1));
sleep(3);
fseek(flux1,5,0);
printf("Pozitia finala este la octetul %d\n",ftell(flux1));
sleep(3);
}
In exemplu,in primul caz fseek() nu deplaseaza cursorul (offsetul este 0)
fata de pozitia curenta,apoi deplaseaza cursorul cu -23 de octeti fata
de pozitia curenta (offest -23 si whence 1) iar in final deplaseaza
cursorul cu cinci octeti fata de inceputul filei(offest 5 si whence 0 ).
Schimband valoarea pentru offset,puteti deplasa cursorul inclusiv in
afara filei.Pentru exersarea functiei,incercati sa scrieti date intr-o
fila deschisa in stream si apoi sa le preluati sub forma de tabel.
FUNCTIA fgetpos()
-gaseste si salveaza intr-o variabila pozitia cursorului in stream
SINTAXA GENERALA este: int fgetpos(FILE *stream,fpos_t *pos);
Functia gaseste pozitia cursorului in fluxul de date sau fila virtuala
deschisa in memorie si salveaza pozitia acestuia in pointerul specificat
prin "pos".Valoarea astfel salvata poate fi utilizata ulterior pentru
functia fsetpos() cu scopul de a aduce cursorul la o anumita pozitie in
interiorul filei virtuale.
Daca functia a fost executata cu succes,returneaza valoarea zero,iar
in caz de eroare,returneaza o valoare nonzero si salveaza in variabila
globala de sistem "errno" una dintre valorile EBADF(bad file number) sau
EINVAL(invalid number).
Valoarea arhivata in obiectul spre care se orienteaza pointerul pos
este salvata intr-un format intern si este destinata doar pentru a putea
fi utilizata de catre functiile fgetpos() si fsetpos(),cu scopul de a
pozitiona cursorul(nu se va utiliza in operatii matematice).
fpos_t este tipul de data utilizat pentru inregistrarea informatiilor
referitoare la pozitia cursorului in interiorul unei file.Se utilizeaza
doar pentru functiile fgetpos() si fsetpos() si poate fi de tipul long
integer,__int64 sau de alt tip in functie de versiunea de program utili-
zata.In principiu este in concordanta cu numarul maxim de pozitii posibile
ale cursorului,in interiorul filei deschisa in memoria de operare (cu cat
memoria este mai mare,cu atat si fila deschisa poate fi mai mare).
-95- [stdio.h - fsetpos() ]
EXEMPLU: #include
#include
void showpos(FILE *stream);
FILE *stream;
fpos_t pos;
main()
{
stream=fopen("TEXT.txt","w+");
fprintf(stream,"Acest text contine 35 de caractere!");
fgetpos(stream,&pos);
printf("Pozitia cursorului in fila este: %d\n",pos);
sleep(5);
stream=fopen("TEXT.txt","a+");
fprintf(stream,"Text adaugat din 32 de caractere");
fgetpos(stream,&pos);
printf("Pozitia noua este: %d\n",pos);
sleep(5);
}
Pentru variabila pos puteti utiliza cu succes si tipul long int.Functia
este utila mai ales atunci cand doriti sa reveniti de mai multe ori la
o anumita pozitie din interiorul filei,sau pentru a marca pozitia unei
anumite date sau informatii in interiorul filei virtuale.
FUNCTIA fsetpos()
-pozitioneaza cursorul in interiorul filei virtuale(in stream)
SINTAXA GENERALA este: int fsetpos(FILE *stream,const fpos_t *pos);
Functia se utilizeaza pentru a schimba pozitia curenta a cursorului in
interiorul unei file deschise in memoria de operare,sau pentru a declara
pozitia initiala a cursorului in fila.Pozitia cursorului va putea fi
declarata si utilizand valoarea salvata de catre o functie fgetpos()
aplicata anterior,pentru a deplasa cursorul la pozitia respectiva(de
exemplu pentru a citi de mai multe ori un text sau o anumita data).
La aplicarea functiei,se va sterge automat indicatorul EOF(end of file)
si se va anula evectul unei eventuale functii ungetc() aplicata anterior.
Dupa deplasarea cursorului cu fsetpos(),poate urma atat o operatie de
introducere de date(scriere) cat si o operatie de preluare de date(citire)
In caz ca functia a fost aplicata cu succes se va returna valoarea zero
iar in caz de eroare se va returna o valoare nonzero iar variabila globala
"errno" va primi una dintre valorile: EBADF(bad file) sau EINVAL(invalid
number).Mesajele de eroare sunt generate atunci cand se specifica o fila
care nu exista sau nu este deschisa in memoria de operare,cand se utili-
zeaza pentru pointerul filei un obiect incompatibil cu preluarea numarului
returnat de functie sau daca se specifica un stream care nu exista sau
nu a fost declarat in memoria de operare.
Semnificatia pentru fpos_t este accesi ca si pentru functia fgetpos(),
respectiv specifica tipul de data utilizat pentru arhivarea valorii retur-
nate de functie.De obicei poate fi inlocuita cu succes si prin long int.
Functia se utilizeaza impreuna cu fgetpos() pentru a putea reveni de mai
multe ori la o anumita pozitie in interiorul filei,pentru a lasa spatii
goale,pentru a suprascrie unele date etc.
-96- [stdio.h - fgetc() ]
EXEMPLU:#include
#include
void showpos(FILE *stream);
FILE *stream;
int z;
main()
{
stream=fopen("TEXT.txt","w+");
fprintf(stream,"Acest text contine 35 de catactere!");
showpos(stream);
}
void showpos(FILE *stream)
{
for (z=1;z<9;z++)
{
pos=z;
fsetpos(stream,&pos);
printf("Pozitia cursorului in fila este: %d\n",pos);
sleep(1);
};
}
Observati ca pe langa functia principala main() am utilizat o a doua
functie denumita showpos() destinata special pentru deplasarea cursorului
si apelata din interiorul functiei main().Incercati un exercitiu simplu
in care sa deplasati cursorul cu fsetpos() si apoi sa cititi pozitia
cursorului cu fgetpos().
FUNCTIA fgetc()
-preia un caracter din stream (din fila virtuala)
SINTAXA GENERALA este: int fgetc(FILE *stream);
Functia returneaza primul caracter care urmeaza in fluxul de date sau in
fila virtuala deschisa in memorie(urmatorul fata de pozitia cursorului).
La capatul filei sau in caz de eroare returneaza EOF.
EXEMPLU: #include
#include
FILE *stream;
int z;
long int x;
char y;
main ()
{ stream=fopen("Text.txt","w+");
fprintf(stream,"Acest text contine 35 de caractere!");
for (z=0,z<36,z++)
{
x=z;
fsetpos(stream,&x);
y=fgetc(stream);
printf("Litera citita este : %c\n",y);
sleep(1);
};
}
-97- [stdio.h - fputc(),fgetchar() ]
FUNCTIA fputc()
-introduce un caracter in stream(sau in fila virtuala)
SINTAXA GENERALA este: int fputc(int c,FILE *stream)
Functia introduce in fila virtuala desemnata prin pointerul *stream(care
trebuie sa fie deschisa in memorie),caracterul desemnat prin valoarea
int c.Caracterul va fi introdus la pozitia cursorului.Functia se poate
utiliza pentru a corecta un text,o comanda,o instructiune,o valoare etc.
Functia returneaza caracterul introdus iar in caz de eroare returneaza
EOF.
In caz ca fila deschisa in memorie nu permite pozitionarea cursorului
la adresa indicata,sau daca fila a fost deschisa pentru adaugare de date
(cu optiunea a+),atunci caracterul introdus de catre functie va fi adaugat
la sfarsitul filei.Functia permite adaugarea unui singur caracter.
EXEMPLU: #include
#include
#include
FILE *stream;
int z;
char y;
main()
{
clrscr();
printf("CARACTERELE ASCII SUNT: \n\n");
stream=fopen("TEXT.txt","w+");
for (z=0;z<255;z++)
{
fputc(z,stdout);
printf(" %c",y);
sleep(1);
};
}
Observati ca in locul filei virtuale am introdus caracterele direct pe
ecran cu ajutorul constantei stdout(care desemneaza un stream predefinit
automat,ce se incarca la lansarea programului si desemneaza dispozitivul
periferic de afisare a datelor:ecran,imprimanta,retea etc.).Remarcati
faptul ca se si executa caracterele functionale(de exemplu line-feed si
carriage return -cele care marcheaza sfarsitul de rand.
Incercati un exercitiu in care deschideti o fila virtuala,scrieti un
text oarecare iar apoi schimbati o litera sau o cifra cu ajutorul functiei
fputc()-atentie la pozitionarea cursorului.
FUNCTIA fgetchar()
-preia un caracter de la tastatura (de la dispozitivul de intrare)
SINTAXA GENERALA este: int fgetchar(void);
Functia returneaza primul caracter introdus de la dispozitivul de intrare
a datelor (tastatura,placa de retea,modem etc.).
Daca functia a fost aplicata cu succes,returneaza caracterul citit,dupa
conversia acestuia la o valoare de tip int(fara semn).In caz de sfarsit
de fila,sau in caz de eroare,functia returneaza EOF.
Functia este echivalenta cu fgetc(stdin) si respectiv este similara cu
functia getchar().
-98- [ stdio.h - fputchar() ]
Functia asteapta pana cand se introduce un caracter de la dispozitivul de
intrare.
EXEMPLU: #include
#include
#include
FILE *stream;
int z;
char y;
main()
{
clrscr();
printf("Introduceti un caracter de la tastatura:\n\n");
y=fgetchar();
printf("Caracterul introdus este:\n");
printf("%c",y);
sleep(3);
}
FUNCTIA fputchar()
-introduce un caracter pe ecran(pe dispozitivul de iesire actual)
SINTAXA GENERALA este: int fputchar(int c)
Functia introduce pe ecran caracterul desemnat prin valoarea data de
int c(respectiv pe imprimanta sau in tamponul de iesire a datelor in retea
sau in orice alt dispozitiv de iesire activat in momentul respectiv).
Functia este identica cu fputc(stdout) si este similara cu putc().
In caz ca functia a fost executata cu succes,returneaza caracterul spe-
cificat prin valoarea lui c.In caz de eroare,returneaza EOF.
Dostları ilə paylaş: |
|
|