Úvod do jazyka C Programovací jazyk C
Práca so súbormi Vo väčšine programov sa pre vstup dát používajú súbory (z klávesnice sa zadávajú len základné údaje). Spracované údaje majú cenu len v prípade že budú výsledky uložené do súborov. Práca so súbormi je jednou zo základných znalostí programovania v jazyku C.
Základné pojmy Súbor je postupnosť bajtov uložených na médiu (najčastejšie disku) v niekoľkých blokoch. Bloky majú rovnakú veľkosť a nemusia ležať za sebou. Ako sa s nimi pracuje je záležitosťou operačného systému. Prístup k súboru je možný sekvenčne alebo náhodilo. Budeme sa zaoberať len sekvenčným prístupom k súboru. Z užívateľského hľadiska je súbor postupnosť po sebe idúcich bajtov od začiatku do konca súboru. Starosťou operačného systému je aby nám tieto bajty dodal v správnom poradí.
Základné pojmy Z dôvodu čo najväčšieho obmedzenia počtu periférnych operácií (zvýšenie rýchlosti) sú I/O operácie bufferované. Pre vstup to predstavuje: naraz sa číta celý blok dát z disku do pamäti (bufferu). Jednotlivé položky sa potom čítajú z pamäti a nie priamo z disku. Pre výstup: dáta sa zapisujú do bufferu (pamäti) a keď je plný, zapíše sa celý obsah bufferu na disk ako jeden blok. Keď potrebujeme 2 znaky zo súboru, načíta sa do pamäti celý úsek súboru napr. blok dát velkosti 512 bajtov, v ktorom sú naše požadované znaky obsiahnuté. Potom sa z pamäti znaky postupne čítajú. Dôvod – zrýchlenie práce.
Začiatok práce so súbormi Nehľadajte v práci so súbormi žiadne zložitosti Základný dátový typ pre prácu so súbormi: FILE * Definícia premennej f pre prácu so súborom: FILE *fp; Poznámka: -identifikátor FILE musí byť veľkými písmenami !!! - premenná f sa používa pre čítanie aj zápis do súboru.
Operácie so súbormi Pred začiatkom práce so súborom je potrebné súbor otvoriť. Spôsob otvorenia súboru určuje, aké činnosti bude možné so súborom vykonávať. Otvorenie súboru pre čítanie: fp = fopen(“a.txt”, “r”); Otvorenie súboru pre zápis: fp = fopen(“a.txt”, “w”); Musí byť dve \\
Operácie so súbormi Zápis adresárovej cesty fp = fopen(“\\a.txt”, “w”); fp = fopen(“d:\\student\\a.txt”, “w”); Musí byť dve \\
Testovanie na existenciu súbora, resp. jeho otvorenia Používa sa porovnanie identifikátora súboru na hodnotu NULL. if (fp==NULL) { printf(“\n\r Subor sa nepodarilo otvorit”); }
Testovanie na existenciu súbora, resp. jeho otvorenia #include <stdio.h> #include <stdlib.h> #include <time.h> main() { FILE *fp; fp=fopen("mena.txt","r"); if(fp!=NULL) …. vykoname nejake prikazy fclose(fp); } else printf("\n\r Subor sa nepodarilo otvorit");
Základné operácie so súbormi Funkcie štandartnej knižnice stdio.h pre prácu so súborom. Súbor musí byť vopred otvorený. Premenná f je typu FILE *: formátované čítanie zo súboru fscanf(fp, “format”, argumenty); formátovaný zápis do súboru fprintf(fp, “format”, argumenty); čítanie znaku zo súboru c = getc(fp); zápis znaku do súboru putc(c,fp); Porovnať s použitím zápisu na obrazovku a čítaním z klávesnice.
Testovanie konca súboru Na konci súboru je uložený znak EOF. Na testovanie konca súboru sa používa funkcia feof(<identifikator_suboru>) Tento spôsob používame vtedy, ak nevieme, aký veľký súbor je alebo koľko údajov sa v ňom nachádza.
Ukončenie práce so súborom Po ukončení práce so súborom je nutné to operačnému systému oznámiť – uzatvoriť súbor Funkcia pre uzatvorenie súboru fclose(fp); Operačný systém súbory uzatvára po ukončení programu, ale môže dojsť pri zápise k situácii, že program bude ukončený a dáta z bufferu nebudú zapísané na disk.
Základné operácie so súbormi fscanf(fp, “%c”, znak); // nacitanie a zapis znaku fprintf(fp, “%c”, znak); fscanf(fp, “%d”, cislo); // nacitanie a zapis cisla fprintf(fp, “%d”, cislo); fscanf(fp, “%f”, zlomok); // nacitanie a zapis des. cisla fprintf(fp, “%f”, zlomok); Porovnať s použitím zápisu na obrazovku a čítaním z klávesnice.
Základné operácie so súbormi Zapísanie textu s číslom fprintf(fp, “Vysledok prikladu: %d”, cislo); Zapísanie dvoch čísel fprintf(fp, “Cislo %d na druhu je %d ”, cislo , cislo*cislo); Porovnať s použitím zápisu na obrazovku a čítaním z klávesnice.
Základné operácie so súbormi Zadanie: a) zapísať druhú a tretiu mocninu čísla do súbora. b) načítať druhú a tretiu mocninu čísla do súbora. Porovnať s použitím zápisu na obrazovku a čítaním z klávesnice.
Základné operácie so súbormi Najskôr je potrebné zapísať údaje: #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; int i; fp=fopen("mocniny.txt","w"); for(i=0; i<10; i++) fprintf(fp,"%d %d %d \n", i, i*i, i*i*i); } fclose(fp); Porovnať s použitím zápisu na obrazovku a čítaním z klávesnice.
Základné operácie so súbormi Potom tieto údaje načítame: #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; int i, cislo1, cislo2, cislo3; fp=fopen("mocniny.txt","r"); for(i=0; i<10; i++) fscanf(fp,"%d %d %d \n", &cislo1, &cislo2, &cislo3); printf("\n\r Cislo: %d x^2=%d x^3=%d", cislo1, cislo2, cislo3); } fclose(fp); Porovnať s použitím zápisu na obrazovku a čítaním z klávesnice.
Základné operácie so súbormi Potom tieto údaje načítame: #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; int i, cislo1, cislo2, cislo3; fp=fopen("mocniny.txt","r"); while(!feof(fp)) fscanf(fp,"%d %d %d \n", &cislo1, &cislo2, &cislo3); printf("\n\r Cislo: %d x^2=%d x^3=%d",cislo1,cislo2,cislo3); } fclose(fp); Porovnať s použitím zápisu na obrazovku a čítaním z klávesnice.
Zápis do súboru #include <stdio.h> #include <stdlib.h> #include <time.h> main() { FILE *fp; char meno[256]; int i,vek; fp=fopen("mena.txt","w"); for(i=0; i<5; i++) printf("\n\r Zadaj meno: "); scanf("%s",&meno); printf("\n\r Zadaj vek: "); scanf("%d",&vek); fprintf(fp, "%s %d\n",meno,vek); } fclose(fp);
Čítanie zo súboru #include <stdio.h> #include <stdlib.h> #include <time.h> main() { FILE *fp; char meno[256]; int vek; fp=fopen("mena.txt","r"); while(!feof(fp)) fscanf(fp,"%s %d",&meno,&vek); printf("\n\r %s %d",meno,vek); } fclose(fp);
FILE *fr; int c; long int pocet = 0; if ((fr = fopen("PISMENA.TXT", "r")) == NULL) { printf("Subor PISMENA.TXT sa nepodarilo otvorit\n"); return 1; } while ((c = getc(fr)) != EOF) pocet++; printf("V subore PISMENA.TXT je %d znakov\n", pocet); return 0;
#include <stdio.h> int main(void) { FILE *fr; int i; if ((fr = fopen("CISLA.TXT", "w")) == NULL) { printf("Soubor CISLA.TXT sa nepodarilo otvorit\n"); return 1; } for (i = 0; i < 20; i++) fprintf(fr, " %.2f\n", i * 3.14); fclose(fr); return 0; Formatovaný zápis čísel do súboru
Záver Pozrieť si funkcie: fseek, fread, fwrite