Limbajul c si C++ abc-doar


fiecare pereche de caractere speciale de tip "carriage return-linefeed"



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

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.

Yüklə 4,6 Mb.

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