| 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:
- Zehaztutako fitxategiaren edukia pantailaratu
- Datuak teklatuz irakurri: izen bat, deialdi bat eta nota bat
- 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);
}

iruzkinik ez:
Argitaratu iruzkina