You are on page 1of 6

Leksion 5

Skedaret

Kur ne shkruajme ne nje skedar (file si jemi mesuar ti referohemi)informacioni humbet nese fikim
kompjuterin. Kjo pasi informacioni I futur apo shtypur ndodhet ne memorjen volatile por nese ne
menyre ekzplicite e ruajme atehere ai kalon ne Hard Disk dhe behet I perhershem. Jemi duke folur per
te pakten dy bartes te ndryshem informacioni , te ndryshem ne rezervim te ndryshem ne akses dhe
shpejtesi aksesi.

Pavarsisht bartesit menyra e lexim-shkrimit te informacionit, mbetet e njejte dhe mbeshtetet mbi
konceptin e regjistrimit. Nje regjistrim-apo record eshte nje bashkesi te dhenash qe program I trajton sin
je I tere! Skedari vete eshte nje varg rekordesh te te njejtit tip, te vendosura ne disk.

Kemi dy lloje skedaresh:

1. Skedare tekst-ose skedare te vijueshem


2. Skedare binare-ose skedare me akses te drejtperdrejte

Ne skedaret tekst rekordet vendosen edhe fizikisht njeri pas tjetrit.Per te kapur njerin record duhet
bredhur prej fillimit I gjithe skedari pra kemi te bejme me kerkim sekuencial rekordi.

Ndryshem nga skedaret tekst ata binare pajisen me nje ID apo numer rekordi qe e lejon programin te
kape direct rekordin e deshiruar. Kjo,sepse dihet qe me pare ID-ja apo numri I identifikimit.

Menyra e deklarimit te vektoreve tekst:

FILE *f;

Perpara sesa te zhytemi ne detaje te skedareve le te kuptojme fillimisht konceptin e shenjuesve.

Dime qe nje variabel eshte nje zone e memorjes me nje emer, psh:

int x;

Perfaqeson nje zone ne memorje me madhesi san je int te ciles I referohemi ne program me emrin x.

x=10;

eshte instruksion qe ruan vleren 10 ne zonen e memorjes me emrin x.

Cdo vend ne memorje identifikohet me nje numer te cilen ne e quajme adrese e asaj zone memorjeje.

Nje shenjues eshte nje variabel I vecante!

Keshtu ndryshe nga variablat, vlera qe ai ruan eshte ose perfaqeson nje zone memorjeje pra ai ruan nje
adrese memorjeje!
Koncept!

Shenjuesi ruan adresen e nje variabli!

Ky pointer qe ruan nje adrese memorjeje ka nevoje per nje tip. Dhe ky nuk mund te jete nje numer I
plote! Tipi I te dhenes per poiinterat perkon me tipin e te dhenes qe ruhet ne memorje ne ate adrese qe
ruan shenjuesi. Sintaksa:

Tip_te_dhene * emrptr;

Psh:

int *p;

Qe do te thote p shenjon mbi nje numer te plote int.

Kujdes!

int *p,q;

Do te thote: p eshte pointer mbi nje numer te plote kurse q eshte nje variabel qe ruan nje numer te
plote.

Adresa!

Kur ne deklarojme nje variabel nuk jemi perseri ne ata qe e vendosim se ku ne memorje do te ruhet ai.
Kete e ben kompilatori dhe Sistemi I Operimit.Por ne momentin qe kjo adrese vendoset Ne C++ kemi
menyre te kapim apo lexojme ate adrese. Kjo behet me ane te operatorit &, psh:

int v;

int *p;

p=&v;

(ILUSTRO!)

Kujdes!

Nese themi :

int a=*p;

Atehere a merr vleren qe ruan variabli v, me ane te akseseimit te vleres se pointerit p I cili kapet me
sintaksen *p.

Ushtrim - fq - 153 fig.


Aritmetika e pointerave

Per pointerat mund te perdoren veprimet + dhe -.

Kur deklarojme tipin e te dhenes ne nje program, dime se kemi percaktuar madhesine ne memorje te
variablit per nje arkitekture te caktuar kompjuteri. Per shembull nje char ze 1B(mbase pak me shume ne
kompjuterat e rinj e te fuqishem).

Rast studimor

Supozojme se kemi 3 pointera:

char *ch;

short * sh;

long *l;

Dhe dime se ata shenjojne ne adresat: 1000,2000 dhe 3000 respektivisht. Tani, nese themi:

ch++;

sh++;

l++;

bejme qe:

ch te shenjoje ne adresen e 1001-te, sh mbi 2002 dhe l mbi 3004! Pse? Duke pranuar se short eshte 2B
dhe Long eshte 4B.

Operatoret e inkrementim/dekrementim-it kane precedence para operatorit te references (*). Keshtu:

*p++;

Do te thote:

*(p++);

Ose thene ndryshe:

Rrit vleren e pointerit (adresen) dhe jo vleren mbi te cilen ai shenjon!

Kurse:

*p++=*q++;

ka nje dallim:
Duke qene se operatoret e inkrementimit vijne pas shprehjes qe po vleresohet atehere fillimisht ndodh
kalimi I vleres se pointerit q ne pointerin p, thene ndryshe:

*p=*q;

p++;

q++;

Lidhja e pointerave me vektoret

Emri I nje vektori eshte nje pointer ne vetvete qe shenjon mbi adresen e pare te memorjes se alokuar
per elementet e vektorit, pra nese kemi:

int numra[20];

dhe

int *p;

Eshte e vlefshme vleredhenia:

p=numra;

tani p shenjon mi vektorin numra;

shembull:

# include <iostream>

int main()

int numra[5];

int *p;

p=numra;//p shenjon mbi vektor

*p=10;//jepi vleren 10 elementit te pare

p++;//rrit vleren e shenjuesit p me aq sasi Bytesh sa ne kalojme ne vendin e dyte te vektorit

*p=20;//jepi vleren 20 elementit qe shenjon shenjuesi p

p=&numra[2]; //jepi shenjuesit p vleren e adreses se elementit te trete te vektorit numra

*p=30;//jepi vleren 30 elementit qe shenjon shenjuesi p


p=numra+3; // Kalo dhe shenjo mbi elementin e 4t te vektorit numra

*p=40;// Jepi vleren 40 elementit qe shenjon shenjuesi p

p=numra;//Rikthe ose ripoziciono shenjuesin mbi elementin e pare

*(p+4)=50;//Poziciono shenjuesin 4 elemente me tej ne vector duke e rritur vleren e adreses se tij me

// 4*nr_Bytesh

for(int n=0;n<5;n++)

cout<<numra[n]<<,<<endl;

Rezultati : 10,20,30,40,50, ne kolone.

Le ti rikthehemi skedareve

Rrymat e skedareve

Ne librarine standarte fstream na ofrohet mundes per te derguar apo marrerryma nga dhhe drejt nje
skedari. Do te njihemi me shume me librarine <fstreams.h>

Pame si deklarohet pointeri I tipit FILE I cili shenjon mbi fillimin e nje skedari per t ruajtur dhe sintaksa
ishte :

FILE *f;

Nje instruksion qe do na duhet ta njohim eshte is_open() I cili kontrollon nese skedari eshte I hapur ose
jo.

Instruksion tjeter eshte:

File.open(file,mode)

Hap skedarin me emrin file sipas menyres mode ku mode mund te jete lexim, shkrim, lexim-shkrim etj.
Kurse File do te thote: bej qe poiinteri File te shenjoje mbi rreshtin apo karakterin e pare apo me sakte
ne fillim te ketij skedari per pune.

Cdo skedar ne fund te punes me te duhet mbyllur dhe kjo behet me ane te instruksionit:

File.close();
Sa I takon trajtimit te gabimeve, nje gabim me sakte nje kontroll per shmangie gabimi qe duhet te bejme
eshte ajo nese kemi arritur ne fund te skedarit apo jo dhe kjo behet me ane te instrukionit:

eof();

Shembull:

if(!eof())

//bej dicka

good() ; //instruksion qe tregon se iostream shkrimi mepare funksionoi

fail();//Kthen pergjigje nese dicka e papritur ka ndodhur

Operacionet e Input-it

Disa instruksione per input te paformatuar ne skedare jane:

get(); //shembull

in.get();//lexon nje karakter me ane te in dhe kthen vleren e tij integer, nese futim EOF atehere
kthen //end-of-file,ku , in eshte njelloj si objekti cin por I pashoqeruar me >> te cilat bashke me te
thjesht //bejne heqjen e hapesirave boshe.

in.get(c);//lexon nje karakter nga in ne c

in.get(p,n,t);//lexo te shumten n karaktere nga in ne [p:..) dhe perdor t si karakter perfundues

in.read(p,n);//lexo n karaktere nga in ne [p:)

Operacione output-I;

Keto ofrohen edhe nga libraria ostream! Disa intruksione jane:

out<<x;//shkruaj x ne out sipas tipit te x-it; x mund te jete nje tip aritmetik,shenjues,string ose
cfaredo //tipi per te cilin perdoruesi ka percaktuar nje operator;

out.put(c);// Shkruaj karakterin c ne out

out.write(p,n);//Shkruaj karakteret [p:p+n) ne out

out.flush();//bosho buffer-in dhe co karakteret ne destinacion

out.tellp();//jep shenjuesin e out-it//out.seekp(pos);//Vendos pointerin e out-it ne pozicionin pos;

You might also like