===== Fájlkezelés ===== A fájlkezelés célja, hogy a program adatokat tudjon elmenteni és újra beolvasni. C-ben a fájlműveletekhez a könyvtárat használjuk. Fájl megnyitása (fopen)** ** FILE *fp; fp = fopen("adat.txt", "r"); Módok: | Mód | Jelentés | | `"r"` | Olvasásra nyitás (a fájlnak léteznie kell) | | `"w"` | Írásra nyitás (ha létezik, törli a tartalmat) | | `"a"` | Hozzáfűzés (append) | | `"r+"` | Olvasás és írás, meglévő fájl | | `"w+"` | Új fájl olvasásra és írásra | | `"a+"` | Hozzáfűzés + olvasás | **Fájl lezárása (fclose)** fclose(fp); **Szöveges fájl olvasása/írása** | Művelet | Függvény | Példa | | Írás | `fprintf()` | `fprintf(fp, "%d %s", kor, nev);` | | Olvasás | `fscanf()` | `fscanf(fp, "%d %s", &kor, nev);` | | Karakter írás | `fputc()` | `fputc('A', fp);` | | Karakter olvasás | `fgetc()` | `ch = fgetc(fp);` | **Bináris fájlok** Bináris fájlok esetén: * fwrite() és fread() használatos, * az adat nem szövegként, hanem nyers bájtokként kerül mentésre. fwrite(&valtozo, sizeof(valtozo), 1, fp); fread(&valtozo, sizeof(valtozo), 1, fp); **Tipikus hibák** * Elfelejtett fclose(fp); * Rossz megnyitási mód (pl. "r" amikor a fájl nem létezik) * Rossz formátum a fscanf()-ben =====Gyakorlás===== 1. Írj programot, ami létrehoz egy fájlt, és beleír pár sort. #include int main() { FILE *fp = fopen("szoveg.txt", "w"); if (fp == NULL) { printf("Hiba: nem sikerult megnyitni a fajlt!\n"); return 1; } fprintf(fp, "Ez az elso sor.\n"); fprintf(fp, "Ez a masodik sor.\n"); fclose(fp); printf("Fajl sikeresen letrehozva.\n"); return 0; } 2.Fájl olvasása és képernyőre írása #include int main() { FILE *fp = fopen("szoveg.txt", "r"); char sor[100]; if (fp == NULL) { printf("Nem sikerult megnyitni a fajlt!\n"); return 1; } while (fgets(sor, 100, fp) != NULL) printf("%s", sor); fclose(fp); return 0; } 3. Karakterenkénti másolás #include int main() { FILE *in = fopen("bemenet.txt", "r"); FILE *out = fopen("kimenet.txt", "w"); char ch; if (in == NULL || out == NULL) { printf("Hiba fajl megnyitasakor!\n"); return 1; } while ((ch = fgetc(in)) != EOF) fputc(ch, out); fclose(in); fclose(out); printf("Masolas kesz.\n"); return 0; } 4. Számok beírása fájlba #include int main() { FILE *fp = fopen("szamok.txt", "w"); int i; for (i = 1; i <= 10; i++) fprintf(fp, "%d\n", i); fclose(fp); return 0; } 5. Számok beolvasása és összegzés #include int main() { FILE *fp = fopen("szamok.txt", "r"); int szam, osszeg = 0; while (fscanf(fp, "%d", &szam) == 1) osszeg += szam; fclose(fp); printf("Osszeg: %d\n", osszeg); return 0; } 6. Bináris írás és olvasás #include int main() { int tomb[5] = {10, 20, 30, 40, 50}; int beolvasott[5]; int i; FILE *fp = fopen("adat.bin", "wb"); fwrite(tomb, sizeof(int), 5, fp); fclose(fp); fp = fopen("adat.bin", "rb"); fread(beolvasott, sizeof(int), 5, fp); fclose(fp); for (i = 0; i < 5; i++) printf("%d ", beolvasott[i]); return 0; } 7. Struktúra fájlba mentése (szöveges) #include typedef struct { char nev[30]; int kor; } Szemely; int main() { Szemely ember = {"Kovacs Bela", 32}; FILE *fp = fopen("ember.txt", "w"); fprintf(fp, "%s %d\n", ember.nev, ember.kor); fclose(fp); printf("Ember adatai mentve.\n"); return 0; } 8. Struktúra olvasása fájlból #include typedef struct { char nev[30]; int kor; } Szemely; int main() { Szemely ember; FILE *fp = fopen("ember.txt", "r"); fscanf(fp, "%s %d", ember.nev, &ember.kor); fclose(fp); printf("%s (%d ev)\n", ember.nev, ember.kor); return 0; } 9. Struktúra és mátrix fájlban #include #define N 2 #define M 2 typedef struct { char nev[30]; int pontok[N][M]; } Jatekos; int main() { Jatekos j = {"Anna", {{1,2},{3,4}}}; FILE *fp = fopen("jatekos.txt", "w"); fprintf(fp, "%s\n", j.nev); for (int i = 0; i < N; i++) { for (int k = 0; k < M; k++) fprintf(fp, "%d ", j.pontok[i][k]); fprintf(fp, "\n"); } fclose(fp); printf("Jatekos adatai mentve.\n"); return 0; } 10. Egyszerű adatbázis fájlban (szöveges) #include #define N 3 typedef struct { char nev[30]; int kor; } Diak; int main() { Diak diakok[N] = { {"Anna", 18}, {"Bela", 19}, {"Csilla", 17} }; FILE *fp = fopen("adatbazis.txt", "w"); int i; for (i = 0; i < N; i++) fprintf(fp, "%s %d\n", diakok[i].nev, diakok[i].kor); fclose(fp); printf("Adatbazis mentve.\n"); // visszaolvasás fp = fopen("adatbazis.txt", "r"); printf("\n--- Beolvasott adatok ---\n"); for (i = 0; i < N; i++) { fscanf(fp, "%s %d", diakok[i].nev, &diakok[i].kor); printf("%s (%d ev)\n", diakok[i].nev, diakok[i].kor); } fclose(fp); return 0; } 11. 10 diák kap egy 0–100 közötti pontszámot. A pont alapján kategóriát kap: - A: 90–100 - B: 75–89 - C: 60–74 - D: 40–59 - F: 0–39 Ezeket az adatokat fájlba kell írni. #include #include #include #define N 10 typedef struct { char nev[30]; int pont; char kat; } Diak; int main() { Diak diakok[N] = { {"Anna"}, {"Bela"}, {"Csilla"}, {"David"}, {"Erika"}, {"Ferenc"}, {"Gabor"}, {"Hanna"}, {"Istvan"}, {"Judit"} }; srand(time(NULL)); FILE *fp = fopen("diakok.txt", "w"); int i; for (i = 0; i < N; i++) { diakok[i].pont = rand() % 101; if (diakok[i].pont >= 90) diakok[i].kat = 'A'; else if (diakok[i].pont >= 75) diakok[i].kat = 'B'; else if (diakok[i].pont >= 60) diakok[i].kat = 'C'; else if (diakok[i].pont >= 40) diakok[i].kat = 'D'; else diakok[i].kat = 'F'; fprintf(fp, "%s %d %c\n", diakok[i].nev, diakok[i].pont, diakok[i].kat); } fclose(fp); printf("Adatok kiirva a diakok.txt fajlba.\n"); return 0; } 12. Tárolj 7 napi hőmérsékletet egy struktúrában (napok neve + random -10 és 35 °C között). Írd fájlba a táblázatot. #include #include #include #define N 7 typedef struct { char nap[10]; int homerseklet; } HetNap; int main() { HetNap het[N] = { {"Hetfo"}, {"Kedd"}, {"Szerda"}, {"Csutortok"}, {"Pentek"}, {"Szombat"}, {"Vasarnap"} }; srand(time(NULL)); FILE *fp = fopen("homerseklet.txt", "w"); int i; for (i = 0; i < N; i++) { het[i].homerseklet = (rand() % 46) - 10; fprintf(fp, "%s %d\n", het[i].nap, het[i].homerseklet); } fclose(fp); printf("Homersekletek kiirva fajlba.\n"); return 0; } 13. Tárolj 3 hallgatót, mindegyik 3 vizsgát írt. Generálj véletlen pontokat (0–100) egy 3×3 mátrixba, számítsd ki az átlagukat, és írd fájlba. #include #include #include #define N 3 #define M 3 typedef struct { char nev[30]; int pont[M]; float atlag; } Hallgato; int main() { Hallgato hallgatok[N] = { {"Anna"}, {"Bela"}, {"Csilla"} }; srand(time(NULL)); FILE *fp = fopen("vizsga.txt", "w"); int i, j; for (i = 0; i < N; i++) { int osszeg = 0; for (j = 0; j < M; j++) { hallgatok[i].pont[j] = rand() % 101; osszeg += hallgatok[i].pont[j]; } hallgatok[i].atlag = (float)osszeg / M; fprintf(fp, "%s ", hallgatok[i].nev); for (j = 0; j < M; j++) fprintf(fp, "%d ", hallgatok[i].pont[j]); fprintf(fp, "-> %.2f\n", hallgatok[i].atlag); } fclose(fp); printf("Vizsgaadatok fajlba mentve.\n"); return 0; } 14. 5 oktató → 4 kurzus mindegyiknél, random pontszám 0–100. Átlag alapján kategória: * A: 85–100 * B: 70–84 * C: 55–69 * D: 40–54 * F: < 40 Minden oktató nevét, kurzuspontjait, átlagát és kategóriáját írd a fájlba. #include #include #include #define N 5 #define M 4 typedef struct { char nev[30]; int pontok[M]; float atlag; char kat; } Oktato; int main() { Oktato oktatok[N] = { {"Kovacs"}, {"Toth"}, {"Nagy"}, {"Varga"}, {"Horvath"} }; srand(time(NULL)); FILE *fp = fopen("kurzusok.txt", "w"); int i, j; for (i = 0; i < N; i++) { int osszeg = 0; for (j = 0; j < M; j++) { oktatok[i].pontok[j] = rand() % 101; osszeg += oktatok[i].pontok[j]; } oktatok[i].atlag = (float)osszeg / M; if (oktatok[i].atlag >= 85) oktatok[i].kat = 'A'; else if (oktatok[i].atlag >= 70) oktatok[i].kat = 'B'; else if (oktatok[i].atlag >= 55) oktatok[i].kat = 'C'; else if (oktatok[i].atlag >= 40) oktatok[i].kat = 'D'; else oktatok[i].kat = 'F'; fprintf(fp, "%s ", oktatok[i].nev); for (j = 0; j < M; j++) fprintf(fp, "%d ", oktatok[i].pontok[j]); fprintf(fp, "Atlag: %.1f Kat: %c\n", oktatok[i].atlag, oktatok[i].kat); } fclose(fp); printf("Oktatoi pontok es kategoriak mentve fajlba.\n"); return 0; }