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

Ariketa 84 | Arraytik fitxategira: 9. algoritmoa

ZER DAKIDAN:
Fitxategiak eta arrayak antzekoak dira datu-mota bereko hainbat elementu gordetzen dituztelako. Informazioa modu iraunkorrean mantentzen da fitxategietan; horregatik, nere informazioa array batean badago ikasi beharko dut arrayko informazioa fitxategi batera igarotzen (kontrakoa, fitxategitik arrayra ezagutzen dut).



ZER IKASIKO DUDAN:
Array bateko elementu guztiak fitxategi batera eramaten ikasiko dut. Funtsean dakidan zerbait da, izan ere arrayaren prozesaketa mota bat da (Ariketa 45 | Algoritmoak arrayetan (1) adibidean ikusitako bezalakoa).

Datuak gordetzen dituen array bat daukagu. Esate baterako, estrukturen array bat eta bere informazioa estrukturen fitxategi batera igarotzea nahi da. Nolabait esateko, Ariketa 83 | Arraytik fitxategira: 8. algoritmoa ariketaren kontrakoa da.


Arraytik abiatuta fitxategi berri bat sortuko da arrayaren informazioarekin. Jarraian erakusten den programan, fitxategi batetik hasiko gara array bat elikatzeko, eta ondoren arraytik beste fitxategi berri bat lortuko dugu. Eskematikoki:
fitxategi_1 >>> array >>> fitxategi_2

Erakusten den programa honetan fitxategiaren existentzia frogatzen da programa nagusian, horren arabera:

  • Baldin eta fitxategia bada, liFitxategiElemKop() funtzioarei esker fitxategiak barneratzen dituen elementuen kopurua kalkulatzen da eta arrayaren GOIMUGA balioarekin alderatuko da. Konparaketaren arabera bi egoera hauek eman daitezke:
    1. Fitxategiko elementuen kopurua handiegia da eta arrayaren neurria gainditzen du, ondorioz ez da informazioaren bihurketa egingo azalpen-mezu bat pantailaratuz
    2. Fitxategiko elementuen kopurua arrayaren neurria baino txikiago da, ondoko urratsak beteko dira:
      1. FitxategiArray() funtzioaren bitartez arraya elikatuko da fitxategi osoa prozesatuz
      2. ArrayBatIkusi() ikusi funtzioari esker arrayaren informazioa pantailaratuko da
      3. ArrayFitxategi() funtzioaren bitartez fitxategi berri bat sortuko da arrayaren informazioarekin
      4. FitxategiaIkusi() ikusi funtzioari esker fitxategi berriaren informazioa pantailaratuko da
  • Baldin eta fitxategirik ez bada, mezu batez adierazten da
/* Ariketa-84_Fitxategien_8_algoritmoa: fitxategi >>> array >>> fitxategi */

// Fitxategia existitzen dela frogatu ondoren bere edukia erakusten da.
// Fitxategiaren elementuen kopurua kalkulatzen da eta alderatu egiten
// da arrayaren tamainarekin ziurtatzeko fitxategiko eduki osoa sartzen
// dela arrayan. Programaren funtzio esanguratsuenak bi hauek dira:
//          - FitxategiArray()
//          - ArrayFitxategi()

#include <stdio.h>
#include <string.h>   // strcpy() eta strcat() funtzioetarako
#include <conio.h>    // getch() funtziorako

#define sBIDEA "C:\\Tokia\\"
#define FITX_IZEN_MAX 120  // fitxategiaren izenerako 119 karaktere gehi null mugatzailea
#define DATU_IZEN_MAX  72  // ikaslearen izena gordetzeko 71 karaktere gehi null mugatzailea
#define BEHEMUGA 0
#define GOIMUGA 11         // 12 elementuentzat tokia

struct tstFitxa  // struct definitzen ikasleen datuak gordetzeko
{
    char sIzenDeiturak[DATU_IZEN_MAX];
    int iDeialdia;
    float fNota;
};


int iFitxategirikBada(const char *sFitxIzen);
long liFitxategiElemKop(const char *sFitxIzen);
void ElementuaErakutsi(const struct tstFitxa *stElem);
void ArrayBatIkusi(const struct tstFitxa astGela[], int iLuzera);
void FitxategiaIkusi(const char *sFitxIzen);
void FitxategiArray(struct tstFitxa astGela[],
                    int *iLuzera,
                    const char *sFitxIzen);
void ArrayFitxategi(const struct tstFitxa astGela[],
                    int iLuzera,
                    const char *sFitxIzen);

int main()
{
    struct tstFitxa astGelaArray[GOIMUGA];
    int iLuzeraLogiko;
    long liElemKop;
    char sFitxIzen[FITX_IZEN_MAX];
    char sFitxIzenLaburra[FITX_IZEN_MAX];
    char sFitxIzenBerri[FITX_IZEN_MAX];

    printf("''C:\\Tokia\\'' karpetako fitxategiaren izen laburra eman ezazu.\n");
    printf("Adibidez, 'Datuak' izena edo 'Ikasleak' izena: ");
    gets(sFitxIzenLaburra);
    strcpy(sFitxIzen, sBIDEA);
    strcat(sFitxIzen, sFitxIzenLaburra);
    strcat(sFitxIzen, ".dat");
    printf("\n");

    if (iFitxategirikBada(sFitxIzen) == 1)
    {
        printf("'%s' fitxategiaren informazioa arrayera igaroko da...\n", sFitxIzen);
        FitxategiaIkusi(sFitxIzen);
        printf("\n");

        liElemKop = liFitxategiElemKop(sFitxIzen);
        if (liElemKop > GOIMUGA+1)
        {
            printf("Fitxategiak %ld elementu ditu eta arrayaren posizioak %d dira\n", liElemKop, GOIMUGA+1);
            printf("Fitxategiaren informazio guztia ezin da arrayan gorde\n");
        }
        else
        {
            FitxategiArray(astGelaArray, &iLuzeraLogiko, sFitxIzen);
            printf("Bektorearen edukia:\n");
            ArrayBatIkusi(astGelaArray, iLuzeraLogiko);

            strcpy(sFitxIzenBerri, sBIDEA);
            strcat(sFitxIzenBerri, "BERRIA---");
            strcat(sFitxIzenBerri, sFitxIzenLaburra);
            strcat(sFitxIzenBerri, ".dat");

            printf("\n---\\%s\\---\n", sFitxIzenBerri);
            printf("\n");
            printf("Arrayaren informazioa '%s' fitxategian gordetzen...\n", sFitxIzenBerri);

            ArrayFitxategi(astGelaArray, iLuzeraLogiko, sFitxIzenBerri);
            FitxategiaIkusi(sFitxIzenBerri);
        }
    }
    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
}


// fitxategitik array batera datuak igarotzeko funtzioa
long liFitxategiElemKop(const char *sFitxIzen)
{
    FILE *f;
    long liZenbatElementu;

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

    fclose(f);
    return liZenbatElementu;
}


// fitxategiko edukia array batera kargatzeko funtzioa
void FitxategiArray(struct tstFitxa astGela[], int *iLuzera, const char *sFitxIzen)
{
    FILE *f;
    int iIndize;

    f = fopen(sFitxIzen, "rb");
    if (f == NULL) {
        printf("Errorea '%s' fitxategia irekitzean 'FitxategiArray()' funtzioan \a\n", sFitxIzen);
        *iLuzera = 0;
        return;
    }

    iIndize = BEHEMUGA;
    while (fread(&astGela[iIndize], sizeof(struct tstFitxa), 1, f) && iIndize <= GOIMUGA)
    {
        // printf("Arrayaren %d posizioan gorde da '%s'\n", iIndize, ardGela[iIndize].sIzenDeiturak);
        iIndize++;
    }

    *iLuzera = iIndize;
    fclose(f);
}


// arrayaren edukia pantailaratzeko funtzioa
void ArrayBatIkusi(const struct tstFitxa astGela[], int iLuzera)
{
    for (int iKont = BEHEMUGA; iKont < iLuzera; iKont++)
    {
        printf("%d indizedun ikaslea >>> : %-20s : %d : %.2f :\n",
               iKont,
               astGela[iKont].sIzenDeiturak,
               astGela[iKont].iDeialdia,
               astGela[iKont].fNota);
    }
}


// elementu baten datuak pantailaratzen dituen funtzioa
void ElementuaErakutsi(const struct tstFitxa *stElem)
{
    printf("Ikaslea >>> | Nor: %-20s | Deialdia: %d | Nota: %.2f |\n",
           stElem->sIzenDeiturak,
           stElem->iDeialdia,
           stElem->fNota);
}


// fitxategi bat pantailaratzeko funtzioa
void FitxategiaIkusi(const char *sFitxIzen)
{
    FILE *f;
    struct tstFitxa stElem;

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

    printf("'%s' fitxategiak duen edukia:\n", sFitxIzen);
    while (fread(&stElem, sizeof(struct tstFitxa), 1, f) == 1)
    {
        ElementuaErakutsi(&stElem);
    }
    fclose(f);
}


// arrayaren edukia fitxategi batean gordetzeko funtzioa
void ArrayFitxategi(const struct tstFitxa astGela[], 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 = BEHEMUGA; i < iLuzera; i++)
    {
        fwrite(&astGela[i], sizeof(struct tstFitxa), 1, f);
    }
    fclose(f);
}






  • Ariketa-84_Fitxategien_9_algoritmoa.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina