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

Ariketa 82 | Elementu berri bat gehitu: 7. algoritmoa

ZER DAKIDAN:
Fitxategiak zer diren badakit, eta fitxategiak irekitzeko w, r eta a markak erabili behar ditudala badakit.



ZER IKASIKO DUDAN:
Elementu berri bat fitxategiaren bukaeran idazteko, fitxategia irekitzerakoan a+ marka erabiliko dut.

Datuak gordetzen dituen fitxategi bat daukagu. Esate baterako, estrukturen fitxategi bat daukagu eta elementu berri bat gehitu nahi da fitxategiaren bukaeran. Algoritmoa asko errazten da fitxategia a+ markarekin (open for reading and appending) irekitzen bada.

   ...
   f = fopen(sFitxIzen, "a+b");                    // fitxategia irakurtzeko eta bukaeran idazteko moduan ireki
   DatuakEskuratu(&stElem);                        // elementu berriaren eremuak teklatuz irakurri
   fwrite(&stElem, sizeof(struct tstFitxa), 1, f); // fitxategiaren bukaeran idatzi
   ...

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

  • Baldin eta fitxategia bada, ondoko bi lanak burutuko dira:
    1. Zehaztutako fitxategiaren edukia pantailaratu
    2. Datuak teklatuz irakurri: izen bat, deialdi bat eta nota bat
    3. a+ markarekin ireki fitxategia eta elementu berria idatzi
  • Baldin eta fitxategirik ez bada, programa amaitu aurretik mezu batez adierazten da
/* Ariketa-79_Fitxategien_7_algoritmoa: elementu berri bat gehitu */

// Fitxategiaren izena eman ondoren elementu berri baten gehiketa
// egingo da, horretarako fitxategia irekitzean "a" marka jarriko
// zaio, honela:    f = fopen(sFitxIzen, "a+b");
// Hori dela eta, idazketak fitxategiaren bukaeran gauzatuko dira.

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

#define sBIDEA "C:\\Tokia\\"
#define FITX_IZEN_MAX 120  // fitxategiaren izenerako 119 karaktere gehi null mugatzailea
#define DATU_IZEN_MAX  72  // ikaslearen izena gordetzeko 71 karaktere gehi null mugatzailea

struct tstFitxa
{
    char sIzenDeiturak[DATU_IZEN_MAX];
    int iDeialdia;
    float fNota;
};

int iFitxategirikBada(const char sFitxIzen[]);
void DatuGuztiakErakutsi(const char sFitxIzen[]);
void DatuakEskuratu(struct tstFitxa *stElementua);
void Gehiketa(const char sFitxIzen[]);


int main()
{
    char sFitxIzenLaburra[FITX_IZEN_MAX];
    char sFitxIzen[FITX_IZEN_MAX];

    printf("Fitxategiaren izen laburra eman (adibidez 'Ikasleak'): ");
    gets(sFitxIzenLaburra);

    strcpy(sFitxIzen, "C:\\Tokia\\");
    strcat(sFitxIzen, sFitxIzenLaburra);
    strcat(sFitxIzen, ".dat");

    if (iFitxategirikBada(sFitxIzen) == 1)
    {
        printf("====================================================================\n");
        DatuGuztiakErakutsi(sFitxIzen);
        printf("====================================================================\n");

        Gehiketa(sFitxIzen);

        printf("#####################################################################\n");
        DatuGuztiakErakutsi(sFitxIzen);
        printf("#####################################################################\n");
    }
    else
    {
        printf("'%s' fitxategia ez da existitzen, agur...", sFitxIzen);
    }

    printf("\n\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
}


// datuak erabiltzailearengandik biltzeko funtzioa
void DatuakEskuratu(struct tstFitxa *stElementua)
{
    printf("Ikasle berriaren izen deiturak eman: ");
    gets(stElementua->sIzenDeiturak);

    printf("Deialdia eman: ");
    scanf("%d", &stElementua->iDeialdia);

    printf("Nota eman: ");
    scanf("%f", &stElementua->fNota);
    getchar(); // Enter karakterea kentzeko
}


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

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

    fgetpos(f, &Posizioa);
    printf("-----fopen(sFitxIzen,\"a+b\") egin ondoren, posizioa=%d\n", (int)Posizioa);

    DatuakEskuratu(&stElem);

    fwrite(&stElem, sizeof(struct tstFitxa), 1, f); // fitxategian idatzi
    fgetpos(f, &Posizioa);
    printf("-----fwrite() eta gero, posizioa=%d\n", (int)Posizioa);
    printf("-----Elementu bakoitzak %ld byte ditu\n", (long)sizeof(stElem));

    fclose(f); // fitxategia itxi
}


// fitxategiaren prozesaketa osoa
void DatuGuztiakErakutsi(const char sFitxIzen[])
{
    FILE *f;
    struct tstFitxa stElem;
    int iPosizioa;

    // fitxategi bitarra irakurketa moduan ireki
    f = fopen(sFitxIzen, "rb");

    // fitxategiko datuak banan-banan irakurri eta pantailan erakutsi
    iPosizioa = 0;
    while (fread(&stElem, sizeof(struct tstFitxa), 1, f) == 1)   // irakurtzerik dagoen bitartean...
    {
        printf("%d. ikaslearen datuak: | %-20s  |  %d  |  %.2f |\n",
                iPosizioa, stElem.sIzenDeiturak, stElem.iDeialdia, stElem.fNota);
        iPosizioa++;
    }
    fclose(f);
}






  • Ariketa-82_Fitxategien_7_algoritmoa.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina