Obsah 6 Vstup a výstup zo/do súboru 2 6.1 Otvorenie a zatvorenie súboru..................... 2 6.1.1 Otvorenie súboru - funkcia fopen............... 2 6.1.1.1 Módy pre otvorenie súboru............. 2 6.1.2 Zatvorenie súboru - funkcia fclose.............. 3 6.2 Vstup a výstup jedného znaku..................... 3 6.2.1 Vstup - funkcia getc...................... 3 6.2.2 Výstup - funkcia putc..................... 3 6.3 Vstup a výstup rôznych typov dát.................... 4 6.3.1 Vstup - funkcia fscanf.................... 5 6.3.2 Výstup - funkcia fprintf................... 5 1
Kapitola 6 Vstup a výstup zo/do súboru Rovnako ako ked sme tlačili znak na terminál (obrazovku) alebo načítavali znak z klávesnice, takisto môžeme čítat /zapisovat zo/do súboru. Funkcie, ktoré budeme na tieto operácie využívat sú funkciami štandardného hlavičkového súboru stdio.h. 6.1 Otvorenie a zatvorenie súboru Ak chceme v jazyku C pracovat so súborom, tak ho musíme najprv otvorit - načítat do pamäte počítača a až po úspešnom načítaní môžeme vykonávat so súborom požadované operácie. 6.1.1 Otvorenie súboru - funkcia fopen FILE *fopen(const char *path, const char *mode); Funkcia fopen vyžaduje dva parametre. Prvý parameter path určuje cestu k súboru vrátane jeho názvu. Druhý parameter je mód, v ktorom chceme s daným súborom pracovat. Ak súbor existuje a je možné s ním pracovat, tak funkcia vracia ukazovatel na tento súbor - FILE *stream. Ak súbor nie je možné otvorit, tak funkcia vracia hodnotu NULL. Je potrebné vždy overit, či sa súbor otvoril a či nepracujeme s nulovým ukazovatel om - teda ukazovatel om, ktorý neukazuje na platnú adresu v pamäti! 6.1.1.1 Módy pre otvorenie súboru Kvôli jednoduchosti úvadzam iba základné módy pre otvorenie súboru. r (read - čítat ) - súbor sa otvorí len na čítanie. Ak súbor neexistuje, tak funkcia nevytvára súbor. 2
KAPITOLA 6. VSTUP A VÝSTUP ZO/DO SÚBORU 3 w (write - zapisovat ) - súbor sa otvorí len na čítanie/zapisovanie. Ak súbor neexistuje, tak sa vytvorí prázdny súbor s uvedeným menom. a (append - pripísat ) - rovnaký mód ako w len s tým rozdielom, že pokial súbor už existuje a jeho obsah nie je prázdny, tak sa začne zapisovat na koniec tohto súboru, takže obsah súboru sa nezruší ako pri móde w. 6.1.2 Zatvorenie súboru - funkcia fclose int fclose(file *stream); Funkcia zatvorí súbor, ktorý je načítaný v pamäti. Ak zatvorenie prebehlo úspešne, tak funkcia vracia hodnotu 0, inak vracia hodnotu EOF - End Of File (hodnota EOF je -1). 6.2 Vstup a výstup jedného znaku 6.2.1 Vstup - funkcia getc Pomocou funkcie getc môžeme načítat vstup zo súboru. prototyp funkcie getc int getc(file *stream); Funkcia načíta znak zo súboru, ktorý je načítaný v pamäti a ukazuje na neho deskriptor súboru - napríklad premenná stream typu F ILE. Návratová hodnota funkcie je pretypovaná hodnota typu unsigned char na int. Ak funkcia narazí na koniec súboru, tak vracia hodnotu EOF. 6.2.2 Výstup - funkcia putc Pomocou funkcie putc môžeme zapisovat do súboru. prototyp funkcie putc int putc(int c, FILE *stream); Funkcia zapíše do súboru, na ktorý ukazuje stream znak. Návratová hodnota funkcie je znak, ktorý bol zapísaný do súboru alebo EOF v prípade, že sa vyskytla chyba. Príklad /* * File: getc_putc.c * Author: Filip * Description: Programme loads data from in.txt file and converts all letters to upper case. * Date: Sun Dec 10 2006
KAPITOLA 6. VSTUP A VÝSTUP ZO/DO SÚBORU 4 * Note: Output is in file named out.txt. */ #include <stdio.h> #include <ctype.h> #define INPUT "in.txt" #define OUTPUT "out.txt" int main() { FILE *fr; //fr - file read FILE *fw; //fw - file write int c; if ((fr = fopen(input, "r")) == NULL) { //open file for reading printf("cannot open file %s \n", INPUT); if ((fw = fopen(output, "w")) == NULL) { //open file for writing printf("cannot open file %s \n", OUTPUT); while ((c = getc(fr))!= EOF) putc(toupper(c), fw); //toupper -> convert letter to upper case (a -> A) //close file descriptor fclose(fr); fclose(fw); Program číta zo súboru in.txt po jednom znaku. Ak sa jedná o písmeno, tak sa toto písmeno prekonvertuje na vel ké písmeno pomocou funkcie toupper. Na použitie tejto funkcie bolo potrebné pripojit hlavičkový súbor ctype.h. Následne sa znak zapisuje do súboru out.txt, ktorý bol otvorený na zapisovanie. Cyklus while je použitý preto, lebo čítame dovtedy, kým nenarazíme na koniec súboru, čiže dopredu nevieme, kol ko znakov obsahuje súbor (aj ked by sa to samozrejme dalo zistit - porozmýšl ajte ako). Na konci programu sa obidva súbory musia pomocou funkcie fclose zatvorit. Skúste si rozmysliet, ako by ste implementovali (naprogramovali) funkciu toupper. 6.3 Vstup a výstup rôznych typov dát Analogicky ako pri vstupe/výstupe na terminál sme používali printf alebo scanf funkciu, tak pri súboroch budeme používat fprintf, fscanf funkcie. Jednotlivé formáty pre príslušné typy premenných (znak, celé číslo, reálne číslo, ret azec) nájdete v časti 3.3.
KAPITOLA 6. VSTUP A VÝSTUP ZO/DO SÚBORU 5 6.3.1 Vstup - funkcia fscanf Pomocou funkcie fscanf môžeme načítat vstup zo súboru, ktorý môže predstavovat znak, celé číslo, reálne číslo alebo ret azec. prototyp funkcie fscanf int fscanf(file *stream, const char *format,...); Funkcia vyžaduje ako prvý parameter ukazovatel na súbor a d alšie parametre sú rovnaké ako pri funkcii scanf. Návratová hodnota funkcie je počet úspešne načítaných hodnôt (parametrov) alebo v prípade chyby hodnota EOF. 6.3.2 Výstup - funkcia fprintf Pomocou funkcie fprintf môžeme zapisovat do súboru znak, číslo (celé, reálne) alebo ret azec. prototyp funkcie fprintf int fprintf(file *stream, const char *format,...); Funkcia vyžaduje ako prvý parameter ukazovatel na súbor a d alšie parametre sú rovnaké ako pri funkcii printf. Príklad /* * File: fscanf_fprintf.c * Author: Filip * Description: Programme reads numbers from in.txt file and writes their sum to out.txt file. * Date: Sun Dec 10 2006 */ #include <stdio.h> #define INPUT "in.txt" #define OUTPUT "out.txt" int main() { FILE *fr; //fr - file read FILE *fw; //fw - file write float fnumber, fsum = 0; if ((fr = fopen(input, "r")) == NULL) { //open file for reading printf("cannot open file %s \n", INPUT); if ((fw = fopen(output, "w")) == NULL) { //open file for writing printf("cannot open file %s \n", OUTPUT); while ((fscanf(fr, "%f", &fnumber))!= EOF)
KAPITOLA 6. VSTUP A VÝSTUP ZO/DO SÚBORU 6 fsum += fnumber; //fsum = fsum + fnumber fprintf(fw, "Sum: %lg\n", fsum); printf("sum: %lg\n", fsum); //close file descriptor fclose(fr); fclose(fw); Program číta čísla zo súboru in.txt. Ked že v súbore môžu byt aj reálne čísla, tak je použitá premenná typu float a vo funkcii fscanf je %f. Premenná fsum predstavuje súčet všetkých čísel, ktoré sú v súbore in.txt. Po načítaní všetkých čísel zapíšeme výsledok do súboru out.txt a rovnako ho vypíšeme aj na obrazovku. Na konci programu uzatvoríme obidva súbory, s ktorými sme pracovali.