Shiko programin më poshtë.
- Lexon një skedar me dy kollona të ndara me tab '\t'.
- I hedh rekordet në një matricë (array)
- Rendit matricën sipas alfabetit
- Shkruan përsëri skedarin me rekordet të renditur sipas alfabetit
Leximi i rekordeve mbaron kur gjen rreshtin e parë bosh, ose kur arrin fundin e skedarit.
Maksimumi i rekordeve është 30 por mund ta ndryshosh sipas dëshirës duke ndryshuar variablën REK_MAX.
Kam komentuar gjithçka por mos nguro të pyesësh.
Skedari i bashkëngjitur ZIP ka kodin main.c dhe databaza.txt.
Unë e shkruajta në windows por duhet të punojë edhe në linux.
E përpilova me Dev C++
Ja një shëmbull i skedarit para se të përdoret programi:
Kodi:
Pashko Vasa 354
Gjergj Fishta 614
Ndre Mjeda 459
Andon Zako Çajupi 130
Naim Frashëri 755
Jeronim De Rada 223
Kodi i programit në C:
Kodi PHP:
// Autori: Edi, edspace ET comcast PIKE net
// Pershkrimi:
// Lexon dhe shkruan rekorde ne nje skedar sipas renditjes alfabetike
// Rekordi permban 2 kollona te ndara me tab
//
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
const REK_MAX = 30; // numri maksimal per rekordet
struct rekord // struktura e nje rekordi
{
char personi [20]; // emri i personit deri ne 20 shkronja
int num; // numri
};
//********************************************************************
// Hap skedarin db dhe hidh rekordet ne matricen r
// Kthen numrin e rekordeve ne skedar ose -1 nqs nuk hapet skedari
//
int lexo_databaze( const char db [], struct rekord * r);
//********************************************************************
// Hap skedarin db dhe shkruar nr rekorde nga matrica r
// Kthen 0 nqs ndodh gabim
//
int shkruaj_databaze(const char db [], const struct rekord * r, const size_t nr);
//********************************************************************
// Krahaso dy rekorde duke u bazuar mbi personin.
// Ky funksion perdoret per renditjen e rekordeve
// emrat 0 konsiderohen si te pavlefshem dhe renditen ne fund
// Kthejme: -1 nqs r1<r2, 0 nqs r1=r2, 1 nqs r1>r1
// A < Z < 0
//
int rekord_krah ( const struct rekord * r1, const struct rekord * r2);
//********************************************************************
// MAIN
//
int main (void)
{
const char db [] = "databaza.txt"; // emri i skedarit ku do ruhet info
// tregues per array me rekorde
struct rekord * r = NULL;
// kerkojme memorjen per REK_MAX rekorde
r = calloc( REK_MAX, sizeof(struct rekord) );
if( r == NULL ) // nqs nuk ka memorje te mjaftueshme
{
printf("GABIM: Nuk ka memorje te mjaftueshme");
return 1;
}
int nr_rekordeve = lexo_databaze( db, r );
if ( nr_rekordeve == -1 )
{
printf("GABIM: Nuk mund te hapej skedari %s", db);
}
qsort (r, REK_MAX, sizeof (struct rekord), (const void *)rekord_krah);
// ketu mund te ndryshosh matricen duke shtuar rekorde te tjera
if( !shkruaj_databaze( db, r, nr_rekordeve ) )
{
printf("GABIM: Nuk mund te hapej skedari %s", db);
return 1;
}
return 0; // mbaruam
}
//************************************************************************
// Lexojme rekordet nga databaza
//
int lexo_databaze( const char db [], struct rekord * r)
{
FILE * inskedari; // tregues per skedarin
if(!(inskedari = fopen(db, "r")))
{
return -1; // nqs nuk hapim dot skedarin kthejme kodin -1 (gabim)
}
int i = 0;
char rresht [100]; // buffer per 1 rresht (maksimumi 100 shkronja)
while(i < REK_MAX ) // marrim REK_MAX rekorde nga skedari
{
fgets( rresht, 100, inskedari); // marrim rreshtin
// nqs eshte rreshti i fundit, dalim jashte
if( feof(inskedari) || strlen(rresht) == 1) break;
// marrim emrin e personit qe ndahet me tab nga numri
strncpy( r[i].personi, strtok (rresht,"\t"), 20 );
r[i].num = atoi( strtok (NULL," \n") ); // marrim numrin
i++;
}
fclose(inskedari); // mbyllim skedarin
return i; // numri i rekordeve qe gjetem ne skedar
}
//************************************************************************
// Shkruajme rekordet ne databaze
//
int shkruaj_databaze( const char db [], const struct rekord * r, size_t nr )
{
FILE * outskedari; // tregues per skedarin
// nqs nuk hapim dot skedarin per te shkruar
if(!(outskedari = fopen(db, "w+"))) //
{
return 0; // nqs nuk hapim dot skedarin kthejme kodin 0 (gabim)
}
int i;
for (i = 0; i < nr; i++) // shkruajme rekordet
{ // emri dhe numri jane te ndara me tab
fprintf (outskedari, "%s\t%d\n", r[i].personi, r[i].num);
}
fclose (outskedari); // mbyllim skedarin
return 1;
}
//************************************************************************
// Krahasojme rekordet e databazes
//
int rekord_krah (const struct rekord * r1, const struct rekord * r2)
{
if( strcmp("\0", r1->personi) == 0 ) return 1; // zeron e vendosim ne fund
if( strcmp("\0", r2->personi) == 0 ) return -1; // zeron e vendosim ne fund
return strcmp (r1->personi, r2->personi); // krahasojme dy fjale
}
Skedari pas ekzekutimit të programit:
Kodi:
Andon Zako Çajupi 130
Gjergj Fishta 614
Jeronim De Rada 223
Naim Frashëri 755
Ndre Mjeda 459
Pashko Vasa 354
Krijoni Kontakt