| ZER DAKIDAN: Array, estruktura eta gainerako datu-motako aldagaien edukiak memorian gordetzen dira eta programa bukatzean informazio hori galtzen da. Datuak modu iraunkorrean mantentzea nahi baditut fitxategiak beharko ditut. ZER IKASIKO DUDAN: FILE datu-mota ikasiko dut. Estrukturen fitxategiak nola sor daitezkeen ikasiko dut eta, modu beretsuan, zenbakien fitxategiak nola sor daitezkeen ikasiko dut ere. |
Erregistroen fitxategi bat sortuko dugu hiru modu desberdinez. Algoritmoa, funtsean, bat da baina aldaketa txiki batzuk egingo ditugu programaren A, B eta C hiru bertsio kodetuz.
Fitxategiaren erregistroen eremuak hauek izango dira:
#define DATU_IZEN_MAX 72 // ikaslearen izena gordetzeko 71 karaktere gehi null mugatzailea
struct tstFitxa
{
char sIzenDeiturak[DATU_IZEN_MAX];
int iDeialdia;
float fNota;
};
Fitxategia sortzeko eta datuz betetzeko urratsak hauek dira:
- Fitxategiaren sFitxIzen izena zehaztu
- sFitxIzen izeneko fitxategia sortu fopen() funtzioari w marka emanez
- Fitxategian idazketak burutu fwrite() funtzioa aplikatuz
- Eta amaitzeko fitxategia itxi fclose() funtzioari deia eginez
Berezitasun bezala, lPosizioa aldagaiari esker informatzen zaio erabiltzaileari zein elementutan burutuko den hurrengo idazketa. Laguntzailea den lPosizioa aldagaia inkrementatuz doa while kontrol-egituran eta prozesu errepikakor hori eteteko cErantz aldagaia erabiltzen da.
/* Ariketa-76_Fitxategien_1a_algoritmoa: fitxategi bat berriki sortu eta datuz bete */
// Berezitasun bezala, lPosizioa aldagaiari esker informatzen zaio
// erabiltzaileari zein elementutan burutuko den hurrengo idazketa.
#include <stdio.h>
#include <string.h> // strcspn() funtziorako
#include <ctype.h> // toupper() funtziorako
#include <conio.h> // getche() eta getch() funtzioetarako
#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;
};
void DatuakBiltegitzen(const char sFitxIzen[]);
int main()
{
char sFitxIzen[FITX_IZEN_MAX];
printf("Fitxategiaren izena eman ('Datuak.DAT' adibidez): ");
gets(sFitxIzen);
printf("Ikasleen datuak '%s' fitxategian gordetzen...\n\n", sFitxIzen);
DatuakBiltegitzen(sFitxIzen);
printf("\nPrograma bukatzera doa. Edozein tekla sakatu! ");
getch(); // itxaron edozein tekla sakatu arte
printf("\n");
return 0;
}
void DatuakBiltegitzen(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 'DatuakBiltegitzen()' 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: | %-15s | %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);
}
}
Berezitasun bezala, fgetpos() funtzioa erabiltzen da erabiltzaileari informatzeko fitxategiaren zein elementutan burutuko den hurrengo idazketa. Idazketa edo irakurketa baten ostean berez inkrementatzen da fgetpos() funtzioaren balioa. Bertsio honetan ere while kontrol-egituraren prozesu errepikakorra eteteko cErantz aldagaia erabiltzen da.
/* Ariketa-76_Fitxategien_1b_algoritmoa: fitxategi bat berriki sortu eta datuz bete */
// Berezitasun bezala fgetpos() funtzioa erabiltzen da jakiteko fitxategiaren
// zein posiziotan burutuko den hurrengo irakurketa edo hurrengo idazketa.
#include <stdio.h>
#include <string.h> // strcspn() funtziorako
#include <ctype.h> // toupper() funtziorako
#include <conio.h> // getche() eta getch() funtzioetarako
#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;
};
void DatuakBiltegitzen(const char sFitxIzen[]);
int main()
{
char sFitxIzen[FITX_IZEN_MAX];
printf("Fitxategiaren izena eman ('Datuak.DAT' adibidez): ");
gets(sFitxIzen);
printf("Ikasleen datuak '%s' fitxategian gordetzen...\n\n", sFitxIzen);
DatuakBiltegitzen(sFitxIzen);
printf("\nPrograma bukatzera doa. Edozein tekla sakatu! ");
getch(); // itxaron edozein tekla sakatu arte
printf("\n");
return 0;
}
void DatuakBiltegitzen(const char sFitxIzen[])
{
FILE *f;
struct tstFitxa stElem;
char cErantz;
long liPosizioa;
// fitxategi bitarra sortu idazketarako
f = fopen(sFitxIzen, "wb");
if (f == NULL)
{
printf("Errorea '%s' fitxategia irekitzean 'DatuakBiltegitzen()' funtzioan \a\n", sFitxIzen);
}
else
{
liPosizioa = ftell(f);
printf("\nHasieran, ftell(f)=%ld ftell(f)/sizeof()=%d\n", liPosizioa, (int)(liPosizioa/sizeof(struct tstFitxa)));
do
{
liPosizioa = ftell(f);
printf("Eman %ld posizioko ikaslearen izen-deiturak: ", (long)(liPosizioa/sizeof(struct tstFitxa)));
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: | %-15s | %d | %.2f |\n", stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
// datuak banan-banan fitxategian idatzi
fwrite(&stElem, sizeof(struct tstFitxa), 1, f);
liPosizioa = ftell(f);
printf("Idatzi ondoren, ftell(f)=%ld ftell(f)/sizeof()=%ld\n\n", liPosizioa, (long)(liPosizioa/sizeof(struct tstFitxa)));
printf("Gehiagorik? (B/E) ");
cErantz = getch();
cErantz = toupper(cErantz);
printf("%c\n", cErantz);
} while (cErantz != 'E');
fclose(f);
}
}
C bertsio hau lehen ikusitako A bertsio bera da algoritmia aldetik, bakarrik, hori bai, kode zati bat gehitu zaio FitxategiarenBytak() funtzioaren bitartez jakiteko fitxategiak zenbat elementu biltegitu dituen. Elementuen kopurua ezagutzeko funtzio hauek aplikatu beharko dira:
- fseek() fitxategiaren bukaeran kokatzeko,
- ftell() byte kopurua ezagutzeko eta
- sizeof() elementuen kopurua kalkulatzeko.
/* Ariketa-76_Fitxategien_1c_algoritmoa: fitxategi bat berriki sortu eta datuz bete
bukaeran fitxategiaren tamaina bytetan lortzen
da eta fitxategiaren elementuen kopurua ere. */
// Horretarako fseek() funtzioa, ftell() funtzioa eta sizeof() funtzioa beharko dira.
#include <stdio.h>
#include <string.h> // strcspn() funtziorako
#include <ctype.h> // toupper() funtziorako
#include <conio.h> // getche() eta getch() funtzioetarako
#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;
};
void DatuakBiltegitzen(const char sFitxIzen[]);
long liFitxategiarenBytak(const char sFitxIzen[]);
int main()
{
char sFitxIzen[FITX_IZEN_MAX];
long lByteKop;
printf("Fitxategiaren izena eman ('Datuak.DAT' adibidez): ");
gets(sFitxIzen);
printf("Ikasleen datuak '%s' fitxategian gordetzen...\n\n", sFitxIzen);
DatuakBiltegitzen(sFitxIzen);
printf("\n");
lByteKop = liFitxategiarenBytak(sFitxIzen);
if (lByteKop != -1)
{
printf("Fitxategiaren tamaina: %ld bytes \n", lByteKop);
printf("Elementuen kopurua: %ld fitxa \n", (long)(lByteKop/sizeof(struct tstFitxa)));
}
printf("[tstFitxa = char sIzenDeiturak[DATU_IZEN_MAX] + Int + Float] [%ld = %ld + %ld + %ld]\n",
(long)sizeof(struct tstFitxa), (long)sizeof(char [DATU_IZEN_MAX]), (long)sizeof(int), (long)sizeof(float));
printf("\n");
printf("\nPrograma bukatzera doa. Edozein tekla sakatu! ");
getch(); // itxaron edozein tekla sakatu arte
printf("\n");
return 0;
}
void DatuakBiltegitzen(const char sFitxIzen[])
{
FILE *f;
struct tstFitxa stElem;
int iPosizioa;
char cErantz;
// fitxategi bitarra sortu idazketarako
f = fopen(sFitxIzen, "wb");
if (f == NULL)
{
printf("Errorea '%s' fitxategia irekitzean 'DatuakBiltegitzen()' funtzioan \a\n", sFitxIzen);
}
else
{
iPosizioa = -1;
do
{
iPosizioa++;
printf("Eman %d posizioko ikaslearen izen-deiturak: ", iPosizioa);
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: | %-15s | %d | %.2f |\n\n", stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
// datuak banan-banan fitxategian idatzi
fwrite(&stElem, sizeof(stElem), 1, f);
printf("Gehiagorik? (B/E) ");
cErantz = getch();
cErantz = toupper(cErantz);
printf("%c\n", cErantz);
} while (cErantz != 'E');
fclose(f);
}
}
long liFitxategiarenBytak(const char sFitxIzen[])
{
long lZenbatBit;
// fitxategia irakurketarako zabaldu
FILE* fp = fopen(sFitxIzen, "rb");
// aztertu fitxategia existitzen den ala ez
if (fp == NULL)
{
printf("Errorea '%s' fitxategia irekitzean 'liFitxategiarenBytak()' funtzioan \a\n", sFitxIzen);
return -1;
}
// fitxategiaren bukaeran kokatu
fseek(fp, 0L, SEEK_END);
// fitxategiaren tamaina kalkulatu
lZenbatBit = ftell(fp);
// fitxategia itxi
fclose(fp);
return lZenbatBit;
}
D bertsio honetan zenbaki osoen fitxategi bat sortuko da. Elementuen kopurua erabakitzeko erabiltzaileak teklatuz emango du iZenbatElementu aldagaiari balio positibo bat emanez. Fitxategiaren datuak auzaz aukeratuko dira rand() funtzioari esker.
/* Ariketa-76_Fitxategien_1d_algoritmoa: fitxategia sortu eta erakutsi */
// Berezitasun bezala, fitxategiaren balioak 0 eta 99 arteko
// kopuru osoak auzaz aukeratzen ditu programak. Erabiltzaileak
// erabakitzen du fitxategiak zenbat elementu izango dituen.
#include <stdio.h>
#include <stdlib.h> // srand() eta rand() funtzioetarako
#include <string.h> // strcspn() funtziorako
#include <time.h> // time() funtziorako
#include <conio.h> // getch() funtziorako
#define FITX_IZEN_MAX 120 // fitxategiaren izenerako 119 karaktere gehi null mugatzailea
void FitxategiarenEdukiaIkusi(const char sFitxIzen[]);
void FitxategiaSortuEtaBete(const char sFitxIzen[]);
int main()
{
char sFitxIzen[FITX_IZEN_MAX];
printf("Fitxategiaren izena eman ('Kopuruak.DAT' adibidez): ");
fgets(sFitxIzen, sizeof(sFitxIzen), stdin);
sFitxIzen[strcspn(sFitxIzen, "\n")] = 0; // lerro-berri karakterea kendu
printf("Ikasleen datuak '%s' fitxategian gordetzen...\n\n", sFitxIzen);
FitxategiaSortuEtaBete(sFitxIzen);
printf("Fitxategiaren elementu guztiak pantailaratuko ditugu. Hona hemen...\n");
FitxategiarenEdukiaIkusi(sFitxIzen);
printf("\nPrograma bukatzera doa. Edozein tekla sakatu! ");
getch(); // itxaron edozein tekla sakatu arte
printf("\n");
return 0;
}
void FitxategiarenEdukiaIkusi(const char sFitxIzen[])
{
FILE *fFitxategia = fopen(sFitxIzen, "rb");
if (!fFitxategia)
{
printf("Errorea '%s' fitxategia irekitzean 'FitxategiarenEdukiaIkusi()' funtzioan \a\n", sFitxIzen);
return;
}
int iElem, iPosizioa = 0;
printf("Fitxategiaren edukia:\n");
while (fread(&iElem, sizeof(int), 1, fFitxategia) == 1)
{
printf("%8d. elementua = %2d\n", iPosizioa, iElem);
iPosizioa++;
}
printf("\n");
fclose(fFitxategia);
}
void FitxategiaSortuEtaBete(const char sFitxIzen[])
{
FILE *f;
int iElem;
int iKopurua;
f = fopen(sFitxIzen, "wb");
if (!f)
{
printf("Errorea '%s' fitxategia irekitzean 'FitxategiaSortuEtaBete()' funtzioan \a\n", sFitxIzen);
return;
}
do
{
printf("Zenbat elementu nahi dituzu '%s' fitxategian? ", sFitxIzen);
scanf("%d", &iKopurua);
getchar(); // bufferra garbitu
if (iKopurua <= 0)
printf("Gutxienez elementu 1 behar da\n");
} while (iKopurua <= 0);
srand(time(NULL));
for (int iKont = 0; iKont < iKopurua; iKont++)
{
iElem = rand()%100;
fwrite(&iElem, sizeof(int), 1, f);
}
fclose(f);
}
E bertsio honetan zenbaki errealen fitxategi bat sortuko da. Elementuen kopurua erabakitzeko rand() funtzioa erabiliko da. Fitxategiaren datuak auzaz aukeratuko dira rand() funtzioari esker, 0.0 eta 9.9 artekoak izango dira.
/* Ariketa-76_Fitxategien_1e_algoritmoa: fitxategia sortu eta erakutsi */
// Berezitasun bezala, fitxategiaren balioak 0.0 eta 9.9 arteko
// kopuru osoak auzaz aukeratzen ditu programak. Fitxategiak
// zenbat elementu izango dituen programak erabakitzen du ere.
#include <stdio.h>
#include <stdlib.h> // srand() eta rand() funtzioetarako
#include <string.h> // strcspn() funtziorako
#include <time.h> // time() funtziorako
#include <conio.h> // getch() funtziorako
#define FITX_IZEN_MAX 120 // fitxategiaren izenerako 119 karaktere gehi null mugatzailea
void FitxategiarenEdukiaIkusi(const char sFitxIzen[]);
void FitxategiaSortuEtaBete(const char sFitxIzen[]);
int main()
{
char sFitxIzen[FITX_IZEN_MAX];
printf("Fitxategiaren izena eman ('Zenbakiak.DAT' adibidez): ");
gets(sFitxIzen);
printf("Ikasleen datuak '%s' fitxategian gordetzen...\n\n", sFitxIzen);
FitxategiaSortuEtaBete(sFitxIzen);
printf("Fitxategiaren elementu guztiak pantailaratuko ditugu. Hona hemen...\n");
FitxategiarenEdukiaIkusi(sFitxIzen);
printf("\nPrograma bukatzera doa. Edozein tekla sakatu! ");
getch(); // itxaron edozein tekla sakatu arte
printf("\n");
return 0;
}
void FitxategiarenEdukiaIkusi(const char sFitxIzen[])
{
FILE *fFitxategia = fopen(sFitxIzen, "rb");
float fElem;
int iPosizioa = 0;
if (!fFitxategia)
{
printf("Errorea '%s' fitxategia irekitzean 'FitxategiarenEdukiaIkusi()' funtzioan \a\n", sFitxIzen);
return;
}
printf("Fitxategiaren edukia:\n");
while (fread(&fElem, sizeof(float), 1, fFitxategia) == 1)
{
printf("%8d. elementua = %.1f\n", iPosizioa, fElem);
iPosizioa++;
}
printf("\n");
fclose(fFitxategia);
}
void FitxategiaSortuEtaBete(const char sFitxIzen[])
{
FILE *f;
float fElem;
int iZenbatElementu;
f = fopen(sFitxIzen, "wb");
if (!f)
{
printf("Errorea '%s' fitxategia irekitzean 'FitxategiaSortuEtaBete()' funtzioan \a\n", sFitxIzen);
return;
}
srand(time(NULL));
iZenbatElementu = rand()%11 + 5; // 0+5=5 eta 10+5=15 arteko kopuru bat
printf("'%s' fitxategiak %d elementu gordeko ditu\n", sFitxIzen, iZenbatElementu);
for (int iKont = 0; iKont < iZenbatElementu; iKont++)
{
int iHamarrekoa = rand()%10;
fElem = rand()%10 + 0.1*iHamarrekoa;
fwrite(&fElem, sizeof(float), 1, f);
}
fclose(f);
}
|

iruzkinik ez:
Argitaratu iruzkina