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

Ariketa 86 | Fitxategia berrizendatu: 11. algoritmoa

ZER DAKIDAN:
Fitxategiak zer diren badakit, eta fitxategi batek bere izena duela badakit.



ZER IKASIKO DUDAN:
Fitxategi bati bere izena aldatzen dion programa idatziko dut.

Datuak gordetzen dituen fitxategi bat daukagu. Esate baterako, erregistroen fitxategi bat daukagu eta diskoan duen bere izena aldatu nahi zaio bere elementuak berdin-berdin mantenduz.


Izena aldatzeko funtzioa rename() da eta bere dei honetan ikus daitekeen bezala, behar dituen bi parametroak kateak dira:
rename(sFitxIzenZaharra, sFitxIzenBerria)

Horregatik, fitxategi bati izena aldatuko dion funtzio batek ez du FILE datu-motako aldagairik beharko.

Erakusten den programa honetan jatorrizko fitxategiaren existentzia frogatzen da programa nagusian fileexists() funtzioa erabiliz, ondoren fileexists() funtzioa berriro erabili izen berriko fitxategirik ez dagoela konprobatzen da.

Baldintza biak betetzen badira, hots, jatorrizko fitxategia existentzen dela eta izen berriko fitxategirik ez dagoela, rename() funtzioan oinarrituta izen berria ezartzen zaio jatorrizko fitxategiari.

/* Ariketa-86_Fitxategien_11_algoritmoa: berrizendatu */

// boFitxategiaExistitzenDa() funtzioa erabili da konprobazioak egiteko,
// baina funtsezko funtzioa rename(sFitxIzen,sFitxIzenBerria) da izena
// aldatzeko balio duelako, rename() funtzioak kateekin lan egiten duenez
// ez dago zertan fitxategirik ireki behar.

#include <stdio.h>
#include <stdbool.h>   // bool datu-motarako

typedef char tsKate99[100];  // fitxategiaren izenerako 99 karaktere gehi null mugatzailea
typedef char tsKate49[50];   // ikaslearen izena gordetzeko 49 karaktere gehi null mugatzailea
typedef struct
{
    tsKate49 sIzenDeiturak;
    unsigned int byDeialdia;
    float fNota;
} trdFitxa;

bool boFitxategiaExistitzenDa(const tsKate99 sFitxIzen);
void FitxategiaIkusi(const tsKate99 sFitxIzen);
void FitxategiaBerrizendatu(const tsKate99 sFitxIzen, const tsKate99 sFitxIzenBerria);


int main()
{
    tsKate99 sFitxIzenZaharra = "C:\\Tokia\\Datuak.dat";
    tsKate99 sFitxIzenBerria  = "C:\\Tokia\\Fitxak.dat";

    printf("'%s' fitxategiarekin lan egingo dugu.\n", sFitxIzenZaharra);
    printf("'%s' fitxategia existitzen da? ERANTZUNA ---> %s\n", sFitxIzenZaharra, boFitxategiaExistitzenDa(sFitxIzenZaharra) ? "BAI" : "EZ");
    printf("'%s' fitxategia existitzen da? ERANTZUNA ---> %s\n", sFitxIzenBerria, boFitxategiaExistitzenDa(sFitxIzenBerria) ? "BAI" : "EZ");
    printf("\n");

    if (boFitxategiaExistitzenDa(sFitxIzenZaharra))
    {
        printf("'%s' fitxategiaren edukia:\n", sFitxIzenZaharra);
        FitxategiaIkusi(sFitxIzenZaharra);
        printf("\n");

        if (!boFitxategiaExistitzenDa(sFitxIzenBerria))
        {
            FitxategiaBerrizendatu(sFitxIzenZaharra, sFitxIzenBerria);
            printf("'%s' fitxategiaren edukia:\n", sFitxIzenBerria);
            FitxategiaIkusi(sFitxIzenBerria);
        }
        else
        {
            printf("Ezin daiteke berrizendatu, '%s' izena hartuta dagoelako.\n", sFitxIzenBerria);
        }

        printf("\n");
        printf("'%s' fitxategia existitzen da? ERANTZUNA ---> %s\n", sFitxIzenZaharra, boFitxategiaExistitzenDa(sFitxIzenZaharra) ? "BAI" : "EZ");
        printf("'%s' fitxategia existitzen da? ERANTZUNA ---> %s\n", sFitxIzenBerria, boFitxategiaExistitzenDa(sFitxIzenBerria) ? "BAI" : "EZ");
    }
    else
    {
        printf("'%s' fitxategia ez da existitzen.\n", sFitxIzenZaharra);
    }

    printf("\nRETURN sakatu programa bukatzeko\n");
    getchar();

    return 0;
}


// fitxategiaren edukia bistaratzeko
void FitxategiaIkusi(const tsKate99 sFitxIzen)
{
    FILE *fFitxategia;
    trdFitxa rdElem;
    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(&rdElem, sizeof(trdFitxa), 1, fFitxategia) == 1)
    {
        printf("%2ld posizioan     %-15s %8d %10.2f\n", liPosizioa, rdElem.sIzenDeiturak, rdElem.byDeialdia, rdElem.fNota);
        liPosizioa++;
    }
    printf("\n");

    fclose(fFitxategia);
}


void FitxategiaBerrizendatu(const tsKate99 sFitxIzenZaharra, const tsKate99 sFitxIzenBerria)
{
    if (rename(sFitxIzenZaharra, sFitxIzenBerria) == 0)
        printf("Fitxategiaren izena '%s' izenera aldatu da.\n", sFitxIzenBerria);
    else
        printf("Errorea izena aldatzean.\n");
}


bool boFitxategiaExistitzenDa(const tsKate99 sFitxIzen)
{
    FILE *file;

    file = fopen(sFitxIzen, "rb");
    if (file)
    {
        fclose(file);
        return true;
    }
    return false;
}






  • Ariketa-86_Fitxategien_11_algoritmoa.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina