You are on page 1of 19

SKEDARET

Skedaret
Skedari eshte nje varg regjistrimesh te te njejtit tip te cilet jane te vendosur
ne disk, shirita etj.
Nga ana tjeter nje regjistrim eshte nje bashkesi te dhenash qe programi i
trajton si nje te tere.
Cdo skedar ka nje emer, qe i lejon sistemit te operimet ta vecoje ate nga
skedaret e tjere.
Skedaret
Skedaret jane dy llojesh:
Skedare te vijueshem (ose skedare text)
Skedare me hyrje te drejtperdrejte (ose skedare binare)
Skedaret e Vijueshem
Regjistrimet vendosen njeri pas tjetrit
Per te hyre tek nje e dhene bridhet skedari nga fillimi, regjistrim pas
regjistrimi, deri sa te gjendet regjistrimi i kerkuar.
=> kerkimi shume i ngadalte
Skedaret Binare
Cdo rregjistrim eshte i paisur me nje nr regjistrimi (ID)
=> hyrje te drejteperdrejte ne regjistrim dhe jo nga fillimi
=> nenkupton qe ky nr duhet njohur qe me pare
=> kerkim i shpejte
Kerkimi dhe paraqitja e informacionit
Pasi percaktohet informacioni qe duam, ngarkohet Administruesi i Skedareve
ta kerkoje ate
Administruesi i Skedareve percakton faqen ku ndodhet regjistrimi i kerkuar
dhe ngarkon Administruesin e Diskut te kerkoje kete faqe
Administruesi i Diskut percakton vendodhjen fizike te faqes ne disk dhe
aktivizon veprimet e nevojshme H/D ne disk
Administruesi i Diskut
Administruesi i Skedareve
Administruesi i Skedareve duke perdorur lehtesirat qe i ofron Administruesi i
Diskut, i krijon pershtypjen perdoruesit sikur disku eshte nje bashkesi
skedaresh.
Administruesi i Diskut e lejon Administruesin e Skedareve te operoje vetem
me ane te H/D logjike te faqeve
Cdo bashkesi faqesh permban nje ose me shume skedare te rezervuar
Cdo skedar i rezervuar identifikohet nga emri ose ID-ja e skedarit
Cdo regjistrim i rezervuar identifikohet nga nje nr. regjistrimi ose nga ID-ja e
regjistrimit
Administruesi i Skedareve
Operacionet qe mund te kryeje jane:
Perseritje e regjistrimit
Zevendesim i nje regjistrimi
Shtim i nje regjistrimi
Largim i regjistrimit
Rezervim i nje skedari te ri
Fshirje e nje skedari
Skedaret Tekst
Ne ekzekutimin standart te programeve deri tani kemi bere transmetim ne
forme interaktive
Kjo menyre e futjes se te dhenave eshte e pershtatshme ne rastin kur sasia e
tyre eshte e vogel dhe paraqet disa mangesi:
Duhen rifutur te dhenat sa here qe ekzekutohet programi
Ne rast te gabimeve, te dhenat duhet te rifuten nga fillimi
Imagjinoni sasi te medha te dhenash
Rastet e mesiperme nuk do ishin mjaftueshem eficente => perdorimi i
skedareve
Skedaret Text
Te dhenat do shkruheshin ne skedar dhe programi do ti lexonte sa here te
ishte e nevojshme.
Skedaret te tipit text krijohen krejt lehte me ane te nje editori dhe
rezervohen ne disk.
Pastaj keto te dhena mund te manipulohen nga instruksionet e programit.
Skedaret Text
Krijimi i skedareve tekst krijon disa perparesi ne krahasim me futjen
interaktive te te dhenave gjate ekzekutimit te programit:
Lejon korigjimin e te dhenave te gabuara
Futja e te dhenave behet vetem nje here
Te dhenat mund te perdoren edhe nga programe te tjere
Skedaret Text
Skedari text eshte nje bashkesi elementesh te rezervuara ne disk nepermjet
nje emri.
Elementet e tij jane te dhena te pastrukturuara
Mund te jene: numra, karaktere, stringje etj.
Nuk kane madhesi fikse
Deklarimi i nje skedari behet si meposhte:
FILE *f;
Kjo nenkupton qe variabli me emer f perfaqeson nje skedar.
Skedaret Text
Per tu perdorur skedari duhet te hapet. Kjo realizohet nga funksioni fopen=
file open
f= fopen (emerskedari.txt, rt)
f eshte skedari formal
emerskedari eshte skedari fizik
r = read, t = text
Ne momentin e hapjes shenjuesi vendoset ne te dhenen e pare te skedarit
Skedaret Text
Funksioni fopen(f) realizon disa detyra:
Vendose lidhjen ndermjet skedarit formal f dhe atij real
emerskedari.txt qe ndodhet ne disk
Krijon bllokun ku mbahet informacion per atributet e skedarit dhe
vendodhjen e tij ne disk
Krijon nje shenjues qe vendoset ne te dhenen e pare te ketij skedari
Leximi i Skedarit
Supozojme se skedari permban numra, atehere leximi do jete :
fscanf (f, %d,&numer);
Funksioni merr te dhenen e treguar nga shenjuesi(ne kete cast eshte e para)
dhe e vendos ne kujtesen qendrore tek adresa numer.
Pastaj shenjuesi zhvendoset automatikisht tek e dhena pasardhese duke i
marre te gjitha me rradhe.
Fundi i leximit te nje file tregohet kur funksioni feof(f) merr vlere True.
Mbyllja e Skedarit
Kurse mbyllja e skedarit f behet me ane te funksionit fclose(f) i cili realizon
keto veprime:
Ben qe te gjithe elementet e skedarit f qe ndodhen ne kujtesen e punes
te transferohen ne disk
Detyron sistemin operativ te vendose EOF (shenjen fund-skedari) ne
fund te skedarit
Shkeput lidhjen e skedarit f me programin duke e bere ate te
perdorshem nga programe te tjere
Mbyllja e Skedarit
Pasi kryhet pune me nje skedar mire eshte qe ai te mbyllet sepse:
Sistemi operativ nuk merret me mbikqyrjen e skedareve qe nuk
perdoren me
Numri i skedareve qe mund te jene te hapur ne te njejten kohe eshte i
kufizuar
Ne momentin kur mbyllet nje program, pa e mbyllur skedarin ne te
cilin po shkruhej, ka mundesi qe jo te gjitha regjistrimet qe jane ne
kujtesen e punes te zhvendosen drejt diskut
Shembull
Ndertoni nje program qe lexon nje skedar i cili permban keto vlera :
241
293
dhe per keto vlera llogarit shumen si dhe sasine e nr.
Shembull
#include <stdio.h>
#include <conio.h>
int main ()
{
//deklarojme nje skedar formal me emrin f
FILE * f;
f = fopen ("skedar.txt", "rt");
int n, shuma=0, sasia=0;
fscanf (f,"%d", &n);
while (!feof(f))
{
shuma= shuma + n;
sasia = sasia +1;
//lexon te dhenen pasardhese
fscanf (f,"%d", &n);
}
fclose (f);
printf (Shuma eshte %d, sasia eshte %d, shuma, sasia);
getch();
return 0;
}
Shkrimi: Tastiere - Disk
Tastiera mund te konsiderohet si nje skedar nga i cili mund te lexohet
Fundi i nje rreshti shenohet : \n kurse
Fundi i skedarit : EOF
Per te shkruar nga tastiera ne disk:
kemi perdorur funksionin getchar() qe lexon nga tastiera karakterin e
shtypur prej nesh
nk numrin e karaktereve dhe nr numrin e rreshtave
fundi i skedarit(EOF) arrihet atehere kur shtypet njeheresh CTRL + Z,
ne momentin qe nuk doni te shkruani me
Shkrimi: Tastiere - Disk
#include <stdio.h>
#include <conio.h>
int main (){
int c, nk=0, nr=0;
while ((c=getchar()) !=EOF)
{
if (c !='\n')
nk++;
else
nr++;
}
printf (Numri i karaktereve eshte: %d, nk);
printf (Numri i rreshtave eshte: %d, nr);
getch();
return 0;
}
Shkrimi: Disk - Ekran
Ekrani mund te konsiderohet si nje skedar tek i cili mund te shkruhet
Programi ne vazhdim lexon nje skedar qe eshte krijuar me ane te nje editori
teksti
Ai perfundon me shenjen EOF, e cila gjenerohet ne momentin kur skedari
ruhet ne disk
Shkrimi: Disk - Ekran
#include <stdio.h>
#include <conio.h>
FILE *f;
int main ()
{
f = fopen("disk.txt", "rt");
char c;
c=fgetc(f);
while (!feof(f))
{
if (c !='\n')
printf (%c, c);
else
printf (\n);
c=fgetc(f);
}
getch();
return 0;
}
Vecorite e Skedareve Tekst
Nje skedar text qe hapet per lexim nuk mund te shkruhet dhe
anasjelltas.
=> skedaret text jo shume te deshirueshem
Skedari qe hapet per lexim lejon shkrimin vetem kur ky i fundit behet ne fund
te skedarit
Kjo realizohet nepermet vleres at append text
f = fopen (data.txt, at);
Kurse wt = write text.
Vecorite e Skedareve Tekst
#include <stdio.h>
#include <conio.h>
int main ()
{
FILE *f;
int i = 10;
char c[7] = Append;
float pi=3.14;
f = fopen ("data.txt", "at"); // hapet skedari per shtim ne fund
fprintf (f, "%d %s %.2f", i, c, pi); // shtohen disa te dhena
fclose (f); // mbyllet skedari
getch();
return 0;
}
Vecorite e Skedareve Tekst
Nqs nje skedar tekst ekzistues hapet per shkrim, atehere te dhenat qe do
te shkruhen do te mbivendosen mbi te dhenat ekzistuese duke i fshire ato
Te dhenat vendosen njera pas tjeteres, jo vetem si nocion logjik, por edhe
si vendndodhje fizike
Prandaj per te hyre ne nje te dhene te caktuar duhet bredhur skedari qe nga
fillimi deri tek e dhena e kerkuar
Vecorite e Skedareve Tekst
Strukturimi i vijueshem i skedarit eshte mese i dobishem dhe racional, ne
rastin kur do te trajtohet pjesa me e madhe e te dhenave qe ai permban
Ne rastin kur ne nje skedar relativisht te madh duhen trajtuar pak te
dhena, atehere bredhja e vijueshme e tij eshte nje shpenzim kohe
Per te shmangur nje gje te tille hyjne ne pune skedaret me hyrje te
drejteperdrejte
Skedaret me hyrje te drejtperdrejte
Skedaret me hyrje te drejtperdrejte quhen ndryshe edhe si skedare binare
Operacionet e leximit dhe te shkrimit mund te kryhen se bashku, gje qe
nuk ishte e mundur nga skedaret e vijueshem.
Te dhenat qe vendosen ne skedaret me hyrje te drejtperdrejte duhet te jene te
strukturuara (struct)
Strukturat
Struct-bashkesi elementesh te tipeve te ndyshme.
Kombinimi i tipeve eshte i fiksuar dhe i pandryshueshem.
Hapsira e rezervimit eshte e njohur qe me pare.
Koha e hyrjes se cdo anetari te struktures eshte e njejte.
Kjo realizohet duke shoqeruar strukturen me nje tabele qe permban fillimin e
vendndodhjes se cdo anetari te struktures.
Strukturat
Structure eshte nje tip i percaktuar nga perdoruesi qe ruan tipe te dhenash
heterogjene ne nje variabel te vetem. Eshte nje kombinim i tipeve primitive
me tipet e rrjedhura.
Pse duhet te perdoret tipi Structure
Ne gjuhen C array eshte gjithashtu nje tip i percaktuar nga perdoruesi
por qe ruan te dhena te te njejtit tip. Ne qofte se ne duam te ruajme tipe
te ndryshme te dhenash atehere ne duhet te percaktojme variabla te
ndryshme per secilin tip te dhenash qe behet fjale.
Strukturat
Shembull: Supozojme se duam te ruajme te dhena per Studentin, atehere na
duhet....
emer studenti
nr identifikues
klasa
adresa
Per te ruajtur emer Studenti dhe adresa na duhet tipi character, ndersa per
nr identifikues dhe klasa na duhet tipi integer
Strukturat
Nqs perdorim tipin Array atehere na duhet te percaktojme variabla te
ndryshem
Shembull
char emer_studenti[10], adresa[20];
int nr_identifikues[5], klasa [5];
Nqs perdorim tipin Structure atehere perdorim nje variabel te vetem per te
gjithe tipet e te dhenave
Sintaksa
typedef struct {
char emer_studenti[10];
char adresa[20];
int nr_identifikues [5];
int klasa[5];
} stu;
Strukturat
Prsh:
Nje strukture mund te perbehet nga 2 nr te plote, 3 tabela me 20 nr te plote
sejcila, 4 nr te plote te tjere, dhe 2 emra qe permbajne nga 12 karaktere .
Kjo strukture permban 11 anetare(fusha).
Struktura eshte:
Strukturat
Typedef struct {
int n1, n2;
int t1[20], t2[20] , t3[20];
int n3, n4, n5, n6 ;
char e1[12] , e2[12];
} str1 ;
Deklarimi i nje Strukture
Sintaksa
typedef struct [tagname]{
Datatype1 member1;
Datatype2 member2;
Datatype3 member3;
...........
} [one or more structure variables];
Pasi krijohet struktura eshte e nevojshme te perdorim (;) sepse tregojne qe
eshte ndertuar nje entitet
Deklarimi i nje Strukture
Sintaksa e krijimit te nje variabli strukture
struct tagname variable;
Shembull
typedef struct{
int id;
char name[36];
int sal;
} emp;
sizeof(emp) // --> 44 byte (4byte+36byte+4byte)
Array vs Structure
Shembull Strukture
#include<stdio.h>
#include<conio.h>
struct emp{
int id;
char emer[36];
float rroga; };
int main(){
struct emp e;
printf("Futni Id te punojesit, Emer, Rrogen: ");
scanf("%d%s%f",&e.id,&e.emer,&e.rroga);
printf("Id: %d\nName: %s\nSalary: %f",e.id,e.emer,e.rroga);
getch();
return 0;
}
Output
Futni Id te punojesit, Emer, Rrogen: 5 Spidy 45000
Id : 05 Name: Spidy Salary: 45000.00
Skedaret Binare
Skedaret me hyrje te drejteperdrejte nuk mund te krijohen me ane te nje
editori
Por me ane te nje programi qe lexon te dhenat nga tastiera ose me ane te nje
skedari tekst te krijuar me pare.
Per te trajtuar nje rregjistrim te caktuar ne skedaret binare se pari duhet te
zhvendoset shenjuesi tek struktura e duhur dhe pastaj te aktivizohet nje
funksion shkrimi apo leximi mbi kete strukture
Skedaret Binare
Skedaret binare mund te perdoren si per hyrje te vijueshme ashtu edhe per
te drejteperdrejte
Kurse skedaret tekst nuk mund te perdoren si skedare me hyrje te
drejteperdrejte
Lexim/Shkrim - Skedaret Binare
Perpara se te perdoret nje skedar binar ai duhet hapur
Hapja behet njelloj si tek skedari tekst, vetem se karakteri t (tekst)
zevendesohet me karakterin b (binar)
psh fopen (emerskedari.mbarese, wb);
Lexim/Shkrim Skedaret Binare
Persa i perket shkrimit dhe leximit skedari binar dallon nga ai tekst pasi ai
perdore te dhena te strukturuara
=> madhesia ne byte eshte e njohur dhe mund te perdoret funksioni
sizeof
Shkrimi i nje strukture behet me ane te funksionit fwrite si meposhte:
fwrite (&p, sizeof(pike), 1,f)
Lexim/Shkrim Skedaret Binare
Kjo nenkupton: fwrite (&p, sizeof(pike), 1,f)
Shkrimin e struktures qe i perket tipit pike
Numri 1 tregon qe shkruhet nje element
f tregon skedarin ku do behet shkrimi
Ne menyre te ngjashme ndodh edhe leximi:
fread(&p, sizeof(pike), 1,f)
Shembull
Ndertoni nje program qe shkruan ne nje skedar binar 10 elemente te nje
strukture pike dhe me pas lexon dhe afishon ne ekran elementet e ketij
skedari
Shembull
#include <stdio.h>
#include <conio.h>
//percaktohet struktura pike
typedef struct {
int x,y;
} pike;
int main(){
int i ; FILE *f ; pike p;
//krijohet skedari prej 10 strukturash
f = fopen("pikat.dat" , "wb");
for (i=0; i<10 ; i++)
{
p.x =i;
p.y = i * i;
fwrite (&p, sizeof(pike),1,f);
}
fclose(f);
//lexohen 10 strukturat
f=fopen ("pikat.dat","rb");
for (i=0; i<10 ;i++)
{
fread(&p, sizeof(pike), 1, f);
printf(%d %d\n, p.x, p.y);
}
fclose (f);
printf(\n);
getch();
return 0;
}
# i nje strukture ne Skedaret Binare
Epersia e skedareve binare kundrejt atyre tekst duket ne mundesine:
per te hyre drejteperdrejte ne nje strukture
per te lexuar nje strukture dhe per te ndryshuar nje fushe te saj ose
krejt strukturen
Per te hyre ne nje strukture te skedarit duhet ditur nr identifikues i saj
Normalisht ato pajisen ne menyre automatike, gjate krijimit te skedarit, me
nje numer indentifikimi qe fillon me 0.
Pra struktura e pare e ka numrin 0, e dyta e ka numrin 1 e keshtu me radhe
# i nje strukture ne Skedaret Binare
Per tu pozicionuar tek struktura me nr identifikimi n perdoret fseek
fseek (f,sizeof(pike)*n, 0)
f - skedarin
sizeof(pike) madhesine e struktures
0 - tregon qe kerkimi do filloje nga struktura e pare e skedarit.
Ne rast se kerkimi fillon nga struktura e radhes shenohet 1
Kurse nga fundi i skedarit shenohet 2.
Shembull
Ndertoni nje program qe ndryshon strukturen e 5 te programit ne 999...
Kujdes struktura 5 e ka nr e identifikimit = 4
Shembull
#include <stdio.h>
#include <conio.h>
typedef struct {
int x,y;
} pike;
int main(){
int i ; FILE *f ; pike p;
//krijohet skedari prej 10 anetaresh
f = fopen("pikat.dat" , "wb");
for (i=0; i<10 ; i++)
{
p.x =i;
p.y = i * i;
fwrite (&p, sizeof(pike),1,f);
}
fclose(f);
//lexohen 10 strukturat
f = fopen("pikat.dat" , "rb");
for (i=0; i<10 ; i++)
{
fread(&p, sizeof(pike), 1, f);
printf(%d %d\n, p.x, p.y);
}
fclose(f);
//pozicionohemi tek id=4.
f=fopen ("pikat.dat","r+b");
fseek(f,sizeof(pike)*4,0);
//fread(&p, sizeof(pike), 1, f);
p.x= 999; p.y= 666;
//ripozicionim i id=4
//fseek(f,sizeof(pike)*4,0);
fwrite (&p, sizeof(pike), 1, f);
fclose (f);
//paraqitet ne ekran skedari i ndryshuar
f = fopen("pikat.dat" , "rb");
for (i=0; i<10 ;i++)
{
fread(&p, sizeof(pike), 1, f);
printf(%d %d\n, p.x, p.y);
}
fclose (f);
printf(\n);
getch();
return 0;
}
Skedari Tekst vs Skedari Binar
skedar binar Numra
skedar tekst Tekst
Nqs duam te shkruajme numrin 123456 ne nje variabel N:
ne skedarin binar do realizohej duke ruajtur nje kopje te paraqitjes
binare te numrit N qe eshte ne kujtesen e brendshme, ne pjesen e
diskut qe i takon skedarit Numra (4 bajte)
ne skedarin tekst, kompjuteri transformon numrin 123456 ne
stringun 123456 dhe pastaj regjistron kete string ne 6 bajte.
Duhet me shume kohe dhe me shume hapesire ne rastin e perdorimit te
skedarit tekst
Si dhe ka shume mundesi per gabime gjate transformimit te nje numri qe
eshte i tipit float ne string sepse mund te humbase saktesia
Perseritja e nje Skedari Binar
Per te shkruar regjistrime te reja:
duhen ndryshuar fusha te vecanta te regjistrimeve ekzistuese
duhen fshire regjistrime me informacione te vjeteruara
Secili prej veprimeve te mesiperme permban veprimet e leximit dhe
shkrimit qe nuk mund te realizohen tek i njejti skedar
Krijohet nje skedar i ri qe pasqyron ndryshimet e skedarit ekzistues
Ky skedar i ri rezervohet kurse ai i meparshmi mund te fshihet, per te liruar
hapesiren e diskut
Skedaret Binare te Renditur
Nje skedar F quhet i renditur me renditje te pare sipas fushes F1, me renditje
te dyte sipas fushes F2, me renditje te n-te sipas fushes Fn nqs:
fushat Fi, per i=1n, jane fusha te regjistrimeve te skedarit S
per te njejten vlere te fushes Fi, regjistrimet jane renditur sipas fushe
Fi+1, per i=1.n-1
Skedari meposhte eshte i renditur sipas fushes numerike

Shkrirja e dy SBR
Bashkimi i dy ose me shume skedareve ne nje skedar te vetem
Ne rastin e skadareve te parenditur ky veprim shnderrohet ne shkrimin e
skedareve te dhene ne nje skedare te ri(skedaret duhet te permbajne
regjistrime te te njejtit tip)
Skedaret duhet te jene te renditur sipas te njejtes fushe
prsh
typedef struct{
int f1; char f2[10];
} regj;
Shkrirja e dy SBR
Shembull
Algoritmi i meposhtem jep leximin e nje skedari edhe kur arrihet fundi i EOF
Shembull
Void lexoFundSkedari(FILE *s, regj &r)
{
fread(&r,sizeof(regj),1,s);
if (feof(s))
r.f1 =maxint;
}
Void shkri(FILE *s1, FILE *s2, FILE *sr)
{
regj r1, r2;
lexoFundSkedari(s1,r1);
lexoFundSkedari(s2,r2);
While ((r1.f1 < maxint ) || (r2.f1 < maxint ) )
{
if (r1.f1 < r2.f1)
{
fwrite (&r1, sizeof(regj),1,sr)
lexoFundSkedari (s1,r1) ;
}
Else
{
Fwrite (&r2, sizeof(regj),1,sr)
lexoFundSkedari( s2,r2);
}
}
}

You might also like