fitxategi etiketadun mezuak erakusten. Erakutsi mezu guztiak
fitxategi etiketadun mezuak erakusten. Erakutsi mezu guztiak

2025(e)ko apirilaren 9(a), asteazkena

Ariketa 93 | Bi fitxategi bakarrean bildu

ZER DAKIDAN:
Fitxategien algoritmoak ikasi ditut.



ZER IKASIKO DUDAN:
Ikasitako fitxategien algoritmoen aplikazio bat egingo dut: bi fitxategi helburuko fitxategi bakarrean bildu.

Datuak gordetzen dituen bi fitxategi ditugu. Esate baterako, hiru eremuko (izena, adina eta nota) erregistroen fitxategi pare bat daukagu. Hasierako bi fitxategietatik abiatuta fitxategi berri sortuko da aurreko biren informazioarekin.

Hasierako bi fitxategietan lagun batzuen informazioa gordetzen da, lehen fitxategian Jare, Danel, Izaro eta Martin lagunak badaude, bigarren fitxategian lagun berberak egongo dira ordena berean: Jare, Danel, Izaro eta Martin. Adinak ere berdinak izango dira lagun bakoitzeko lehen fitxategian zein bigarrenean (notak ez, notak desberdinak izan daitezke eta adibidez Danelek 7.4 bat izan dezake lehen fitxategian eta 8.6 bigarrenean).

Adibidez, hasierako lehen fitxategiaren edukia hau bada:

C:\Tokia\AgendaZahar1.dat
0   Jare  
   19  
  4.6  
1    Danel   
   18  
  7.4   
2    Izaro   
   18  
  7.1   
3    Martin  
   20   
 6.2 

Hasierako bigarren fitxategiak ondoko hau gorde dezake:

C:\Tokia\AgendaZahar2.dat
0   Jare  
   19  
  3.1  
1    Danel  
   18  
  8.6  
2    Izaro  
   18  
  7.5  
3    Martin  
   20  
  6.0  

Ondorioz, helburuko fitxategiak biltegituko duen informazioa hau izan beharko da:

C:\Tokia\AgendaBerria.dat
0   Jare  
   19  
  4.6  
1    Jare  
   19  
  3.1  
2    Danel  
   18  
  7.4  
3    Danel  
   18  
  8.6  
4   Izaro  
   18  
  7.1  
5    Izaro  
   18  
  7.5  
6    Martin  
   20  
  6.2  
7    Martin  
   20  
  6.0  

Helburuko fitxategia lortzeko algoritmoa erraza da: hasierako lehen fitxategitik irakurri eta helburukoan idatzi, hasierako bigarren fitxategitik irakurri eta helburukoan idatzi. Honela, adibidez:

   ...
    fFitxategi1 = fopen(sFitxIzen1, "rb");    // irakurketarako ireki
    fFitxategi2 = fopen(sFitxIzen2, "rb");    // irakurketarako ireki
    fFitxategia = fopen(sFitxIzena, "wb");    // idazketarako ireki

    for (liKont = 0; liKont < liZenbat; liKont++)
    {
        fread(&stElementua, sizeof(struct tstLaguna), 1, fFitxategi1);
        fwrite(&stElementua, sizeof(struct tstLaguna), 1, fFitxategia);
        fread(&stElementua, sizeof(struct tstLaguna), 1, fFitxategi2);
        fwrite(&stElementua, sizeof(struct tstLaguna), 1, fFitxategia);
    }
   ...

Erakusten den programa honetan lehen fitxategiaren existentzia frogatzen da programa nagusian, horrelako izena duen fitxategirik ez bada sortu egiten da eta, aldiz, eman den izeneko lehen fitxategia aurretik existitzen bada elementu gehiago gehitzeko aukera eskaintzen du programak. Beraz, lehen fitxategiak elementurik izango du bigarren fitxategia sortu baino lehen.

BigarrenAgendakoDatuakLortu(sFitxZahar1, sFitxZahar2, liElemKop) funtzioari esker sortzen da bigarren fitxategia, izenak eta adinak lehen fitxategitik hartuta eta notak auzaz aukeratuta.

Ondoren, datuen bi fitxategiak ditugula, sortuko da helburuko fitxategi osatua informazioa gutiarekin.

Erakusten den programa hau bukatu aurretik, kontaktu jakin baten noten batezbesteko aritmetikoa kalkulatuko da (Danelen kasuan 7.4+8.6=8.0). Horretarako, Danel izenaren bilaketa burutu ondoren kontaktuaren posizioa itzuliko zaio programa nagusiari eta honek fBiNotenMediaKalkulatu() funtzioa aktibatuko du.

/* Ariketa-93_BiFitxategiaBakarreanBildu: bi fitxategi batean batu. */

// Lehen fitxategiaren izena hartuta sortzen da lehendik existitzen ez bada,
// edo aukera dago elementu berriak gehitzeko. Ondoren, bigarren fitxategiko
// datuak lortzen dira (izenak eta adinak berdin mantenduko dira, baina notak
// desberdinak izan daitezke auzaz eskuratzen baitira). Datuen bi fitxategiak
// lortuta helburuko fitxategi osatua eraikitzen da, bukatzeko kontaktu jakin
// baten noten batezbesteko aritmetikoa kalkulatuko da, horretarako izenaren
// bilaketa bat burutu ondoren kontaktuaren indizea itzultzen zaio programa
// nagusiari eta honek fBiNotenMediaKalkulatu() funtzioa aktibatuko du.

#include <stdio.h>
#include <stdlib.h>   // srand() eta rand() funtzioetarako
#include <string.h>   // strcmp() 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 LehenAgendaSortuEtaDatuzBete(const char sFitxIzen[]);
void FitxategiariElementuakGehitu(const char sFitxIzen[]);
long int liElementuKopuruaKalkulatu(const char sFitxIzen[]);
void BigarrenAgendakoDatuakLortu(const char sFitxIzen1[],
                                 const char sFitxIzen2[],
                                 long int liElemKop);
void AgendaBerriaLortuDatuakNahastuz(const char sFitxIzen1[],
                                     const char sFitxIzen2[],
                                     const char sFitxIzena[],
                                     long int liElemKop);
long int liKontaktuBatBilatu(const char sFitxIzen[], const char* sGakoa);
float fBiNotenMediaKalkulatu(const char sFitxIzen[], long int liNonDago);


int main()
{
    const char sFitxZahar1[] = "C:\\Tokia\\AgendaZahar1.dat";
    const char sFitxZahar2[] = "C:\\Tokia\\AgendaZahar2.dat";
    const char sFitxBerria[] = "C:\\Tokia\\AgendaBerria.dat";
    char cErantz;
    long int liElemKop;
    float fBatazbestekoa;
    char sGakoa[DATU_IZEN_MAX];
    long int liIndizea;

    srand(time(NULL));

    if (boFitxategiaBada(sFitxZahar1) == TRUE)
    {
        printf("'%s' fitxategia existitzen da, lan egin dezagun.\n\n", sFitxZahar1);
        FitxategiaIkusi(sFitxZahar1);
        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(sFitxZahar1);
            FitxategiaIkusi(sFitxZahar1);
        }
    }
    else
    {
        printf("'%s' fitxategia ez da existitzen, sortuko dugu.\n\n", sFitxZahar1);
        LehenAgendaSortuEtaDatuzBete(sFitxZahar1);
        FitxategiaIkusi(sFitxZahar1);
    }

    liElemKop = liElementuKopuruaKalkulatu(sFitxZahar1);
    if (liElemKop > 0)
    {
        BigarrenAgendakoDatuakLortu(sFitxZahar1, sFitxZahar2, liElemKop);
        FitxategiaIkusi(sFitxZahar2);
        AgendaBerriaLortuDatuakNahastuz(sFitxZahar1, sFitxZahar2, sFitxBerria, liElemKop);
        FitxategiaIkusi(sFitxBerria);

        printf("Bilatu nahi duzun kontaktuaren izena: ");
        scanf("%s", sGakoa);
        liIndizea = liKontaktuBatBilatu(sFitxBerria, sGakoa);
        if (liIndizea != -1)
        {
            printf("'%s' kontaktuari %ld indizea dagokio.\n", sGakoa, liIndizea);
            fBatazbestekoa = fBiNotenMediaKalkulatu(sFitxBerria, liIndizea);
            printf("Batazbestekoa: %.2f\n", fBatazbestekoa);
        }
        else
            printf("Ez da '%s' izeneko kontakturik aurkitu.\n", sGakoa);
    }
    else
        printf("Fitxategia hutsik dago.\n");

    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 *fFitxategia;
    struct tstLaguna stElementua;
    long liZenbatElementu;

    fFitxategia = fopen(sFitxIzen, "rb");
    if (!fFitxategia)
    {
        printf("Errorea '%s' fitxategia irakurtzeko irekitzean\n\a", sFitxIzen);
        return;
    }

    fseek(fFitxategia, 0L, SEEK_END);
    liZenbatElementu = ftell(fFitxategia) / sizeof(struct tstLaguna);
    fseek(fFitxategia, 0L, SEEK_SET);

    printf("'%s' fitxategiak %ld elementu ditu, bere edukia:\n", sFitxIzen, liZenbatElementu);
    while (fread(&stElementua, sizeof(struct tstLaguna), 1, fFitxategia))
    {
        printf("%35s %10d %12.2f\n", stElementua.sIzena, stElementua.iAdina, stElementua.fNota);
    }
    printf("\n");
    fclose(fFitxategia);
}


void LehenAgendaSortuEtaDatuzBete(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");
 // f = fopen(sFitxIzen, "r+b");  edo hau ere, baina gero bukaeran kokatuz...
    if (!f)
    {
        printf("Fitxategia irekitzean errorea\n\a");
        printf("Ezin izan da '%s' fitxategia ireki\n", sFitxIzen);
        return;
    }

    srand(time(NULL));
    do
    {
        printf("'%s' fitxategirako lagun baten izena eman: ", sFitxIzen);
        gets(stElementua.sIzena);
        stElementua.iAdina = rand()%10 + 20;
        stElementua.fNota = rand()%10 + (rand()%10)*0.1;
     // fseek(f, 0L, SEEK_END);  baldin eta irekiera "r+b" moduan egin bada
        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);
}


long int liElementuKopuruaKalkulatu(const char sFitxIzen[])
{
    FILE *fFitxategia;
    long liZenbatElementu;

    fFitxategia = fopen(sFitxIzen, "rb");
    fseek(fFitxategia, 0L, SEEK_END);
    liZenbatElementu = ftell(fFitxategia) / sizeof(struct tstLaguna);

    fclose(fFitxategia);
    return liZenbatElementu;
}


void BigarrenAgendakoDatuakLortu(const char sFitxIzen1[],
                                 const char sFitxIzen2[],
                                 long int liZenbat)
{
    FILE *f1;
    FILE *f2;
    struct tstLaguna stElementua;
    long int liKont;

    f1 = fopen(sFitxIzen1, "rb");
    f2 = fopen(sFitxIzen2, "wb");
    printf(" Aurreko '%s' fitxategiaren orden berean sortuko dira\n", sFitxIzen1);
    printf("bigarren '%s' fitxategiaren datuak (nota berriak dira)\n", sFitxIzen2);
    for (liKont = 0; liKont < liZenbat; liKont++)
    {
        fread(&stElementua, sizeof(struct tstLaguna), 1, f1);
        stElementua.fNota = rand()%10 + (rand()%10)*0.1;  // nota berria
        fwrite(&stElementua, sizeof(struct tstLaguna), 1, f2);
        printf("%ld. indizea duen %-15s lagunaren nota berria eman: %.1f\n", liKont, stElementua.sIzena, stElementua.fNota);
    }
    fclose(f1);
    fclose(f2);
}


void AgendaBerriaLortuDatuakNahastuz(const char sFitxIzen1[],
                                     const char sFitxIzen2[],
                                     const char sFitxIzena[],
                                     long int liZenbat)
{
    FILE *fFitxategi1, *fFitxategi2, *fFitxategia;
    struct tstLaguna stElementua;
    long int liKont;

    fFitxategi1 = fopen(sFitxIzen1, "rb");
    fFitxategi2 = fopen(sFitxIzen2, "rb");
    fFitxategia = fopen(sFitxIzena, "wb");
    if (!fFitxategi1 || !fFitxategi2 || !fFitxategia)
    {
        printf("Errorea fitxategiak irekitzen\n\a");
        return;
    }

    printf("'%s' eta '%s' fitxategiak '%s' fitxategira biltzen...\n", sFitxIzen1, sFitxIzen2, sFitxIzena);

    for (liKont = 0; liKont < liZenbat; liKont++)
    {
        fread(&stElementua, sizeof(struct tstLaguna), 1, fFitxategi1);
        fwrite(&stElementua, sizeof(struct tstLaguna), 1, fFitxategia);
        fread(&stElementua, sizeof(struct tstLaguna), 1, fFitxategi2);
        fwrite(&stElementua, sizeof(struct tstLaguna), 1, fFitxategia);
    }

    fclose(fFitxategi1);
    fclose(fFitxategi2);
    fclose(fFitxategia);
}


// Gogoratu bilaketa egiteko algoritmoa errazago geratzen dela for agindua erabiliz
// Gogoratu ere, indizea itzuli ordez bilatzen den estruktura osoa itzul daitekeela
long int liKontaktuBatBilatu(const char sFitxIzen[], const char sGakoa[])
{
    FILE *f;
    struct tstLaguna stElem;
    int booAurkitua = 0;
    long liIndizea = -1;

    f = fopen(sFitxIzen, "rb");
    if (f == NULL)
    {
        printf("'%s '", sFitxIzen);
        printf("Fitxategia irekitzean errorea\n\a");
        return -1;
    }

    while (fread(&stElem, sizeof(struct tstLaguna), 1, f) == 1 && !booAurkitua)
    {
        if (strcmp(stElem.sIzena, sGakoa) == 0)
        {
            booAurkitua = 1;
            liIndizea = ftell(f) / sizeof(struct tstLaguna) - 1;
        }
    }

    fclose(f);
    return liIndizea;
}


float fBiNotenMediaKalkulatu(const char sFitxIzen[], long int liNonDago)
{
    FILE *fFitxategia;
    struct tstLaguna stElem1, stElem2;
    float fBatazbestekoa = 0.0;

    fFitxategia = fopen(sFitxIzen, "rb");
    if (!fFitxategia)
    {
        printf("Errorea '%s' fitxategia irakurtzeko irekitzean\n\a", sFitxIzen);
        return -1.0;
    }

    fseek(fFitxategia, liNonDago*(long)sizeof(struct tstLaguna), SEEK_SET);
    fread(&stElem1, sizeof(struct tstLaguna), 1, fFitxategia);
    fread(&stElem2, sizeof(struct tstLaguna), 1, fFitxategia);

    fBatazbestekoa = (stElem1.fNota + stElem2.fNota) / 2.0;
    fclose(fFitxategia);
    return fBatazbestekoa;
}






  • Ariketa-93_BiFitxategiaBakarreanBildu.cbp | main.c  


 

Ariketa 92 | Fitxategia bitan banatu

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);
}






  • Ariketa-92_FitxategiaBitanBanatzen.cbp | main.c  


 

Ariketa 91 | Fitxategia sailkatu: 16. algoritmoa

[Ez da ikasi behar, nik ez dut galdetuko]

ZER DAKIDAN:
Fitxategiak eta arrayak antzekoak dira datu-mota bereko hainbat elementu gordetzen dituztelako. Algoritmo batzuk errazagoak dira arrayetan fitxategietan baino; adibidez, errazago sailkatzen da array bat fitxategi bat baino. Horregatik...



ZER IKASIKO DUDAN:
...horregatik, fitxategiko elementu guztiak array laguntzaile batera eramango ditut, arrayan elementuak sailkatuko ditut 11. jarduera | Array bat sailkatu/ordenatu kasuan egin nuen bezala, eta, bukatzeko, arrayaren informazio ordenatua hasierako fitxategian gordeko dut.

Datuak gordetzen dituen fitxategi bat daukagu. Esate baterako, erregistroen fitxategi bat daukagu eta erregistroen eremu bat fNota izendatu da. Programa honen helburua da fitxategia sailkatzea fNota eremuaren arabera, nota txikitenetik nota handienera fitxategia ordenatzea, alegia.

Sailkatze lana oso zaila da fitxategian burutzea, baina array batean egingarria da 11. jarduera | Array bat sailkatu/ordenatu adibidean erakutsi zen bezal. Beraz, jarraian erakusten den programan, lanen sekuentzia hau izango da: fitxategitik arrayra > arraya ordenatu > arraytik fitxategira.  

eta horregatik Datuak gordetzen dituen fitxategi bat daukagu. Esate baterako, erregistroen fitxategi bat daukagu eta erregistroen eremu bat fNota izendatu da. Programa honen helburua da fitxategia sailkatzea fNota eremuaren arabera, nota txikienetik nota handienera fitxategia ordenatzea, alegia.

Erakusten den programa honetan fitxategiaren existentzia ez da frogatzen baina FitxategiaIkusi() funtzioan ezin bada fitxategia ireki programa bukatutzat ematen da. Emandako izena duen fitxategirik bada bere edukia pantailaratzen da eta liZenbatElementu dituen elementuen kopurua kalkulatzen da, liZenbatElementu aldagaiak hartzen duen balioaren arabera erabaki hauek hartuko dira:

  • Baldin eta liZenbatElementu handiagoa bada arrayaren neurria baino, mezu bat erakutsiko da pantailan eta aukera ematen zaio erabiltzaileari beste fitxategi baten izena aukeratu dezan.
  • Fitxategiko elementu guztiak arrayan sar badaitezke urratsak hauek izango dira:
    1. Zehaztutako fitxategiaren edukia array laguntzaile batean gorde
    2. Array laguntzailea fNota arabera sailkatu
    3. Array laguntzailea ordenatuaren edukia jatorrizko fitxategira kopiatu aurreko informazioa galduz
/* Ariketa-91_Fitxategien_16_algoritmoa: sailkatu */

// Erregistroen fitxategi bat ordenatuko da fNota eremuaren
// arabera. Horretarako, fitxategiko edukia array laguntzaile
// batera eramango da sailkatze lana arrayan egiteko da, arraya
// ordenaturik dagoela bere informazioa fitxategian gordeko da.  

#include <stdio.h>
#include <stdlib.h>   // exit() funtziorako
#include <string.h>   // strcspn() funtziorako

#define GOIMUGA 9
#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
#define sBIDEA "C:\\Tokia\\"

// struct edo erregistroa definitzen ikasle baten datuak gordetzeko
struct tstFitxa
{
    char sIzenDeiturak[DATU_IZEN_MAX];
    int iDeialdia;
    float fNota;
};

void FitxategiaIkusi(const char sFitxIzen[]);
void FitxategitikBektoreaBete(const char sFitxIzen[],
                              struct tstFitxa astZerren[],
                              long *liLuzera);
void BektoretikFitxategiaBete(const char sFitxIzen[],
                              struct tstFitxa astZerren[],
                              long liLuzera);
void BektoreaIkusi(const struct tstFitxa astZerren[], long liLuzera);
void NotazOrdenatu(struct tstFitxa astZerren[], long liLuzera);
long liFitxategiarenEsparrua(const char sFitxIzen[]);

int main()
{
    char sFitxIzenLabur[FITX_IZEN_MAX];
    char sFitxIzen[FITX_IZEN_MAX];
    long liZenbatElementu, liLuzera;
    struct tstFitxa astZerren[GOIMUGA];

    do
    {
        printf("Fitxategia existitzen da eta datuak ditu (adibidez C:\\Tokia\\Ikasleak.DAT)\n");
        printf("Fitxategiaren izen laburra eman ('Ikasleak' adibidez): ");
        gets(sFitxIzenLabur);
        strcpy(sFitxIzen, sBIDEA);
        strcat(sFitxIzen, sFitxIzenLabur);
        strcat(sFitxIzen, ".dat");
        printf("Fitxategiaren izen osoa: >>>%s<<<\n\n", sFitxIzen);

        FitxategiaIkusi(sFitxIzen);

        liZenbatElementu = liFitxategiarenEsparrua(sFitxIzen);
        printf("Fitxategiaren elementuen kopurua %ld da eta bektoreak %d elementu onartzen ditu\n", liZenbatElementu, GOIMUGA+1);
        if (liZenbatElementu > GOIMUGA+1)
        {
            printf("'%s' fitxategia handiegia da programa honenzat\n", sFitxIzen);
            printf("Beste fitxategi-izen batekin saiatu!\n\n");
        }
    } while (liZenbatElementu > GOIMUGA+1);

    FitxategitikBektoreaBete(sFitxIzen, astZerren, &liLuzera);

    printf("Bektorea ordenatu baino lehen\n");
    BektoreaIkusi(astZerren, liLuzera);

    NotazOrdenatu(astZerren, liLuzera);

    printf("Bektorea ordenaturik\n");
    BektoreaIkusi(astZerren, liLuzera);

    BektoretikFitxategiaBete(sFitxIzen, astZerren, liLuzera);
    FitxategiaIkusi(sFitxIzen);

    printf("Programa bukatzera doa\n");
    return 0;
}


// fitxategiaren edukia ikusteko funtzioa
void FitxategiaIkusi(const char sFitxIzen[])
{
    FILE *fFitxategia;
    struct tstFitxa stElem;

    fFitxategia = fopen(sFitxIzen, "rb");
    if (!fFitxategia)
    {
        printf("Errorea '%s' fitxategia irekitzean 'FitxategiaIkusi()' funtzioan \a\n", sFitxIzen);
        exit(1);
    }
    printf("Fitxategiaren edukia:\n");
    while (fread(&stElem, sizeof(struct tstFitxa), 1, fFitxategia))
    {
        printf("%-50s %10d %15.2f\n", stElem.sIzenDeiturak,
                                      stElem.iDeialdia,
                                      stElem.fNota);
    }
    printf("\n");

    fclose(fFitxategia);
}


// fitxategitik abiatuta bektorea betetzeko funtzioa
void FitxategitikBektoreaBete(const char sFitxIzen[], struct tstFitxa astZerren[], long *liLuzera)
{
    FILE *fFitxategia;

    fFitxategia = fopen(sFitxIzen, "rb");
    if (!fFitxategia)
    {
        printf("Errorea '%s' fitxategia irekitzean 'FitxategitikBektoreaBete()' funtzioan \a\n", sFitxIzen);
        return;
    }

    *liLuzera = 0;
    while (*liLuzera < GOIMUGA && fread(&astZerren[*liLuzera], sizeof(struct tstFitxa), 1, fFitxategia))
    {
        (*liLuzera)++;
    }
    (*liLuzera)--;

    fclose(fFitxategia);
}


// bektoretik abiatuta fitxategia betetzeko funtzioa
void BektoretikFitxategiaBete(const char sFitxIzen[], struct tstFitxa astZerren[], long liLuzera)
{
    FILE *fFitxategia;

    fFitxategia = fopen(sFitxIzen, "wb");
    if (!fFitxategia)
    {
        printf("Errorea '%s' fitxategia irekitzean 'BektoretikFitxategiaBete()' funtzioan \a\n", sFitxIzen);
        return;
    }

    for (long i = 0; i <= liLuzera; i++)
    {
        fwrite(&astZerren[i], sizeof(struct tstFitxa), 1, fFitxategia);
    }

    fclose(fFitxategia);
}


// bektorea ikusteko funtzioa
void BektoreaIkusi(const struct tstFitxa astZerren[], long liLuzera)
{
    printf("Arrayaren edukia:\n");
    for (long i = 0; i <= liLuzera; i++)
    {
        printf("%-50s %10d %15.2f\n", astZerren[i].sIzenDeiturak,
                                      astZerren[i].iDeialdia,
                                      astZerren[i].fNota);
    }
    printf("\n");
}


// bektore baten ordenazioa notaren arabera, aukeraketa metodoaren bidez
void NotazOrdenatu(struct tstFitxa astZerren[], long liLuzera)
{
    for (long k = 0; k < liLuzera; k++)
    {
        long liPosMin = k;
        struct tstFitxa rdMin = astZerren[k];

        for (long j = k + 1; j <= liLuzera; j++)
        {
            if (rdMin.fNota > astZerren[j].fNota)
            {
                rdMin = astZerren[j];
                liPosMin = j;
            }
        }

        // trukatu
        astZerren[liPosMin] = astZerren[k];
        astZerren[k] = rdMin;
    }
}


// fitxategiaren tamaina lortzeko funtzioa
long liFitxategiarenEsparrua(const char sFitxIzen[])
{
    FILE *fFitxategia;
    long liZenbatElem;

    fFitxategia = fopen(sFitxIzen, "rb");
    if (!fFitxategia)
    {
        printf("Errorea '%s' fitxategia irekitzean 'liFitxategiarenEsparrua()' funtzioan \a\n", sFitxIzen);
        return 0;
    }

    fseek(fFitxategia, 0L, SEEK_END);
    liZenbatElem = ftell(fFitxategia) / sizeof(struct tstFitxa);

    fclose(fFitxategia);
    return liZenbatElem;
}


Gauza bera egin daiteke erregistroen bi eremuen araberako sailkatze-lana burutuz. Adibidez, demagun erregistroen fitxategia byDeialdia eremuaren arabera sailkatu nahi dela nagusiki, eta byDeialdia eremuaren balioak berdinak direnean sIzenDeiturak eremuaren arabera sailkatuko dela.

Ikus dezagun adibidez ondoko erregistroan oinarritutako fitxategia bat nola sailkatzen den bi eremuen informazioaren arabera. Sailkatze-lana DeialdizEtaNotazOrdenatu() funtzioan egiten da, zeinek array bat ordenatzen duen:

/* Ariketa-91_Fitxategien_16b_algoritmoa: bi eremuen arabera sailkatu */

// Erregistroen fitxategi bat ordenatuko da byDeialdia eremuaren
// eta fNota eremuaren arabera. Horretarako, fitxategiko edukia
// array laguntzaile batera eramango da sailkatze lana arrayan
// eginez (byDeialdia ordenatze-ezaugarri nagusia da eta horrren
// berdintasunik izatean fNota ordenatze-ezaugarri erabiliko da).
// Arraya ordenatuaren informazioa fitxategian gordeko da.

#include <stdio.h>
#include <string.h>  // strcmp() funtziorako
#include <stdlib.h>  // exit() funtziorako

#define GOIMUGA 9
#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
#define sBIDEA "C:\\Tokia\\"

// struct edo erregistroa definitzen ikasle baten datuak gordetzeko
struct tstFitxa
{
    char sIzenDeiturak[DATU_IZEN_MAX];
    int iDeialdia;
    float fNota;
};

void FitxategiaIkusi(const char sFitxIzen[]);
void FitxategitikBektoreaBete(const char sFitxIzen[],
                              struct tstFitxa astZerren[],
                              long *liLuzera);
void BektoretikFitxategiaBete(const char sFitxIzen[],
                              struct tstFitxa astZerren[],
                              long liLuzera);
void BektoreaIkusi(const struct tstFitxa astZerren[], long liLuzera);
void DeialdizEtaNotazOrdenatu(struct tstFitxa astZerren[], long liLuzera);
long liFitxategiarenEsparrua(const char sFitxIzen[]);

int main()
{
    char sFitxIzenLabur[FITX_IZEN_MAX];
    char sFitxIzen[FITX_IZEN_MAX];
    long liZenbatElementu, liLuzera;
    struct tstFitxa astZerren[GOIMUGA];

    do
    {
        printf("Fitxategia existitzen da eta datuak ditu (adibidez C:\\Tokia\\Ikasleak.DAT)\n");
        printf("Fitxategiaren izen laburra eman ('Ikasleak' adibidez): ");
        gets(sFitxIzenLabur);
        strcpy(sFitxIzen, sBIDEA);
        strcat(sFitxIzen, sFitxIzenLabur);
        strcat(sFitxIzen, ".dat");
        printf("Fitxategiaren izen osoa: >>>%s<<<\n\n", sFitxIzen);

        FitxategiaIkusi(sFitxIzen);

        liZenbatElementu = liFitxategiarenEsparrua(sFitxIzen);
        printf("Fitxategiaren elementuen kopurua %ld da eta bektoreak %d elementu onartzen ditu\n", liZenbatElementu, GOIMUGA+1);
        if (liZenbatElementu > GOIMUGA+1)
        {
            printf("'%s' fitxategia handiegia da programa honenzat\n", sFitxIzen);
            printf("Beste fitxategi-izen batekin saiatu!\n\n");
        }
    } while (liZenbatElementu > GOIMUGA+1);

    FitxategitikBektoreaBete(sFitxIzen, astZerren, &liLuzera);

    printf("Bektorea ordenatu baino lehen\n");
    BektoreaIkusi(astZerren, liLuzera);

    DeialdizEtaNotazOrdenatu(astZerren, liLuzera);

    printf("Bektorea ordenaturik\n");
    BektoreaIkusi(astZerren, liLuzera);

    BektoretikFitxategiaBete(sFitxIzen, astZerren, liLuzera);
    FitxategiaIkusi(sFitxIzen);

    printf("Programa bukatzera doa\n");
    return 0;
}


// fitxategiaren edukia ikusteko funtzioa
void FitxategiaIkusi(const char sFitxIzen[])
{
    FILE *fFitxategia;
    struct tstFitxa stElem;

    fFitxategia = fopen(sFitxIzen, "rb");
    if (!fFitxategia)
    {
        printf("Errorea '%s' fitxategia irekitzean 'FitxategiaIkusi()' funtzioan \a\n", sFitxIzen);
        exit(1);
    }
    printf("Fitxategiaren edukia:\n");
    while (fread(&stElem, sizeof(struct tstFitxa), 1, fFitxategia))
    {
        printf("%-50s %10d %15.2f\n", stElem.sIzenDeiturak,
                                      stElem.iDeialdia,
                                      stElem.fNota);
    }
    printf("\n");

    fclose(fFitxategia);
}


// fitxategitik abiatuta bektorea betetzeko funtzioa
void FitxategitikBektoreaBete(const char sFitxIzen[], struct tstFitxa astZerren[], long *liLuzera)
{
    FILE *fFitxategia;

    fFitxategia = fopen(sFitxIzen, "rb");
    if (!fFitxategia)
    {
        printf("Errorea '%s' fitxategia irekitzean 'FitxategitikBektoreaBete()' funtzioan \a\n", sFitxIzen);
        return;
    }

    *liLuzera = 0;
    while (*liLuzera < GOIMUGA && fread(&astZerren[*liLuzera], sizeof(struct tstFitxa), 1, fFitxategia))
    {
        (*liLuzera)++;
    }
    (*liLuzera)--;

    fclose(fFitxategia);
}


// bektoretik abiatuta fitxategia betetzeko funtzioa
void BektoretikFitxategiaBete(const char sFitxIzen[], struct tstFitxa astZerren[], long liLuzera)
{
    FILE *fFitxategia;

    fFitxategia = fopen(sFitxIzen, "wb");
    if (!fFitxategia)
    {
        printf("Errorea '%s' fitxategia irekitzean 'BektoretikFitxategiaBete()' funtzioan \a\n", sFitxIzen);
        return;
    }

    for (long i = 0; i <= liLuzera; i++)
    {
        fwrite(&astZerren[i], sizeof(struct tstFitxa), 1, fFitxategia);
    }

    fclose(fFitxategia);
}


// bektorea ikusteko funtzioa
void BektoreaIkusi(const struct tstFitxa astZerren[], long liLuzera)
{
    printf("Arrayaren edukia:\n");
    for (long i = 0; i <= liLuzera; i++)
    {
        printf("%-50s %10d %15.2f\n", astZerren[i].sIzenDeiturak,
                                      astZerren[i].iDeialdia,
                                      astZerren[i].fNota);
    }
    printf("\n");
}


// bektore baten ordenazioa notaren arabera, aukeraketa metodoaren bidez
void DeialdizEtaNotazOrdenatu(struct tstFitxa astZerren[], long liLuzera)
{
    for (long k = 0; k < liLuzera; k++)
    {
        long liPosMin = k;
        struct tstFitxa rdMin = astZerren[k];

        for (long j = k+1; j <= liLuzera; j++)   // ordenatu gabekoen artean minimoa non dagoen zehaztu
        {
            if (
                 (rdMin.iDeialdia > astZerren[j].iDeialdia) ||
                (
                 (rdMin.iDeialdia == astZerren[j].iDeialdia) &&                 // rdMin.iDeialdia berdina denean eta...
                 (strcmp(rdMin.sIzenDeiturak, astZerren[j].sIzenDeiturak) > 0)  // rdMin.sIzenDeiturak handiagoa denean...
                )
               )
            {
                rdMin = astZerren[j];
                liPosMin = j;
            }
        }

        // trukatu
        astZerren[liPosMin] = astZerren[k];
        astZerren[k] = rdMin;
    }
}



// fitxategiaren tamaina lortzeko funtzioa
long liFitxategiarenEsparrua(const char sFitxIzen[])
{
    FILE *fFitxategia;
    long liZenbatElem;

    fFitxategia = fopen(sFitxIzen, "rb");
    if (!fFitxategia)
    {
        printf("Errorea '%s' fitxategia irekitzean 'liFitxategiarenEsparrua()' funtzioan \a\n", sFitxIzen);
        return 0;
    }

    fseek(fFitxategia, 0L, SEEK_END);
    liZenbatElem = ftell(fFitxategia) / sizeof(struct tstFitxa);

    fclose(fFitxategia);
    return liZenbatElem;
}






  • Ariketa-91_Fitxategien_16a_algoritmoa.cbp | main.c  
  • Ariketa-91_Fitxategien_16b_algoritmoa.cbp | main.c  


 

Ariketa 90 | Elementu bat kendu: 15. algoritmoa

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:

  1. Ariketa-90_Fitxategien_15a_algoritmoa adibidean estrukturen array laguntzaile bat
  2. 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");
}






  • Ariketa-90_Fitxategien_15a_algoritmoa.cbp | main.c  
  • Ariketa-90_Fitxategien_15b_algoritmoa.cbp | main.c  


 

Ariketa 89 | Elementu berri bat txertatu: 14. algoritmoa

ZER DAKIDAN:
Fitxategiak eta arrayak antzekoak dira datu-mota bereko hainbat elementu gordetzen dituztelako. Algoritmo batzuk errazagoak dira arrayetan fitxategietan baino; adibidez, elementu berri bat txertatzea errazago egiten da array batean fitxategi batean baino. Horregatik...



ZER IKASIKO DUDAN:
...horregatik, fitxategiko elementu guztiak array batera eramango ditut, arrayan elementu berria tartekatuko dut, eta, bukatzeko, arrayaren informazio berritua hasierako fitxategian gordeko dut.
Horrez gain, bigarren fitxategi laguntzaile baten partehartzearekin elementu berria txertatuko dut helburuko fitxategian.

Datuak gordetzen dituen fitxategi bat daukagu. Esate baterako, erregistroen fitxategi bat daukagu eta elementu berri bat txertatu nahi da liNon posizio ezagun batean (liNon posizioaren balioa teklatuz emango du erabiltzaileak).

Elementu berriaren txertaketa burutzeko egitura laguntzaileren bat beharko dugu. Jarraian erakusten den bi programetan egitura laguntzaileak hauek izango dira:

  • Ariketa-89_Fitxategien_14a_algoritmoa adibidean erregistroen array laguntzaile bat
  • Ariketa-89_Fitxategien_14b_algoritmoa adibidean erregistroen 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, txertaketa egiteko 10. jarduera | Txertaketa array batean ikusi zen algoritmoa aplikatuko da.

/* Ariketa-89_Fitxategien_14a_algoritmoa: txertatu */

// Erregistroen fitxategi batetan elementu berri bat txertatzeko
// fitxategiko edukia array batera igaroko da, txertaketa arrayan
// gauzatu eta arrayaren informazio berritua fitxategira ekarri.

#include <stdio.h>
#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 iFitxategiaExistitzenDa(const char sFitxIzen[]);
void FitxategiaIkusi(const char sFitxIzen[]);
void FitxategitikBektoreaBete(const char sFitxIzen[],
                              struct tstFitxa A[],
                              long int *liLuzera);
void BektoretikFitxategiaBete(const char sFitxIzen[],
                              const struct tstFitxa A[],
                              long int liLuzera);
void BektoreaIkusi(const struct tstFitxa A[], int liLuzera);
void Tartekaketa(struct tstFitxa A[],
                 long int *liLuzera,
                 const struct tstFitxa stElementu,
                 long int liNon);
void DatuakEskuratu(struct tstFitxa *stElementua);
long int liFitxategiarenElemKopKalkulatu(const char sFitxIzen[]);


int main()
{
    char sFitxIzen[FITX_IZEN_MAX];
    char sFitxIzenLaburra[FITX_IZEN_MAX];
    struct tstFitxa stElementuBerria;
    long int liZenbatElem, liNon, 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
    snprintf(sFitxIzen, sizeof(sFitxIzen), "C:\\Tokia\\%s.dat", sFitxIzenLaburra);

    if (iFitxategiaExistitzenDa(sFitxIzen) == 1)
    {
        FitxategiaIkusi(sFitxIzen);

        liZenbatElem = liFitxategiarenElemKopKalkulatu(sFitxIzen);

        if (liZenbatElem < GOIMUGA)
        {
            FitxategitikBektoreaBete(sFitxIzen, A, &liLuzera);
            BektoreaIkusi(A, liLuzera);

            printf("Elementu berriari dagozkion datuak jaso...\n");
            DatuakEskuratu(&stElementuBerria);

            do
            {
                printf("Elementu berriaren posizioa bektorean (%d - %ld): ", BEHEMUGA, liLuzera);
                scanf("%ld", &liNon);
            } while (liNon < BEHEMUGA || liNon > liLuzera);

            Tartekaketa(A, &liLuzera, stElementuBerria, liNon);
            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;
}


// fitxategirik baden frogatzeko
int iFitxategiaExistitzenDa(const char sFitxIzen[])
{
    FILE *f;

    f = fopen(sFitxIzen, "rb");
    if (f != NULL)
    {
        fclose(f);
        return 1;
    }
    return 0;
}


// 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("Fitxategiaren edukia:\n");
    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);
}


// fitxategitik 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 idatzi
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);
}


// arrayaren edukia bistaratzeko
void BektoreaIkusi(const struct tstFitxa A[], 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 berri bat arrayan txertatzeko posizio jakin batean
void Tartekaketa(struct tstFitxa Z[], long int *liLuzera, const struct tstFitxa stElementu, long int liNon)
{
    for (int i = *liLuzera; i > liNon; i--)
    {
        Z[i] = Z[i - 1];
    }
    Z[liNon] = stElementu;
    (*liLuzera)++;
}


// elementu berri baten datuak eskuratzeko
void DatuakEskuratu(struct tstFitxa *stElementua)
{
    printf("Ikaslearen izen-deitura eman: ");
    gets(stElementua->sIzenDeiturak);

    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;
}


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-89_Fitxategien_14b_algoritmoa: txertatu */

// Erregistroen fitxategi batetan elementu berri bat txertatzeko
// beste fitxategi laguntzaile bat erabiliko da. Azkenean, lana
// burutu ondoren, jatorrizko fitxategia ezabatuko da eta emaitza
// gordetzen duen fitxategi laguntzailea berrizendatuko 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 iFitxategiaExistitzenDa(const char sFitxIzen[]);
void FitxategiaIkusi(const char sFitxIzen[]);
long int liFitxategiarenElemKopKalkulatu(const char sFitxIzen[]);
void DatuakEskuratu(struct tstFitxa *stElementua);
void ElementuaGehitu(const char sFitxIzen[], struct tstFitxa stElementuBerria);
void ElementuaTxertatu(const char sFitxIzen[],
                       const char sFitxIzenLaburra[],
                       struct tstFitxa stElementuBerria,
                       long liNon,
                       long liZenbatElem);

int main()
{
    char sFitxIzen[DATU_IZEN_MAX];
    char sFitxIzenLaburra[DATU_IZEN_MAX];
    struct tstFitxa stElementuBerria;
    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 (iFitxategiaExistitzenDa(sFitxIzen) == 1)
    {
        FitxategiaIkusi(sFitxIzen);
        printf("Elementu berriari dagozkion datuak jaso...\n");
        DatuakEskuratu(&stElementuBerria);
        liZenbatElem = liFitxategiarenElemKopKalkulatu(sFitxIzen);
        do
        {
            printf("Elementu berriaren posizioa fitxategian (0 - %ld): ", liZenbatElem);
            scanf("%ld", &liNon);
        } while (liNon < 0 || liNon > liZenbatElem);

        if (liNon == liZenbatElem)
            ElementuaGehitu(sFitxIzen, stElementuBerria);
        else
            ElementuaTxertatu(sFitxIzen, sFitxIzenLaburra, stElementuBerria, liNon, liZenbatElem);

        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;
}


// fitxategirik baden frogatzeko
int iFitxategiaExistitzenDa(const char sFitxIzen[])
{
    FILE *f;

    f = fopen(sFitxIzen, "rb");
    if (f != NULL)
    {
        fclose(f);
        return 1;
    }
    return 0;
}


// 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);
}


// fitxategiaren bukaeran datu berri bat gehitzeko funtzioa
void ElementuaGehitu(const char sFitxIzen[], struct tstFitxa stElementuBerria)
{
    FILE *f;
    fpos_t Posizioa;

    f = fopen(sFitxIzen, "a+b"); // fitxategia irakurtzeko eta bukaeran idazteko moduan ireki
    if (f == NULL)
    {
        printf("Errorea fitxategia irekitzean\n\a");
        return;
    }

    fgetpos(f, &Posizioa);
    fwrite(&stElementuBerria, sizeof(struct tstFitxa), 1, f); // fitxategian idatzi

    fclose(f); // fitxategia itxi
}


void ElementuaTxertatu(const char sFitxIzen[],
                       const char sFitxIzenLaburra[],
                       struct tstFitxa stElementuBerria,
                       long liNon,
                       long liZenbatElem)
{
    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
    }
    fwrite(&stElementuBerria, sizeof(struct tstFitxa), 1, fLAG);  // berria laguntzailean idatzi
    for (liKont = liNon; 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: ");
    gets(stElementua->sIzenDeiturak);

    printf("Ikaslearen deialdia eman: ");
    scanf("%d", &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;
}






  • Ariketa-89_Fitxategien_14a_algoritmoa.cbp | main.c  
  • Ariketa-89_Fitxategien_14b_algoritmoa.cbp | main.c  


 

Ariketa 88 | Fitxategia moztu: 13. algoritmoa

ZER DAKIDAN:
Fitxategiak zer diren badakit, eta fitxategi batek egitura lineala duela badakit.



ZER IKASIKO DUDAN:
Posizio jakin batetik aurrera, fitxategi bat mozten duen programa idatziko dut (fitxategiko informazio zati bat galduko da, noski).

Datuak gordetzen dituen fitxategi bat daukagu. Esate baterako, zenbaki osoak gordetzen duen  fitxategi bat daukagu eta bere edukiaren zati batekin geratzea nahi dugu, gainerako zatia galduz. Jarraian erakusten diren bi programetan fitxategia moztuko da puntu jakin batetik eta, ondorioz, fitxategiaren aurreneko elementuak mantenduko dira bere eduki bezala (gainerako elementuak, noski, galduko dira).

Datuen fitxategia moztu ahal izateko egitura laguntzaileren baten beharra daukagu, array bat edo bigarren fitxategi bat:

  • Ariketa-88_Fitxategien_13a_algoritmoa adibidean array laguntzaile bat erabiliko da
  • Ariketa-88_Fitxategien_13b_algoritmoa adibidean beste fitxategi laguntzaile bat erabiliko da

Erakusten den programa honetan C:\Tokia\Zenbakiak.dat izeneko fitxategiarekin lan egingo da eta moztu ondoren hasierako elementuak mantenduko ditu.

//* Ariketa-88_Fitxategien_13a_algoritmoa: posizio batetik moztu */

// 0 eta 99 arteko kopuru osoak gordetzen dituen C:\Tokia\Zenbakiak.dat
// fitxategiarekin lan egingo da, helburua fitxategi moztea da.
// Laneko C:\Tokia\Zenbakiak.dat izeneko fitxategirik ez badago sortu
// egingo da; erabiltzaileak zenbat elementu izango diren erabakiko du
// baina elementuen balioak auzaz aukeratuko ditu programak.
// Laneko C:\Tokia\Zenbakiak.dat izeneko fitxategia existitzen bada,
// erabiltzaileak erabakiko du zein posiziotik moztuko den.

// Fitxategia mozteko array laguntzaile bat erabiliko da.

#include <stdio.h>
#include <stdlib.h>  // system(), srand() eta rand() funtzioetarako
#include <time.h>    // time() funtzioarako
#include <conio.h>   // getch() funtziorako

#define FITX_IZEN_MAX 120  // fitxategiaren izenerako 119 karaktere gehi null mugatzailea
#define KOPURU_MAX 50      // gehienez 50 zenbaki fitxategi barruan

int iFitxategiaExistitzenDa(const char sFitxIzen[]);
void FitxategiZatiBatArrayra(const char sFitxIzen[], int aiLaguntzailea[], int *iLuzera);
void FitxategiaEzabatu(const char sFitxIzen[]);
void ArraytikFitxategira(const int aiLaguntzailea[], int iLuzera, const char sFitxIzen[]);
void FitxategiarenEdukiaIkusi(const char sFitxIzen[]);
void FitxategiaSortuEtaBete(const char sFitxIzen[]);


int main()
{
    char sFitxIzen[FITX_IZEN_MAX] = "C:\\Tokia\\Zenbakiak.dat";
    int aiLaguntzailea[KOPURU_MAX];
    int iLuzera;

    system("cls");
    printf("'%s' fitxategiarekin lan egingo dugu.\n", sFitxIzen);
    printf("'%s' fitxategia existitzen da? ERANTZUNA ---> %s\n", sFitxIzen, iFitxategiaExistitzenDa(sFitxIzen) ? "BAI" : "EZ");
    printf("\n");

    if (iFitxategiaExistitzenDa(sFitxIzen) == 1)
    {
        printf("Fitxategiaren elementu guztiak pantailaratuko ditugu. Hona hemen...\n");
        FitxategiarenEdukiaIkusi(sFitxIzen);

        printf("Fitxategiaren posizio batetik aurrera ebaki...\n");
        FitxategiZatiBatArrayra(sFitxIzen, aiLaguntzailea, &iLuzera);
        FitxategiaEzabatu(sFitxIzen);
        ArraytikFitxategira(aiLaguntzailea, iLuzera, sFitxIzen);

        printf("\nFitxategiaren elementu guztiak berriro pantailaratu...\n");
        FitxategiarenEdukiaIkusi(sFitxIzen);
    }
    else
    {
        printf("'%s' fitxategia ez da existitzen, orain sortuko da\n\n", sFitxIzen);
        FitxategiaSortuEtaBete(sFitxIzen);
        printf("Fitxategiaren elementu guztiak pantailaratuko ditugu. Hona hemen...\n");
        FitxategiarenEdukiaIkusi(sFitxIzen);
    }

    printf("\nEdozein tekla sakatu programa bukatzeko\n");
    getch();
    return 0;
}


void FitxategiarenEdukiaIkusi(const char sFitxIzen[])
{
    FILE *fErak = fopen(sFitxIzen, "rb");
    if (fErak == NULL)
    {
        printf("Errorea '%s' fitxategia irekitzerakoan FitxategiarenEdukiaIkusi() funtzioan\n", sFitxIzen);
        return;
    }

    int iElem, pos = 0;
    printf("Fitxategiaren edukia:\n");
    while (fread(&iElem, sizeof(int), 1, fErak) == 1)
    {
        printf("%8d. elementua = %d\n", pos, iElem);
        pos++;
    }

    printf("\n");
    fclose(fErak);
}


void FitxategiZatiBatArrayra(const char sFitxIzen[], int aiLaguntzailea[], int *iLuzera)
{
    FILE *fErak;
    int iZenbatElementu;
    int iPosizioa;
    int iElem;

    fErak = fopen(sFitxIzen, "r+b");
    if (fErak == NULL)
    {
        printf("Errorea '%s 'fitxategia irekitzerakoan FitxategiZatiBatArrayra() funtzioan:\n", sFitxIzen);
        return;
    }

    fseek(fErak, 0L, SEEK_END);
    iZenbatElementu = ftell(fErak) / sizeof(int);

    if (iZenbatElementu == 0 || iZenbatElementu == 1)
    {
         if (iZenbatElementu == 0)
            printf("Fitxategia existitzen da baina hutsik dago, ezin da moztu!\n");
         if (iZenbatElementu == 1)
            printf("Fitxategiak elementu bakar bat dauka eta ez da onartzen moztea!\n");
    }
    else
    {
        do
        {
            printf("%s fitxategiaren datuen esparrua: 0..%d\n", sFitxIzen, iZenbatElementu - 1);
            printf("Zein elementutik moztu nahi duzu? ");
            scanf("%d", &iPosizioa);
            if (iPosizioa == 0)
                printf("Ez da onartzen, gutxienez elementu bat nahi delako fitxategian\n");
            if  (iPosizioa < 0 || iPosizioa >= iZenbatElementu)
                printf("Ez da onartzen, fitxategiko esparruaren barruko datua behar delako\n");
        } while (iPosizioa < 1 || iPosizioa >= iZenbatElementu);


        fseek(fErak, 0L, SEEK_SET);   // fitxategiaren hasieran kokatu
        *iLuzera = 0;
        for (int iKont = 0; iKont < iPosizioa; iKont++)
        {
            fread(&iElem, sizeof(int), 1, fErak);
            (*iLuzera)++;
            aiLaguntzailea[iKont] = iElem;
        }
    }

    fclose(fErak);
}


void FitxategiaEzabatu(const char sFitxIzen[])
{
    if (remove(sFitxIzen) == 0)
        printf("\n'%s' fitxategia  ezabatu da.\n", sFitxIzen);
    else
        printf("\nErrorea '%s' ezabatzerakoan.\n", sFitxIzen);
}


// arrayaren edukia fitxategi batean gordetzeko funtzioa
void ArraytikFitxategira(const int aiLaguntzailea[], int iLuzera, const char sFitxIzen[])
{
    FILE *f;

    f = fopen(sFitxIzen, "wb");
    if (f == NULL)
    {
        printf("Errorea '%s' fitxategia irekitzean 'ArrayFitxategi()' funtzioan \a\n", sFitxIzen);
        return;
    }

    for (int i = 0; i < iLuzera; i++)
    {
        fwrite(&aiLaguntzailea[i], sizeof(int), 1, f);
    }
    fclose(f);
}


int iFitxategiaExistitzenDa(const char sFitxIzen[])
{
    FILE *f;

    f = fopen(sFitxIzen, "rb");
    if (f != NULL)
    {
        fclose(f);
        return 1;
    }
    return 0;
}


void FitxategiaSortuEtaBete(const char sFitxIzen[])
{
    FILE *f;
    int iElem;
    int iZenbatElementu;

    f = fopen(sFitxIzen, "wb");
    if (f == NULL)
    {
        printf("Errorea '%s 'fitxategia irekitzerakoan FitxategiaSortuEtaBete() funtzioan:\n", sFitxIzen);
        return;
    }
    do
    {
        printf("Zenbat elementu nahi dituzu %s fitxategian? ", sFitxIzen);
        scanf("%d", &iZenbatElementu);
        getchar(); // bufferra garbitu
        if (iZenbatElementu <= 1)
            printf("Gutxienez 2 elementu behar dira\n");
        if (iZenbatElementu > KOPURU_MAX)
            printf("Gehienez %d elementu izango dira\n", KOPURU_MAX);
    } while (iZenbatElementu <= 1 || iZenbatElementu > KOPURU_MAX);

    srand(time(NULL));
    for (int iKont = 0; iKont < iZenbatElementu; iKont++)
    {
        iElem = rand()%100;
        fwrite(&iElem, sizeof(int), 1, f);
    }
    fclose(f);
}


Erakusten den programa honetan C:\Tokia\Zenbakiak.dat izeneko fitxategiarekin lan egingo da eta moztu ondoren hasierako elementuak mantenduko ditu.

/* Ariketa-88_Fitxategien_13b_algoritmoa: posizio batetik moztu */

// 0 eta 99 arteko kopuru osoak gordetzen dituen C:\Tokia\Zenbakiak.dat
// fitxategiarekin lan egingo da, helburua fitxategi moztea da.
// Laneko C:\Tokia\Zenbakiak.dat izeneko fitxategirik ez badago sortu
// egingo da; erabiltzaileak zenbat elementu izango diren erabakiko du
// baina elementuen balioak auzaz aukeratuko ditu programak.
// Laneko C:\Tokia\Zenbakiak.dat izeneko fitxategia existitzen bada,
// erabiltzaileak erabakiko du zein posiziotik moztuko den.

// Fitxategia mozteko fitxategi laguntzaile bat erabiliko da.

#include <stdio.h>
#include <stdlib.h>  // system(), srand() eta rand() funtzioetarako
#include <time.h>    // time() funtzioarako
#include <conio.h>   // getch() funtziorako

#define FITX_IZEN_MAX 120  // fitxategiaren izenerako 119 karaktere gehi null mugatzailea

int iFitxategiaExistitzenDa(const char sFitxIzen[]);
void FitxategiZatiBatLaguntzailera(const char sFitxIzen[], const char sFitx_Lag[]);
void FitxategiaEzabatu(const char sFitxIzen[]);
void FitxategiaBerrizendatu(const char sFitxIzenZaharra[], const char sFitxIzenBerria[]);
void FitxategiarenEdukiaIkusi(const char sFitxIzen[]);
void FitxategiaSortuEtaBete(const char sFitxIzen[]);


int main()
{
    char sFitxIzen[FITX_IZEN_MAX] = "C:\\Tokia\\Zenbakiak.dat";
    char sFitx_Lag[FITX_IZEN_MAX] = "C:\\Tokia\\Laguntzailea.dat";

    system("cls");
    printf("'%s' fitxategiarekin lan egingo dugu.\n", sFitxIzen);
    printf("'%s' fitxategia existitzen da? ERANTZUNA ---> %s\n", sFitxIzen, iFitxategiaExistitzenDa(sFitxIzen) ? "BAI" : "EZ");
    printf("\n");

    if (iFitxategiaExistitzenDa(sFitxIzen) == 1)
    {
        printf("Fitxategiaren elementu guztiak pantailaratuko ditugu. Hona hemen...\n");
        FitxategiarenEdukiaIkusi(sFitxIzen);

        printf("Fitxategiaren posizio batetik aurrera ebaki...\n");
        FitxategiZatiBatLaguntzailera(sFitxIzen, sFitx_Lag);
        FitxategiaEzabatu(sFitxIzen);
        FitxategiaBerrizendatu(sFitx_Lag, sFitxIzen);

        printf("\nFitxategiaren elementu guztiak berriro pantailaratu...\n");
        FitxategiarenEdukiaIkusi(sFitxIzen);
    }
    else
    {
        printf("'%s' fitxategia ez da existitzen, orain sortuko da\n\n", sFitxIzen);
        FitxategiaSortuEtaBete(sFitxIzen);
        printf("Fitxategiaren elementu guztiak pantailaratuko ditugu. Hona hemen...\n");
        FitxategiarenEdukiaIkusi(sFitxIzen);
    }

    printf("\nEdozein tekla sakatu programa bukatzeko\n");
    getch();
    return 0;
}


void FitxategiarenEdukiaIkusi(const char sFitxIzen[])
{
    FILE *fErak = fopen(sFitxIzen, "rb");
    if (fErak == NULL)
    {
        printf("Errorea '%s' fitxategia irekitzerakoan FitxategiarenEdukiaIkusi() funtzioan\n", sFitxIzen);
        return;
    }

    int iElem, pos = 0;
    printf("Fitxategiaren edukia:\n");
    while (fread(&iElem, sizeof(int), 1, fErak) == 1)
    {
        printf("%8d. elementua = %d\n", pos, iElem);
        pos++;
    }

    printf("\n");
    fclose(fErak);
}


void FitxategiZatiBatLaguntzailera(const char sFitxIzen[], const char sFitx_Lag[])
{
    FILE *fErak;
    FILE *f_Lag;
    int iZenbatElementu;
    int iPosizioa;
    int iElem;

    fErak = fopen(sFitxIzen, "r+b");
    if (fErak == NULL)
    {
        printf("Errorea '%s 'fitxategia irekitzerakoan FitxategiZatiBatLaguntzailera() funtzioan:\n", sFitxIzen);
        return;
    }
    f_Lag = fopen(sFitx_Lag, "wb");   // berria sortuko duenez ez da erroreik gertatuko

    fseek(fErak, 0L, SEEK_END);
    iZenbatElementu = ftell(fErak) / sizeof(int);

    if (iZenbatElementu == 0 || iZenbatElementu == 1)
    {
         if (iZenbatElementu == 0)
            printf("Fitxategia existitzen da baina hutsik dago, ezin da moztu!\n");
         if (iZenbatElementu == 1)
            printf("Fitxategiak elementu bakar bat dauka eta ez da onartzen moztea!\n");
    }
    else
    {
        do
        {
            printf("%s fitxategiaren datuen esparrua: 0..%d\n", sFitxIzen, iZenbatElementu - 1);
            printf("Zein elementutik moztu nahi duzu? ");
            scanf("%d", &iPosizioa);
            if (iPosizioa == 0)
                printf("Ez da onartzen, gutxienez elementu bat nahi delako fitxategian\n");
            if  (iPosizioa < 0 || iPosizioa >= iZenbatElementu)
                printf("Ez da onartzen, fitxategiko esparruaren barruko datua behar delako\n");
        } while (iPosizioa < 1 || iPosizioa >= iZenbatElementu);


        fseek(fErak, 0L, SEEK_SET);   // fitxategiaren hasieran kokatu
        for (int iKont = 0; iKont < iPosizioa; iKont++)
        {
            fread(&iElem, sizeof(int), 1, fErak);
            fwrite(&iElem, sizeof(int), 1, f_Lag);
        }
    }

    fclose(fErak);
    fclose(f_Lag);
}


void FitxategiaEzabatu(const char sFitxIzen[])
{
    if (remove(sFitxIzen) == 0)
        printf("\n'%s' fitxategia  ezabatu da.\n", sFitxIzen);
    else
        printf("\nErrorea '%s' ezabatzerakoan.\n", sFitxIzen);
}


void FitxategiaBerrizendatu(const char sFitxIzenZaharra[], const char sFitxIzenBerria[])
{
    if (rename(sFitxIzenZaharra, sFitxIzenBerria) == 0)
        printf("\n'%s' fitxategiaren izen zaharra\n'%s' izen berrira aldatu da.\n", sFitxIzenZaharra, sFitxIzenBerria);
    else
        printf("Errorea izena aldatzean.\n");
}


int iFitxategiaExistitzenDa(const char sFitxIzen[])
{
    FILE *f;

    f = fopen(sFitxIzen, "rb");
    if (f != NULL)
    {
        fclose(f);
        return 1;
    }
    return 0;
}


void FitxategiaSortuEtaBete(const char sFitxIzen[])
{
    FILE *f;
    int iElem;
    int iZenbatElementu;

    f = fopen(sFitxIzen, "wb");
    if (f == NULL)
    {
        printf("Errorea '%s 'fitxategia irekitzerakoan FitxategiaSortuEtaBete() funtzioan:\n", sFitxIzen);
        return;
    }
    do
    {
        printf("Zenbat elementu nahi dituzu %s fitxategian? ", sFitxIzen);
        scanf("%d", &iZenbatElementu);
        getchar(); // bufferra garbitu
        if (iZenbatElementu <= 1)
            printf("Gutxienez 2 elementu behar dira\n");
    } while (iZenbatElementu <= 1);

    srand(time(NULL));
    for (int iKont = 0; iKont < iZenbatElementu; iKont++)
    {
        iElem = rand()%100;
        fwrite(&iElem, sizeof(int), 1, f);
    }
    fclose(f);
}






  • Ariketa-88_Fitxategien_13a_algoritmoa.cbp | main.c  
  • Ariketa-88_Fitxategien_13b_algoritmoa.cbp | main.c