| ZER DAKIDAN: Fitxategiak eta arrayak antzekoak dira datu-mota bereko hainbat elementu gordetzen dituztelako. Algoritmo batzuk errazagoak dira arrayetan fitxategietan baino; adibidez, elementu bat kentzea errazago egiten da array batean fitxategi batean baino. Horregatik... ZER IKASIKO DUDAN: ...horregatik, fitxategiko elementu guztiak array batera eramango ditut, arrayan elementua kenduko dut, eta, bukatzeko, arrayaren informazio berritua hasierako fitxategian gordeko dut. Horrez gain, bigarren fitxategi laguntzaile baten partehartzearekin elementua kenduko dut helburuko fitxategian. |
Datuak gordetzen dituen fitxategi batekin lan egingo da. Esate baterako, estrukturen fitxategi bat daukagu eta bere posizioa ezaguna den fitxategiko elementu bat kendu nahi da, hots, liZein posizio ezaguneko elementua kendu nahi da fitxategitik.
Jarraian erakusten diren hiru adibideetan liZein posizioaren balioa teklatuz emango du erabiltzaileak. Baina beste egoeraren batean, kendu beharreko elementuaren liZein posizioaren balioa bilaketa baten emaitza izan zitekeen.
Elementuaren ezabaketa burutzeko egitura laguntzaileren bat beharko dugu. Jarraian erakusten den bi programetan egitura laguntzaileak hauek izango dira:
- Ariketa-90_Fitxategien_15a_algoritmoa adibidean estrukturen array laguntzaile bat
- Ariketa-90_Fitxategien_15b_algoritmoa adibidean estrukturen fitxategi laguntzaile bat
Erakusten den programa honetan array laguntzaile bat erabiliko denez, frogatu beharko da fitxategiko elementu guztiek tokia izan dezaketela arrayan. Fitxategiaren informazioa arrayan dagoelarik, elementuaren ezabaketa egiteko 9. jarduera | Ezabaketa array batean ikusi zen algoritmoa aplikatuko da.
/* Ariketa-90_Fitxategien_15a_algoritmoa: elementu bat kendu */
// Erregistroen fitxategi batetik elementu jakin bat kentzeko
// fitxategiko edukia array batera igaroko da, kenketa arrayan
// gauzatu eta arrayaren informazio berritua fitxategira ekarri.
#include <stdio.h>
#include <string.h> // strcpy() eta strcat() funtzioetarako
#include <conio.h> // getch() funtzioarako
#define BEHEMUGA 0
#define GOIMUGA 10
#define FITX_IZEN_MAX 120 // fitxategiaren izenerako 119 karaktere gehi null mugatzailea
#define DATU_IZEN_MAX 72 // ikaslearen izena gordetzeko 71 karaktere gehi null mugatzailea
struct tstFitxa // struct definitzen ikasleen datuak gordetzeko
{
char sIzenDeiturak[DATU_IZEN_MAX];
int iDeialdia;
float fNota;
};
int iFitxategirikBada(const char sFitxIzen[]);
void FitxategiaIkusi(const char sFitxIzen[]);
void BektoreaIkusi(const struct tstFitxa A[], long int liLuzera);
void FitxategitikBektoreaBete(const char sFitxIzen[],
struct tstFitxa A[],
long int *liLuzera);
void BektoretikFitxategiaBete(const char sFitxIzen[],
const struct tstFitxa A[],
long int liLuzera);
long int liFitxategiarenElemKopKalkulatu(const char sFitxIzen[]) ;
void Ezabaketa(struct tstFitxa Z[],
long int *liLuzera,
long int liZein);
int main()
{
char sFitxIzen[FITX_IZEN_MAX];
char sFitxIzenLaburra[FITX_IZEN_MAX];
long int liZenbatElem, liZein, liLuzera;
struct tstFitxa A[GOIMUGA];
printf("'C:\\Tokia\\' karpetako fitxategiaren izen laburra eman ezazu.\n");
printf("Adibidez, 'Datuak' izena: ");
scanf("%s", sFitxIzenLaburra);
getchar(); // Enter karakterea kentzeko
strcpy(sFitxIzen, "C:\\Tokia\\");
strcat(sFitxIzen, sFitxIzenLaburra);
strcat(sFitxIzen, ".dat");
if (iFitxategirikBada(sFitxIzen) == 1)
{
FitxategiaIkusi(sFitxIzen);
liZenbatElem = liFitxategiarenElemKopKalkulatu(sFitxIzen);
if (liZenbatElem <= GOIMUGA)
{
FitxategitikBektoreaBete(sFitxIzen, A, &liLuzera);
BektoreaIkusi(A, liLuzera);
do
{
printf("Ezabatuko den elementuaren posizioa bektorean (%d - %ld): ", BEHEMUGA, liLuzera-1);
scanf("%ld", &liZein);
} while (liZein < BEHEMUGA || liZein >= liLuzera);
Ezabaketa(A, &liLuzera, liZein);
BektoreaIkusi(A, liLuzera);
BektoretikFitxategiaBete(sFitxIzen, A, liLuzera);
FitxategiaIkusi(sFitxIzen);
}
else
printf("Fitxategia handiegia da programa honentzako, bektorearen muga %d elementu delako.\n", GOIMUGA);
}
else
printf("'%s' fitxategia ez da existitzen, agur...", sFitxIzen);
printf("\nPrograma bukatzera doa. Edozein tekla sakatu! ");
getch(); // itxaron edozein tekla sakatu arte
printf("\n");
return 0;
}
// funtzio honek fitxategi baten existentzia frogatzen du.
int iFitxategirikBada(const char sFitxIzen[])
{
FILE *f;
// Irakurketarako irekitze saiakera ("r" = read)
f = fopen(sFitxIzen, "rb");
// Fitxategirik ez balego fopen() funtzioak NULL itzuliko luke
if (f != NULL)
{
fclose(f); // fitxategia itxi baliabidwak askatzeko
return 1; // Itzuli 1 (true): fitxategia bada
}
// Fitxategirik ez balego fopen() funtzioak NULL itzuliko luke
return 0; // Itzuli 0 (false): fitxategia ez da existitzen
}
// fitxategiaren edukia bistaratzeko
void FitxategiaIkusi(const char sFitxIzen[])
{
FILE *fFitxategia = fopen(sFitxIzen, "rb");
struct tstFitxa stElem;
long int liPosizioa;
if (!fFitxategia)
{
printf("Ezin da fitxategia ireki\n");
return;
}
printf("Fitxategiaren edukia:\n");
liPosizioa = 0;
while (fread(&stElem, sizeof(struct tstFitxa), 1, fFitxategia) == 1)
{
printf("%2ld posizioan %-20s %8d %10.2f\n", liPosizioa, stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
liPosizioa++;
}
printf("\n");
fclose(fFitxategia);
}
// fitxategitik abiatuta array batera datuak kargatzeko
void FitxategitikBektoreaBete(const char sFitxIzen[], struct tstFitxa A[], long int *liLuzera)
{
FILE *fFitxategia;
int liIndizea = BEHEMUGA;
struct tstFitxa stElem;
fFitxategia = fopen(sFitxIzen, "rb");
if (!fFitxategia)
{
printf("Ezin da fitxategia ireki\n");
return;
}
while (fread(&stElem, sizeof(struct tstFitxa), 1, fFitxategia) == 1 && liIndizea < GOIMUGA)
{
A[liIndizea++] = stElem;
}
*liLuzera = liIndizea;
fclose(fFitxategia);
}
// array batetik fitxategian datuak idazteko
void BektoretikFitxategiaBete(const char sFitxIzen[], const struct tstFitxa A[], long int liLuzera)
{
FILE *fFitxategia;
fFitxategia = fopen(sFitxIzen, "wb");
if (!fFitxategia)
{
printf("Ezin da fitxategia ireki\n");
return;
}
fwrite(A, sizeof(struct tstFitxa), liLuzera, fFitxategia);
fclose(fFitxategia);
}
// arrayren edukia bistaratzeko
void BektoreaIkusi(const struct tstFitxa A[], long int liLuzera)
{
printf("A arrayaren edukia:\n");
for (int i = BEHEMUGA; i < liLuzera; i++)
{
printf("%2d posizioan %-20s %8d %10.2f\n", i, A[i].sIzenDeiturak, A[i].iDeialdia, A[i].fNota);
}
printf("\n");
}
// elementu jakin bat arraytik ezabatzeko
void Ezabaketa(struct tstFitxa Z[], long int *liLuzera, long int liZein)
{
for (int i = liZein; i < *liLuzera - 1; i++)
{
Z[i] = Z[i + 1];
}
(*liLuzera)--;
}
// fitxategiko elementu kopurua itzultzeko
long int liFitxategiarenElemKopKalkulatu(const char sFitxIzen[])
{
FILE *fFitxategia;
long int liElemKopurua = 0;
fFitxategia = fopen(sFitxIzen, "rb");
if (!fFitxategia)
{
printf("Ezin da fitxategia ireki\n");
return -1;
}
fseek(fFitxategia, 0L, SEEK_END);
liElemKopurua = ftell(fFitxategia) / sizeof(struct tstFitxa);
fclose(fFitxategia);
return liElemKopurua;
}
Erakusten den programa honetan bigarren fitxategi laguntzaile bat erabiliko da. Emaitza den informazioa fitxategi laguntzailean biltegituko denez, hasierako fitxategia ezabatuko da remove() eginez eta fitxategi laguntzaileari izena aldatuko zaio rename() eginez.
/* Ariketa-90_Fitxategien_15b_algoritmoa: elementu bat kendu */
// Erregistroen fitxategi batetan elementu berri bat kentzeko
// beste fitxategi laguntzaile bat erabiliko da. Azkenean, lana
// burutu ondoren, jatorrizko fitxategia ezabatuko da eta emaitza
// gordetzen duen fitxategi laguntzailea berrizendatuko da.
// AzkenaMoztu() funtzioan ftruncate() egiten da eta dagokion f_ZBK
// parametroari balioa emateko fileno() funtzioa erabiltzen da.
#include <stdio.h>
#include <string.h> //strcpy() eta strcat() funtzioetarako
#include <conio.h> // getch() funtzioarako
#define FITX_IZEN_MAX 120 // fitxategiaren izenerako 119 karaktere gehi null mugatzailea
#define DATU_IZEN_MAX 72 // ikaslearen izena gordetzeko 71 karaktere gehi null mugatzailea
struct tstFitxa // struct definitzen ikasleen datuak gordetzeko
{
char sIzenDeiturak[DATU_IZEN_MAX];
int iDeialdia;
float fNota;
};
int iFitxategirikBada(const char sFitxIzen[]);
void FitxategiaIkusi(const char sFitxIzen[]);
long int liFitxategiarenElemKopKalkulatu(const char sFitxIzen[]);
void ElementuaKendu(const char sFitxIzen[],
const char sFitxIzenLaburra[],
long liNon,
long liZenbatElem,
struct tstFitxa *stElementuZaharra);
void KendutakoaIkusi(struct tstFitxa stElementuZaharra);
int main()
{
char sFitxIzen[FITX_IZEN_MAX];
char sFitxIzenLaburra[FITX_IZEN_MAX];
struct tstFitxa stElementuZaharra;
long int liZenbatElem, liNon;
printf("'C:\\Tokia\\' karpetako fitxategiaren izen laburra eman ezazu.\n");
printf("Adibidez, 'Datuak' izena: ");
scanf("%s", sFitxIzenLaburra);
getchar(); // Enter karakterea kentzeko
strcpy(sFitxIzen, "C:\\Tokia\\");
strcat(sFitxIzen, sFitxIzenLaburra);
strcat(sFitxIzen, ".dat");
if (iFitxategirikBada(sFitxIzen) == 1)
{
FitxategiaIkusi(sFitxIzen);
liZenbatElem = liFitxategiarenElemKopKalkulatu(sFitxIzen);
do
{
printf("Kendu behar den elementuaren posizioa fitxategian (0 - %ld): ", liZenbatElem-1);
scanf("%ld", &liNon);
} while (liNon < 0 || liNon >= liZenbatElem);
ElementuaKendu(sFitxIzen, sFitxIzenLaburra, liNon, liZenbatElem, &stElementuZaharra);
KendutakoaIkusi(stElementuZaharra);
FitxategiaIkusi(sFitxIzen);
}
else
printf("'%s' fitxategia ez da existitzen, agur...", sFitxIzen);
printf("\nPrograma bukatzera doa. Edozein tekla sakatu! ");
getch(); // itxaron edozein tekla sakatu arte
printf("\n");
return 0;
}
// funtzio honek fitxategi baten existentzia frogatzen du.
int iFitxategirikBada(const char sFitxIzen[])
{
FILE *f;
// Irakurketarako irekitze saiakera ("r" = read)
f = fopen(sFitxIzen, "rb");
// Fitxategirik ez balego fopen() funtzioak NULL itzuliko luke
if (f != NULL)
{
fclose(f); // fitxategia itxi baliabidwak askatzeko
return 1; // Itzuli 1 (true): fitxategia bada
}
// Fitxategirik ez balego fopen() funtzioak NULL itzuliko luke
return 0; // Itzuli 0 (false): fitxategia ez da existitzen
}
// fitxategiaren edukia bistaratzeko
void FitxategiaIkusi(const char sFitxIzen[])
{
FILE *fFitxategia;
struct tstFitxa stElem;
long int liPosizioa;
fFitxategia = fopen(sFitxIzen, "rb");
if (!fFitxategia)
{
printf("Ezin da fitxategia ireki\n");
return;
}
printf("'%s' fitxategiaren edukia:\n", sFitxIzen);
liPosizioa = 0;
while (fread(&stElem, sizeof(struct tstFitxa), 1, fFitxategia) == 1)
{
printf("%2ld posizioan: | %-25s | %d | %.2f |\n", liPosizioa, stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
liPosizioa++;
}
printf("\n");
fclose(fFitxategia);
}
void ElementuaKendu(const char sFitxIzen[],
const char sFitxIzenLaburra[],
long liNon,
long liZenbatElem,
struct tstFitxa *stElementuZaharra)
{
FILE *f, *fLAG;
struct tstFitxa stElem;
char sFitxIzenLAG[FITX_IZEN_MAX];
long liKont;
strcpy(sFitxIzenLAG, "C:\\Tokia\\");
strcat(sFitxIzenLAG, sFitxIzenLaburra);
strcat(sFitxIzenLAG, "LAG.dat");
f = fopen(sFitxIzen, "rb"); // fitxategia irakurtzeko moduan ireki
fLAG = fopen(sFitxIzenLAG, "wb"); // fitxategia idazteko moduan ireki
for (liKont = 0; liKont < liNon; liKont++)
{
fread(&stElem, sizeof(struct tstFitxa), 1, f); // aurrekoak fitxategitik irakurri
fwrite(&stElem, sizeof(struct tstFitxa), 1, fLAG); // aurrekoak laguntzailean idatzi
}
fread(stElementuZaharra, sizeof(struct tstFitxa), 1, f); // kendu beharrekoa irakurri
for (liKont = liNon+1; liKont < liZenbatElem; liKont++)
{
fread(&stElem, sizeof(struct tstFitxa), 1, f); // ostekoak fitxategitik irakurri
fwrite(&stElem, sizeof(struct tstFitxa), 1, fLAG); // ostekoak laguntzailean idatzi
}
fclose(f); // fitxategia itxi
fclose(fLAG); // laguntzailea itxi
remove(sFitxIzen); // jatorrizko fitxategia ezabatu
rename(sFitxIzenLAG, sFitxIzen); // laguntzaileari jatorrizko izena ezarri
}
// elementu berri baten datuak eskuratzeko
void DatuakEskuratu(struct tstFitxa *stElementua)
{
printf("Ikaslearen izen-deitura eman: ");
fgets(stElementua->sIzenDeiturak, 50, stdin);
stElementua->sIzenDeiturak[strcspn(stElementua->sIzenDeiturak, "\n")] = '\0';
printf("Ikaslearen deialdia eman: ");
scanf("%u", &stElementua->iDeialdia);
printf("Ikaslearen nota eman: ");
scanf("%f", &stElementua->fNota);
getchar(); // Enter karakterea kentzeko
}
// fitxategiko elementu kopurua itzultzeko
long int liFitxategiarenElemKopKalkulatu(const char sFitxIzen[])
{
FILE *fFitxategia;
long int liElemKopurua = 0;
fFitxategia = fopen(sFitxIzen, "rb");
if (!fFitxategia)
{
printf("Ezin da fitxategia ireki\n");
return -1;
}
fseek(fFitxategia, 0L, SEEK_END);
liElemKopurua = ftell(fFitxategia) / sizeof(struct tstFitxa);
fclose(fFitxategia);
return liElemKopurua;
}
void KendutakoaIkusi(struct tstFitxa stElementuZaharra)
{
printf("========Kendutako elementua:=======================================\n");
printf("%-15s %8d %10.2f\n", stElementuZaharra.sIzenDeiturak,
stElementuZaharra.iDeialdia,
stElementuZaharra.fNota);
printf("===================================================================\n");
}
|
iruzkinik ez:
Argitaratu iruzkina