| ZER DAKIDAN: Fitxategiko elementu jakin baten aldaketa nola burutzen den badakit. ZER IKASIKO DUDAN: Fitxategiko elementu guztiak aldatzeko bi algoritmo ikasiko ditut: batean egitura laguntzailerik (array edo fitxategi) ez da erabiltzen, eta, beste algoritmoan, fitxategi laguntzaile bati esker helburuko fitxategiaren elementu guztiak aldatuko ditut. |
Datuak gordetzen dituen fitxategi bat daukagu. Esate baterako, estrukturen fitxategi bat daukagu eta elementu guztien eremu bat (adibidez iDeialdia) aldatu nahi dugu.
Estrukturen fitxategi bat daukagu eta elementu guztien iDeialdia eremua aldatu nahi dugu bestelako egitura laguntzailerik gabe. Elementu bakoitzeko irakurri-aldatu-idatzi sekuentzia bete beharko da.
... fread(&stElem, sizeof(struct tstFitxa), 1, f); // elementu bat irakurri stElem.iDeialdia++; // deialdia inkrementatu fseek(f, (-1)*(long)sizeof(struct tstFitxa), SEEK_CUR); // fitxategian posizio bat atzera fwrite(&stElem, sizeof(struct tstFitxa), 1, f); // fitxategian idatzi fseek(f, 0L, SEEK_CUR); // uneko posizioan kokatu ...
Erakusten den programa honetan fitxategiaren existentzia frogatzen da programa nagusian, horren arabera:
- Baldin eta fitxategia bada, fitxategi osoaren edukia pantailaratzen da hiru modu desberdinetan eta ondoren fitxategiaren elementu guztietan aldaketa burutuko da egitura laguntzailerik gabe
- Fitxategirik ez bada, fitxategia sortu eta datuz beteko da. Ondoren, lehen bezala, fitxategi osoaren edukia pantailaratzen da hiru modu desberdinetan eta jarraian fitxategiaren elementu guztietan aldaketa burutuko da egitura laguntzailerik gabe
/* Ariketa-81_Fitxategien_6a_algoritmoa: elementu guztiak aldatu array
edo fitxategi laguntzailerik gabe */
#include <stdio.h>
#include <string.h> // strcpy() eta strcat() funtzioetarako
#include <ctype.h> // toupper() funtziorako
#include <conio.h> // getch() funtziorako
#define sBIDEA "C:\\Tokia\\"
#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
{
char sIzenDeiturak[DATU_IZEN_MAX];
int iDeialdia;
float fNota;
};
int iFitxategirikBada(const char sFitxIzen[]);
void DatuakBiltegitu(const char sFitxIzen[]);
void DatuGuztiakErakutsi_0(const char sFitxIzen[]);
void DatuGuztiakErakutsi_1(const char sFitxIzen[]);
void DatuGuztiakBirritanIkusi(const char sFitxIzen[]);
void DatuGuztiakAldatu(const char sFitxIzen[]);
int main()
{
char sFitxIzenLaburra[FITX_IZEN_MAX];
char sFitxIzen[FITX_IZEN_MAX];
printf("Fitxategiaren izen laburra eman (adibidez 'Ikasleak' edo 'Datuak'): ");
gets(sFitxIzenLaburra);
strcpy(sFitxIzen, "C:\\Tokia\\");
strcat(sFitxIzen, sFitxIzenLaburra);
strcat(sFitxIzen, ".dat");
if (iFitxategirikBada(sFitxIzen) == 1)
{
printf("'%s' fitxategia existitzen da, bere edukia erakutsi...\n\n", sFitxIzen);
}
else
{
printf("'%s' fitxategia ez da existitzen, sortu eta erakutsi...\n\n", sFitxIzen);
DatuakBiltegitu(sFitxIzen);
}
printf("----DatuGuztiakErakutsi_0--------------------------------------------\n");
DatuGuztiakErakutsi_0(sFitxIzen);
printf("---------------------------------------------------------------------\n\n");
printf("----DatuGuztiakErakutsi_1--------------------------------------------\n");
DatuGuztiakErakutsi_1(sFitxIzen);
printf("---------------------------------------------------------------------\n\n");
printf("----DatuGuztiakBirritanIkusi-----------------------------------------\n");
DatuGuztiakBirritanIkusi(sFitxIzen);
printf("---------------------------------------------------------------------\n\n");
printf("\nIkasleen deialdi kopurua eguneratzen '%s' fitxategian\n", sFitxIzen);
printf("inolako egitura lagunzailerik gabe. Aurrera egiteko, edozein tekla sakatu! ");
getch(); // itxaron edozein tekla sakatu arte
printf("\n\n");
DatuGuztiakAldatu(sFitxIzen);
printf("\n");
printf("----DatuGuztiakErakutsi_0--------------------------------------------\n");
DatuGuztiakErakutsi_0(sFitxIzen);
printf("---------------------------------------------------------------------\n\n");
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 sortu eta datuz bete
void DatuakBiltegitu(const char sFitxIzen[])
{
FILE *f;
struct tstFitxa stElem;
long lPosizioa;
char cErantz;
// fitxategi bitarra sortu idazketarako
f = fopen(sFitxIzen, "wb");
if (f == NULL)
{
printf("Errorea '%s' fitxategia irekitzean 'DatuakBiltegitu()' funtzioan \a\n", sFitxIzen);
}
else
{
lPosizioa = -1;
do
{
lPosizioa++;
printf("Eman %ld posizioko ikaslearen izen-deiturak: ", lPosizioa);
fgets(stElem.sIzenDeiturak, sizeof(stElem.sIzenDeiturak), stdin);
stElem.sIzenDeiturak[strcspn(stElem.sIzenDeiturak, "\n")] = 0; // lerro-berri karakterea kendu
printf("Eman ikaslearen deialdia: ");
scanf("%d", &stElem.iDeialdia);
printf("Eman ikaslearen nota: ");
scanf("%f", &stElem.fNota);
getchar(); // lerro-berri karakterea kontsumitu
printf("---Ikaslearen datuak: | %-20s | %d | %.2f |---\n\n", stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
// datuak banan-banan fitxategian idatzi
fwrite(&stElem, sizeof(struct tstFitxa), 1, f);
printf("Gehiagorik? (B/E) ");
cErantz = getch();
cErantz = toupper(cErantz);
printf("%c\n", cErantz);
} while (cErantz != 'E');
fclose(f);
}
printf("\n");
}
// fitxategiaren prozesaketa osoa
void DatuGuztiakErakutsi_0(const char sFitxIzen[])
{
FILE *f;
struct tstFitxa stElem;
int iPosizioa;
// fitxategi bitarra irakurketa moduan ireki
f = fopen(sFitxIzen, "rb");
printf("++++while (fread(&stElem, sizeof(struct tstFitxa), 1, f))++++\n");
printf("---------------------------------------------------------------------\n");
// fitxategiko datuak banan-banan irakurri eta pantailan erakutsi
iPosizioa = 0;
while (fread(&stElem, sizeof(struct tstFitxa), 1, f)) // irakurtzerik dagoen bitartean...
{
printf("%d. ikaslearen datuak: | %-20s | %d | %.2f |\n",
iPosizioa, stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
iPosizioa++;
}
fclose(f);
}
// fitxategiaren prozesaketa osoa
void DatuGuztiakErakutsi_1(const char sFitxIzen[])
{
FILE *f;
struct tstFitxa stElem;
int iKont;
long liZenbatBit;
f = fopen(sFitxIzen, "rb");
fseek(f, 0L, SEEK_END); // fitxategiaren bukaeran kokatu
liZenbatBit = ftell(f); // fitxategiaren tamaina kalkulatu
fseek(f, 0L, SEEK_SET); // fitxategiaren hasieran kokatu
// elementu guztiak prozesatu...
printf("++++for behemuga=1 goimuga=%ld+++++++++++++++++++++++++++++++++++++++++\n", (long)liZenbatBit/sizeof(struct tstFitxa));
printf("---------------------------------------------------------------------\n");
for (iKont = 1; iKont <= liZenbatBit/sizeof(struct tstFitxa); iKont++)
{
fread(&stElem, sizeof(struct tstFitxa), 1, f);
printf("##### %d. ikaslearen datuak: | %-20s | %d | %.2f |\n",
iKont, stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
}
fclose(f);
}
// fitxategi osoa prozesatzeko funtzioa
void DatuGuztiakBirritanIkusi(const char sFitxIzen[])
{
FILE *f;
struct tstFitxa stElem;
int iKont;
long liZenbatBit;
f = fopen(sFitxIzen, "rb");
fseek(f, 0L, SEEK_END); // fitxategiaren bukaeran kokatu
liZenbatBit = ftell(f); // fitxategiaren tamaina eskuratu
fseek(f, 0L, SEEK_SET); // fitxategiaren hasieran kokatu
// elementu guztiak prozesatu...
for (iKont = 1; iKont <= liZenbatBit/sizeof(struct tstFitxa); iKont++)
{
fread(&stElem, sizeof(struct tstFitxa), 1, f); // elementu bat irakurri eta...
printf("(1) %d. ikaslearen datuak: | %-20s | %d | %.2f |\n",
iKont, stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
fseek(f, (-1)*(long)sizeof(struct tstFitxa), SEEK_CUR); // fitxategian posizio bat atzera
fread(&stElem, sizeof(struct tstFitxa), 1, f); // elementu bat irakurri eta...
printf("(2) %d. ikaslearen datuak: | %-20s | %d | %.2f |\n",
iKont, stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
}
fclose(f);
}
// fitxategi osoa prozesatzeko funtzioa
void DatuGuztiakAldatu(const char sFitxIzen[])
{
FILE *f;
struct tstFitxa stElem;
int iKont;
long liZenbatBit;
f = fopen(sFitxIzen, "r+b");
fseek(f, 0L, SEEK_END); // fitxategiaren bukaeran kokatu
liZenbatBit = ftell(f); // fitxategiaren tamaina kalkulatu
fseek(f, 0L, SEEK_SET); // fitxategiaren hasieran kokatu
// elementu guztiak prozesatu...
for (iKont = 1; iKont <= liZenbatBit/sizeof(struct tstFitxa); iKont++)
{
fread(&stElem, sizeof(struct tstFitxa), 1, f); // elementu bat irakurri
stElem.iDeialdia++; // deialdia inkrementatu
fseek(f, (-1)*(long)sizeof(struct tstFitxa), SEEK_CUR); // fitxategian posizio bat atzera
fwrite(&stElem, sizeof(struct tstFitxa), 1, f); // fitxategian idatzi
fseek(f, 0L, SEEK_CUR); // ez dago soberan // uneko posizioan kokatu
}
fclose(f);
}
Estrukturen fitxategi bat daukagu eta elementu guztien iDeialdia eremua aldatu nahi dugu fitxategi laguntzaile bat erabiliz. Oraindik rename() funtzioa eta remove() funtzioa ezagutzen ez ditugulako, aldaketa bi urratsetan burutuko dugu:
- Elementu guztiak prozesatu laguntzailea elikatuz. Elementu bakoitzeko:
- fitxategitik_irakurri
- memorian_aldatu
- laguntzailean_idatzi
- Helburuko fitxategiaren elementu guztiak zapaldu. Elementu bakoitzeko:
- laguntzailetik_irakurri
- fitxategian_idatzi
Erakusten den programa honetan fitxategiaren existentzia frogatzen da programa nagusian, horren arabera:
- Baldin eta fitxategia bada, fitxategi osoaren edukia pantailaratzen da hiru modu desberdinetan eta ondoren fitxategiaren elementu guztietan aldaketa burutuko da fitxategi laguntzaile bat erabiliz
- Fitxategirik ez bada, fitxategia sortu eta datuz beteko da. Ondoren, lehen bezala, fitxategi osoaren edukia pantailaratzen da hiru modu desberdinetan eta jarraian fitxategiaren elementu guztietan aldaketa burutuko fitxategi laguntzaile bati esker
/* Ariketa-81_Fitxategien_6b_algoritmoa: elementu guztiak aldatu
fitxategi laguntzaile batez */
// Ariketa honetan rename() eta remove() funtzioak erabil daitezke.
#include <stdio.h>
#include <ctype.h> // toupper() funtziorako
#include <string.h> // strcpy() eta strcat() funtzioetarako
#include <conio.h> // getche() eta getch() funtzioetarako
#define sBIDEA "C:\\Tokia\\"
#define sLAGUNTZAILEA "C:\\Tokia\\FitxategiLaguntzailea.dat"
#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
{
char sIzenDeiturak[DATU_IZEN_MAX];
int iDeialdia;
float fNota;
};
int iFitxategirikBada(const char sFitxIzen[]);
void DatuakBiltegitu(const char sFitxIzen[]);
void DatuGuztiakErakutsi_0(const char sFitxIzen[]);
void DatuGuztiakErakutsi_1(const char sFitxIzen[]);
void DatuGuztiakBirritanIkusi(const char sFitxIzen[]);
void DatuGuztiakAldatu(const char sFitxIzen[]);
int main()
{
char sFitxIzenLaburra[FITX_IZEN_MAX];
char sFitxIzen[FITX_IZEN_MAX];
printf("Fitxategiaren izen laburra eman (adibidez 'Ikasleak' edo 'Datuak'): ");
gets(sFitxIzenLaburra);
strcpy(sFitxIzen, "C:\\Tokia\\");
strcat(sFitxIzen, sFitxIzenLaburra);
strcat(sFitxIzen, ".dat");
if (iFitxategirikBada(sFitxIzen) == 1)
{
printf("'%s' fitxategia existitzen da, bere edukia erakutsi...\n\n", sFitxIzen);
}
else
{
printf("'%s' fitxategia ez da existitzen, sortu eta erakutsi...\n\n", sFitxIzen);
DatuakBiltegitu(sFitxIzen);
}
printf("----DatuGuztiakErakutsi_0---------------------------------------------------\n");
DatuGuztiakErakutsi_0(sFitxIzen);
printf("----------------------------------------------------------------------------\n\n");
printf("----DatuGuztiakErakutsi_1---------------------------------------------------\n");
DatuGuztiakErakutsi_1(sFitxIzen);
printf("----------------------------------------------------------------------------\n\n");
printf("----DatuGuztiakBirritanIkusi------------------------------------------------\n");
DatuGuztiakBirritanIkusi(sFitxIzen);
printf("----------------------------------------------------------------------------\n\n");
printf("\nIkasleen deialdi kopurua eguneratzen '%s' fitxategian\n", sFitxIzen);
printf("beste '%s' delako fitxategi bat erabiliz\n", sLAGUNTZAILEA);
printf("Aurrera egiteko, edozein tekla sakatu!");
getch(); // itxaron edozein tekla sakatu arte
printf("\n\n");
DatuGuztiakAldatu(sFitxIzen);
printf("\n");
printf("----DatuGuztiakErakutsi_0---------------------------------------------------\n");
DatuGuztiakErakutsi_0(sFitxIzen);
printf("----------------------------------------------------------------------------\n\n");
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 sortu eta datuz bete
void DatuakBiltegitu(const char sFitxIzen[])
{
FILE *f;
struct tstFitxa stElem;
long lPosizioa;
char cErantz;
// fitxategi bitarra sortu idazketarako
f = fopen(sFitxIzen, "wb");
if (f == NULL)
{
printf("Errorea '%s' fitxategia irekitzean 'DatuakBiltegitu()' funtzioan \a\n", sFitxIzen);
}
else
{
lPosizioa = -1;
do
{
lPosizioa++;
printf("Eman %ld posizioko ikaslearen izen-deiturak: ", lPosizioa);
gets(stElem.sIzenDeiturak);
printf("Eman ikaslearen deialdia: ");
scanf("%d", &stElem.iDeialdia);
printf("Eman ikaslearen nota: ");
scanf("%f", &stElem.fNota);
getchar(); // lerro-berri karakterea kontsumitu
printf("---Ikaslearen datuak: | %-20s | %d | %.2f |---\n\n", stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
// datuak banan-banan fitxategian idatzi
fwrite(&stElem, sizeof(struct tstFitxa), 1, f);
printf("Gehiagorik? (B/E) ");
cErantz = getch();
cErantz = toupper(cErantz);
printf("%c\n", cErantz);
} while (cErantz != 'E');
fclose(f);
}
printf("\n");
}
// fitxategiaren prozesaketa osoa
void DatuGuztiakErakutsi_0(const char sFitxIzen[])
{
FILE *f;
struct tstFitxa stElem;
int iPosizioa;
// fitxategi bitarra irakurketa moduan ireki
f = fopen(sFitxIzen, "rb");
printf("++++while (fread(&stElem, sizeof(struct tstFitxa), 1, f))+++++++++++++++++++\n");
printf("----------------------------------------------------------------------------\n");
// fitxategiko datuak banan-banan irakurri eta pantailan erakutsi
iPosizioa = 0;
while (fread(&stElem, sizeof(struct tstFitxa), 1, f)) // irakurtzerik dagoen bitartean...
{
printf("%d. ikaslearen datuak: | %-20s | %d | %.2f |\n",
iPosizioa, stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
iPosizioa++;
}
fclose(f);
}
// fitxategiaren prozesaketa osoa
void DatuGuztiakErakutsi_1(const char sFitxIzen[])
{
FILE *f;
struct tstFitxa stElem;
int iKont;
long liZenbatBit;
f = fopen(sFitxIzen, "rb");
fseek(f, 0L, SEEK_END); // fitxategiaren bukaeran kokatu
liZenbatBit = ftell(f); // fitxategiaren tamaina kalkulatu
fseek(f, 0L, SEEK_SET); // fitxategiaren hasieran kokatu
// elementu guztiak prozesatu...
printf("++++for behemuga=1 goimuga=%ld++++++++++++++++++++++++++++++++++++++++++++++++\n", (long)liZenbatBit/sizeof(struct tstFitxa));
printf("----------------------------------------------------------------------------\n");
for (iKont = 1; iKont <= liZenbatBit/sizeof(struct tstFitxa); iKont++)
{
fread(&stElem, sizeof(struct tstFitxa), 1, f);
printf("##### %d. ikaslearen datuak: | %-20s | %d | %.2f |\n",
iKont, stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
}
fclose(f);
}
// fitxategi osoa prozesatzeko funtzioa
void DatuGuztiakBirritanIkusi(const char sFitxIzen[])
{
FILE *f;
struct tstFitxa stElem;
int iKont;
long liZenbatBit;
f = fopen(sFitxIzen, "rb");
fseek(f, 0L, SEEK_END); // fitxategiaren bukaeran kokatu
liZenbatBit = ftell(f); // fitxategiaren tamaina eskuratu
fseek(f, 0L, SEEK_SET); // fitxategiaren hasieran kokatu
// elementu guztiak prozesatu...
for (iKont = 1; iKont <= liZenbatBit/sizeof(struct tstFitxa); iKont++)
{
fread(&stElem, sizeof(struct tstFitxa), 1, f); // elementu bat irakurri eta...
printf("(1) %d. ikaslearen datuak: | %-20s | %d | %.2f |\n",
iKont, stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
fseek(f, (-1)*(long)sizeof(struct tstFitxa), SEEK_CUR); // fitxategian posizio bat atzera
fread(&stElem, sizeof(struct tstFitxa), 1, f); // elementu bat irakurri eta...
printf("(2) %d. ikaslearen datuak: | %-20s | %d | %.2f |\n",
iKont, stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
}
fclose(f);
}
// fitxategi osoa prozesatzeko funtzioa
void DatuGuztiakAldatu(const char sFitxIzen[])
{
FILE *f;
FILE *fLAG;
struct tstFitxa stElem;
int iKont;
long liZenbatBit;
f = fopen(sFitxIzen, "r+b");
fLAG = fopen(sLAGUNTZAILEA, "w+b");
fseek(f, 0L, SEEK_END); // fitxategiaren bukaeran kokatu
liZenbatBit = ftell(f); // fitxategiaren tamaina kalkulatu
fseek(f, 0L, SEEK_SET); // fitxategiaren hasieran kokatu
fseek(fLAG, 0L, SEEK_SET); // fitxategi laguntzailearen hasieran kokatu
// elementu guztiak prozesatu laguntzailea elikatuz...
for (iKont = 1; iKont <= liZenbatBit/sizeof(struct tstFitxa); iKont++)
{
fread(&stElem, sizeof(struct tstFitxa), 1, f); // elementu bat irakurri
stElem.iDeialdia++; // deialdia inkrementatu
fwrite(&stElem, sizeof(struct tstFitxa), 1, fLAG); // fitxategi laguntzailean idatzi
printf("Laguntzailean idatzi dira %d. ikaslearen datuak: | %-20s | %d | %.2f |\n",
iKont, stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
}
fseek(f, 0L, SEEK_SET); // fitxategiaren hasieran kokatu
fseek(fLAG, 0L, SEEK_SET); // fitxategi laguntzailearen hasieran kokatu
// helburuko fitxategiaren elementu guztiak zapaldu...
for (iKont = 1; iKont <= liZenbatBit/sizeof(struct tstFitxa); iKont++)
{
fread(&stElem, sizeof(struct tstFitxa), 1, fLAG); // laguntzailetik elementu bat irakurri
fwrite(&stElem, sizeof(struct tstFitxa), 1, f); // fitxategian idatzi
}
fclose(f);
fclose(fLAG);
}

iruzkinik ez:
Argitaratu iruzkina