ZER DAKIDAN: Fitxategiak eta arrayak antzekoak dira datu-mota bereko hainbat elementu gordetzen dituztelako. Algoritmo batzuk errazagoak dira arrayetan fitxategietan baino; horregatik, nere informazioa fitxategi batean badago ikasi beharko dut fitxategiko informazioa array batera igarotzen (kontrakoa, arraytik fitxategira ikasi beharko dut ere). ZER IKASIKO DUDAN: Fitxategi bateko elementu guztiak array batera eramaten ikasiko dut. Funtsean dakidan zerbait da, izan ere fitxategiaren prozesaketa mota bat da (Ariketa 77 | Fitxategi osoa prozesatu: 2. algoritmoa adibidean ikusitako bezalakoa). |
Datuak gordetzen dituen fitxategi bat daukagu. Esate baterako, estrukturen fitxategi bat daukagu eta bere informazioa estrukturen array batera igarotzea nahi da.
Fitxategitik arrayra informazioa eraman aurretik, frogatu beharra dago fitxategiko elementuen kopurua ez dela handiagoa arrayaren neurria baino.
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:
- Fitxategiko elementuen kopurua handiegia da eta arrayaren neurria gainditzen du, ondorioz ez da informazioaren bihurketa egingo azalpen-mezu bat pantailaratuz
- Fitxategiko elementuen kopurua arrayaren neurria baino txikiago da, ondoko urratsak beteko dira:
- FitxategiArray() funtzioaren bitartez arraya elikatuko da fitxategi osoa prozesatuz
- ArrayBatIkusi() ikusi funtzioari esker arrayaren informazioa pantailaratuko da
- Baldin eta fitxategirik ez bada, mezu batez adierazten da
/* Ariketa-83_Fitxategien_8_algoritmoa: fitxategi >>> array */ // 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 esanguratsuena: FitxategiArray(). #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 FitxategiArray(struct tstFitxa astGela[], int *iLuzera, const char *sFitxIzen); void ArrayBatIkusi(const struct tstFitxa astGela[], int iLuzera); void FitxategiaIkusi(const char *sFitxIzen); int main() { struct tstFitxa astGela[GOIMUGA]; // array aldagaia int iLuzeraLogiko = 0; char sFitxIzen[FITX_IZEN_MAX]; char sFitxIzenLaburra[FITX_IZEN_MAX]; long liElemKop; printf("Fitxategia existitzen da eta datuak ditu\n(adibidez C:\\Tokia\\Ikasleak.dat)\n\n"); printf("Fitxategiaren izen laburra eman (adibidez 'Ikasleak'): "); gets(sFitxIzenLaburra); strcpy(sFitxIzen, sBIDEA); strcat(sFitxIzen, sFitxIzenLaburra); strcat(sFitxIzen, ".dat"); 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(astGela, &iLuzeraLogiko, sFitxIzen); printf("\nBektorearen edukia (datuetan ez da aldaketarik egin):\n"); ArrayBatIkusi(astGela, iLuzeraLogiko); } } 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 } // fitxategi bateko elementuen kopurua itzultzen duen funtzioa long liFitxategiElemKop(const char *sFitxIzen) { FILE *f; long liZenbatElementu; f = fopen(sFitxIzen, "rb"); fseek(f, 0, SEEK_END); liZenbatElementu = ftell(f) / sizeof(struct tstFitxa); fclose(f); return liZenbatElementu; } // fitxategitik array batera datuak igarotzeko funtzioa void FitxategiArray(struct tstFitxa astGela[], int *iLuzera, const char *sFitxIzen) { FILE *f; f = fopen(sFitxIzen, "rb"); *iLuzera = BEHEMUGA; // elementu guztientzat arrayan tokia dagoela ez bada konprobatu GOIMUGA aldagaia beharko da // while (fread(&astGela[*iLuzera], sizeof(struct tstFitxa), 1, f) && *iLuzera <= GOIMUGA) while (fread(&astGela[*iLuzera], sizeof(struct tstFitxa), 1, f)) // badakigulako elementu guztientzat { // tokia dagoela arrayan printf("'%s' gordeta arrayaren %d posizioan\n", astGela[*iLuzera].sIzenDeiturak, *iLuzera); (*iLuzera)++; // edo *iLuzera=*iLuzera+1; } 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); } } // fitxategiaren prozesaketa osoa void FitxategiaIkusi(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)) // 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