| ZER DAKIDAN: Fitxategien algoritmoak ikasi ditut. ZER IKASIKO DUDAN: Ikasitako fitxategien algoritmoen aplikazio bat egingo dut: fitxategi bat helburuko bi fitxategietan banatzea. |
Datuak gordetzen dituen fitxategi bat daukagu. Esate baterako, hiru eremuko erregistroen fitxategi bat daukagu (izena, adina eta nota). Jatorrizko fitxategitik abiatuta beste bi fitxategi berri sortuko dira, bietariko batean 25 urte edo hortik beherako ikasleak gordeko dira, beste fitxategi berrian gainerako ikasleak gordeko dira, hots, 26 edo gehiago dituztenak.
Hasierako fitxategitik abiatuta banaketa egiteko garaian hauek dira funtsezko aginduak, jatorrizko fitxategitik irakurri eta helburuko fitxategiren batean idatzi:
...
FILE *f = fopen(sIzena, "rb"); // irakurketarako ireki
FILE *f25B = fopen(s25etikBeherakoak, "wb"); // idazketarako ireki
FILE *f25G = fopen(s25etikGorakoak, "wb"); // idazketarako ireki
while (fread(&stElementua, sizeof(struct tstLaguna), 1, f))
{
if (stElementua.iAdina <= 25)
fwrite(&stElementua, sizeof(struct tstLaguna), 1, f25B);
else
fwrite(&stElementua, sizeof(struct tstLaguna), 1, f25G);
}
...
Erakusten den programa honetan fitxategiaren existentzia frogatzen da programa nagusian, horrelako izena duen fitxategirik ez bada sortu egiten da eta, aldiz, eman den izeneko fitxategia lehendik bada elementu gehiago gehitzeko aukera eskaintzen du programak. Beraz, fitxategiak elementurik izango du adibide honen zatirik garrantzitsuenera heltzean.
Uneko fitxategi osoa elementuz-elementu arakatuko dugu eta adinaren arabera idazketa bat egingo da helburuko fitxategi batean ala bestean.
Ikusi adibide honetan, batzuetan getche() funtzioa erabili dela karaktere bat jasotzeko (eta bere ostean printf("\n") bat egiten dela) eta beste batzuetan scanf() funtzioa erabili dela kopuru bat jasotzeko (eta bere ostean getchar() bat egin dela bufferra garbitzeko).
/* Ariketa-92_FitxategiaBitanBanatzen: fitxategi bat bitan banatu. */
// Fitxategiaren izena hartuta sortzen da lehendik existitzen ez bada,
// edo aukera dago elementu berriak gehitzeko. Ondoren, adinen araberako
// fitxategiaren banaketa egiten da bi fitxategi berri sortuz.
#include <stdio.h>
#include <stdlib.h> // srand() eta rand() funtzioetarako
#include <string.h> // strcspn() funtziorako
#include <time.h> // time() funtziorako
#include <ctype.h> // toupper() funtziorako
#include <conio.h> // getche() eta getch() funtzioetarako
#define TRUE 1
#define FALSE 0
#define GOIMUGA 9
#define FITX_IZEN_MAX 120 // fitxategiaren izenerako 119 karaktere gehi null mugatzailea
#define DATU_IZEN_MAX 50 // ikaslearen izena gordetzeko 49 karaktere gehi null mugatzailea
struct tstLaguna
{
char sIzena[DATU_IZEN_MAX];
int iAdina;
float fNota;
};
int boFitxategiaBada(const char sFitxIzen[]);
void FitxategiaIkusi(const char sFitxIzen[]);
void FitxategiaSortuEtaBete(const char sFitxIzen[]);
void FitxategiariElementuakGehitu(const char sFitxIzen[]);
void DatuenFitxategiBitanBanatu(const char sIzena[],
const char s25etikBeherakoak[],
const char s25etikGorakoak[]);
int main()
{
char sIzenLaburra[FITX_IZEN_MAX];
char sIzena[FITX_IZEN_MAX];
char s25etikBeherakoak[FITX_IZEN_MAX];
char s25etikGorakoak[FITX_IZEN_MAX];
char cErantz;
printf("''C:\\Tokia\\'' karpetan lan eginez...\n");
printf("Lanerako fitxategiaren izen laburra eman (adibidez, 'Lagunak'): ");
gets(sIzenLaburra);
strcpy(sIzena, "C:\\Tokia\\");
strcat(sIzena, sIzenLaburra);
strcat(sIzena, ".dat");
printf("Fitxategiaren izen osoa: >>>%s<<<\n\n", sIzena);
strcpy(s25etikBeherakoak, "C:\\Tokia\\25etikBeherakoak.dat");
strcpy(s25etikGorakoak, "C:\\Tokia\\25etikGorakoak.dat");
if (boFitxategiaBada(sIzena) == TRUE)
{
printf("'%s' fitxategia existitzen da, lan egin dezagun.\n\n", sIzena);
FitxategiaIkusi(sIzena);
do
{
printf("Fitxategi horri elementu berriak gehitzea nahi duzu? (B/E): ");
cErantz = getche();
cErantz = toupper(cErantz);
printf("\n");
} while (cErantz != 'B' && cErantz != 'E');
if (cErantz == 'B')
{
FitxategiariElementuakGehitu(sIzena);
FitxategiaIkusi(sIzena);
}
}
else
{
printf("'%s' fitxategia ez da existitzen, sortuko dugu.\n\n", sIzena);
FitxategiaSortuEtaBete(sIzena);
FitxategiaIkusi(sIzena);
}
DatuenFitxategiBitanBanatu(sIzena, s25etikBeherakoak, s25etikGorakoak);
do
{
printf("Sortutako bi fitxategi berriak ikusi nahi dituzu? (B/E): ");
cErantz = getche();
cErantz = toupper(cErantz);
printf("\n");
} while (cErantz != 'B' && cErantz != 'E');
if (cErantz == 'B')
{
FitxategiaIkusi(s25etikBeherakoak);
FitxategiaIkusi(s25etikGorakoak);
}
printf("\nPrograma bukatzera doa. Edozein tekla sakatu! ");
getch(); // itxaron edozein tekla sakatu arte
printf("\n");
return 0;
}
int boFitxategiaBada(const char sFitxIzen[])
{
FILE *f = fopen(sFitxIzen, "rb");
if (!f)
{
printf("Fitxategia irekitzean errorea\n\a");
printf("Ezin izan da '%s' fitxategia ireki\n", sFitxIzen);
return FALSE;
}
else
{
fclose(f);
return TRUE;
}
}
void FitxategiaIkusi(const char sFitxIzen[])
{
FILE *f = fopen(sFitxIzen, "rb");
struct tstLaguna stElementua;
long liZenbatElementu;
if (!f)
{
printf("Fitxategia irekitzean errorea\n\a");
printf("Ezin izan da '%s' fitxategia ireki\n", sFitxIzen);
return;
}
fseek(f, 0L, SEEK_END);
liZenbatElementu = ftell(f) / sizeof(struct tstLaguna);
fseek(f, 0L, SEEK_SET);
printf("'%s' fitxategiak %ld elementu ditu, bere edukia:\n", sFitxIzen, liZenbatElementu);
while (fread(&stElementua, sizeof(struct tstLaguna), 1, f))
{
printf("%35s %10d %12.2f\n", stElementua.sIzena, stElementua.iAdina, stElementua.fNota);
}
printf("\n");
fclose(f);
}
void FitxategiaSortuEtaBete(const char sFitxIzen[])
{
FILE *f;
struct tstLaguna stElementua;
int i, iKopurua;
f = fopen(sFitxIzen, "wb");
if (!f)
{
printf("Fitxategia irekitzean errorea\n\a");
printf("Ezin izan da '%s' fitxategia sortu\n", sFitxIzen);
return;
}
printf("Zenbat elementu nahi dituzu '%s' fitxategian? ", sFitxIzen);
scanf("%d", &iKopurua);
getchar(); // bufferra garbitu
srand(time(NULL));
for (i = 0; i < iKopurua; i++)
{
printf("%d. lagunaren izena eman: ", i);
gets(stElementua.sIzena);
stElementua.iAdina = rand()%10 + 20;
stElementua.fNota = rand()%10 + (rand()%10)*0.1;
fwrite(&stElementua, sizeof(struct tstLaguna), 1, f);
}
fclose(f);
}
void FitxategiariElementuakGehitu(const char sFitxIzen[])
{
FILE *f;
struct tstLaguna stElementua;
char cErantz;
f = fopen(sFitxIzen, "ab");
if (!f)
{
printf("Fitxategia irekitzean errorea\n\a");
printf("Ezin izan da '%s' fitxategia ireki\n", sFitxIzen);
return;
}
srand(time(NULL));
do
{
printf("%s fitxategian gordetzeko lagun baten izena eman: ", sFitxIzen);
gets(stElementua.sIzena);
stElementua.iAdina = rand()%10 + 20;
stElementua.fNota = rand()%10 + (rand()%10)*0.1;
fwrite(&stElementua, sizeof(struct tstLaguna), 1, f);
printf("Datu gehiagorik gorde nahi duzu? (B/E): ");
cErantz = getche();
printf("\n");
} while (cErantz == 'B' || cErantz == 'b');
fclose(f);
}
void DatuenFitxategiBitanBanatu(const char sIzena[],
const char s25etikBeherakoak[],
const char s25etikGorakoak[])
{
FILE *f = fopen(sIzena, "rb"); // irakurketarako ireki
FILE *f25B = fopen(s25etikBeherakoak, "wb"); // idazketarako ireki
FILE *f25G = fopen(s25etikGorakoak, "wb"); // idazketarako ireki
struct tstLaguna stElementua;
if (!f || !f25B || !f25G)
{
printf("Hiru fitxategiak irekitzean errorea\n\a");
printf("Ezin izan da fitxategiren bat ireki\n");
return;
}
while (fread(&stElementua, sizeof(struct tstLaguna), 1, f))
{
if (stElementua.iAdina <= 25)
fwrite(&stElementua, sizeof(struct tstLaguna), 1, f25B);
else
fwrite(&stElementua, sizeof(struct tstLaguna), 1, f25G);
}
fclose(f);
fclose(f25B);
fclose(f25G);
}

iruzkinik ez:
Argitaratu iruzkina