Práca so súbormy
Definícia súboru
- Súbory sú používané na ukladanie a manipuláciu s dátami.
- Príklad: FILE *subor;
Otvorenie a zatvorenie súborov
- Otvorenie súboru na čítanie:
subor = fopen("subor.txt", "r");
- Otvorenie súboru na zápis:
subor = fopen("subor.txt", "w");
- Zatvorenie súboru:
fclose(subor);
Čítanie a zapisovanie do súborov
Čítanie zo súboru
- Príklad čítania celého riadku:
Zapisovanie do súboru
- Príklad zapisovania textu:
char riadok[100];
while (fgets(riadok, sizeof(riadok), subor) != NULL) {
printf("%s", riadok);
}
fprintf(subor, "Toto je text, ktorý sa zapíše do súboru.\n");
Práca so štruktúrami v súboroch
Práca so štruktúrami v súboroch umožňuje ukladať a načítavať zložitejšie dáta, napríklad záznamy alebo objekty, a to vo forme binárnych blokov. Tu sú niektoré hlavné pojmy:
Štruktúra: Predstavuje definíciu dátového typu, ktorý môže obsahovať rôzne dátové prvky, napríklad rôzne premenné rôznych typov.
struct Osoba {
char meno[30];
int vek;
};
- Zápis do súboru: Používa sa funkcia fwrite(), ktorá umožňuje zapisovať dáta štruktúry (alebo iných dátových typov) do súboru.
struct Osoba osoba1;
strcpy(osoba1.meno, "Peter");
osoba1.vek = 25;
fwrite(&osoba1, sizeof(struct Osoba), 1, subor);
- Čítanie zo súboru: Načítavanie dát zo súboru používa funkciu fread(). Musíte poznať štruktúru dát, ktoré budete načítavať.
struct Osoba osoba2;
fread(&osoba2, sizeof(struct Osoba), 1, subor);
Textové a binárne súbory
Pri práci so súbormi v jazyku C je možné použiť textové aj binárne súbory, pričom každý má svoje výhody a nevýhody:
Textové súbory:
Dáta sú uložené v textovej forme, ktorá je ľahko čitateľná pre človeka.
Príklad čítania a zapisovania textu:
- Binárne súbory:
- Dáta sú uložené v binárnej forme, ktorá je efektívnejšia pre ukladanie štruktúr a komplexných dátových štruktúr.
- Príklad čítania a zapisovania binárnych dát:
fprintf(subor, "Toto je textový súbor.\n");
int cislo = 42;
fwrite(&cislo, sizeof(int), 1, subor);
Spracovanie chýb a výnimiek
Pri práci so súbormi je dôležité vedieť, ako správne spracovávať chyby a výnimky, ktoré môžu nastať. Tieto kroky sú zvyčajne súčasťou dobrej praxe:
Kontrola návratových hodnôt: Všetky funkcie, ktoré pracujú so súbormi, vrátia hodnotu, ktorá indikuje úspech alebo chybu operácie. Túto hodnotu by ste mali vždy skontrolovať.
- Správa chýb: Ak nastane chyba, je vhodné informovať o tom používateľa a/alebo zalogovať chybu pre neskoršie ladenie.
FILE *subor = fopen("subor.txt", "r");
if (subor == NULL) {
perror("Chyba pri otváraní súboru");
return 1;
}
perror("Chyba pri otváraní súboru");
Príklad:
Napíšte program, ktorý umožní používateľovi zadať text a uložiť ho do textového súboru. Následne program načíta tento súbor a vypíše jeho obsah na obrazovku.
#include <stdio.h>
int main() {
// Zápis do súboru
FILE *subor;
subor = fopen("textovy_subor.txt", "w");
if (subor == NULL) {
perror("Chyba pri otváraní súboru");
return 1;
}
fprintf(subor, "Toto je textový súbor.\n");
fclose(subor);
// Čítanie zo súboru
subor = fopen("textovy_subor.txt", "r");
if (subor == NULL) {
perror("Chyba pri otváraní súboru");
return 1;
}
char riadok[100];
while (fgets(riadok, sizeof(riadok), subor) != NULL) {
printf("%s", riadok);
}
fclose(subor);
return 0;
}


Úloha číslo 1: Vytvorte štruktúru reprezentujúcu osobu (napríklad s poliami pre meno a vek). Program by mal umožniť používateľovi vložiť údaje o osobe a uložiť ich do binárneho súboru. Potom by mal byť schopný načítať tieto údaje zo súboru a vypísať ich na obrazovku.
#include <stdio.h>
#include <string.h>
struct Osoba {
char meno[30];
int vek;
};
int main() {
FILE *subor;
subor = fopen("osoba.dat", "wb");
if (subor == NULL) {
perror("Chyba pri otváraní súboru");
return 1;
}
struct Osoba osoba1;
strcpy(osoba1.meno, "Peter");
osoba1.vek = 25;
fwrite(&osoba1, sizeof(struct Osoba), 1, subor);
fclose(subor);
subor = fopen("osoba.dat", "rb");
if (subor == NULL) {
perror("Chyba pri otváraní súboru");
return 1;
}
struct Osoba osoba2;
fread(&osoba2, sizeof(struct Osoba), 1, subor);
printf("Meno: %s, Vek: %d\n", osoba2.meno, osoba2.vek);
fclose(subor);
return 0;
}

Úloha číslo 2: Napíšte program, ktorý skopíruje obsah jedného textového súboru do druhého. Používateľ by mal mať možnosť zadať názvy vstupného a výstupného súboru.
#include <stdio.h>
int main() {
FILE *vstupny_subor, *vystupny_subor;
vstupny_subor = fopen("vstup.txt", "r");
vystupny_subor = fopen("vystup.txt", "w");
if (vstupny_subor == NULL || vystupny_subor == NULL) {
perror("Chyba pri otváraní súborov");
return 1;
}
char znak;
while ((znak = fgetc(vstupny_subor)) != EOF) {
fputc(znak, vystupny_subor);
}
fclose(vstupny_subor);
fclose(vystupny_subor);
return 0;
}



Úloha číslo 3: Vytvorte program, ktorý umožní používateľovi zadať reťazec a uložiť ho do textového súboru. Následne program načíta tento súbor a vypíše jeho obsah na obrazovku.
#include <stdio.h>
int main() {
FILE *subor;
subor = fopen("retazec.txt", "w");
if (subor == NULL) {
perror("Chyba pri otváraní súboru");
return 1;
}
char retazec[100];
printf("Zadajte reťazec: ");
fgets(retazec, sizeof(retazec), stdin);
fprintf(subor, "%s", retazec);
fclose(subor);
subor = fopen("retazec.txt", "r");
if (subor == NULL) {
perror("Chyba pri otváraní súboru");
return 1;
}
while (fgets(retazec, sizeof(retazec), subor) != NULL) {
printf("Načítaný reťazec: %s", retazec);
}
fclose(subor);
return 0;
}
Úloha 4: Napíšte program, ktorý načíta čísla zo súboru s názvom "cisla.txt", spočíta ich priemer a vypíše ho na obrazovku.
#include <stdio.h>
int main() {
FILE *subor;
subor = fopen("cisla.txt", "r");
if (subor == NULL) {
perror("Chyba pri otváraní súboru");
return 1;
}
int cislo;
int pocet = 0;
int suma = 0;
while (fscanf(subor, "%d", &cislo) == 1) {
pocet++;
suma += cislo;
}
fclose(subor);
double priemer = (double)suma / pocet;
printf("Priemer čísel zo súboru: %.2lf\n", priemer);
return 0;
}
