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 - funkciaf open . . . 2
6.1.1.1 Módy pre otvorenie súboru . . . 2
6.1.2 Zatvorenie súboru - funkciaf close . . . 3
6.2 Vstup a výstup jedného znaku . . . 3
6.2.1 Vstup - funkciagetc . . . 3
6.2.2 Výstup - funkciaputc . . . 3
6.3 Vstup a výstup rôznych typov dát . . . 4
6.3.1 Vstup - funkciaf scanf . . . 5
6.3.2 Výstup - funkciaf printf . . . 5
Kapitola 6
Vstup a výstup zo/do súboru
Rovnako ako ked’ sme tlaˇcili znak na terminál (obrazovku) alebo naˇcítavali znak z klávesnice, takisto môžeme ˇcítat’/zapisovat’ zo/do súboru. Funkcie, ktoré budeme na tieto operácie využívat’ sú funkciami štandardného hlaviˇckového súborustdio.h.
6.1
Otvorenie a zatvorenie súboru
Ak chceme v jazyku C pracovat’ so súborom, tak ho musíme najprv otvorit’ - naˇcí-tat’ do pamäte poˇcítaˇca a až po úspešnom naˇcítaní môžeme vykonávat’ so súborom požadované operácie.
6.1.1
Otvorenie súboru - funkcia
f open
FILE *fopen(const char *path, const char *mode);
Funkciafopen vyžaduje dva parametre. Prvý parameterpathurˇcuje cestu k súboru vrátane jeho názvu. Druhý parameter jemód, v ktorom chceme s daným súborom pra-covat’. 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 hod-notuNULL. Je potrebnévždyoverit’, ˇci sa súbor otvoril a ˇci 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 - ˇcítat’) - súbor sa otvorílenna ˇcítanie. Ak súbor neexistuje, tak funkcia nevytvára súbor.
KAPITOLA 6. VSTUP A VÝSTUP ZO/DO SÚBORU 3
• “w” (write - zapisovat’) - súbor sa otvorílenna ˇcí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ˇcne 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
f close
int fclose(FILE *stream);
Funkcia zatvorí súbor, ktorý je naˇcí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 funkciegetcmôžeme naˇcítat’ vstup zo súboru. prototyp funkcie getc
int getc(FILE *stream);
Funkcia naˇcíta znak zo súboru, ktorý je naˇcítaný v pamäti a ukazuje na neho des-kriptor súboru - napríklad premennástreamtypuF ILE. Návratová hodnota funkcie je pretypovaná hodnota typuunsigned charnaint. Ak funkcia narazí na koniec sú-boru, tak vracia hodnotuEOF.
6.2.2
Výstup - funkcia
putc
Pomocou funkcieputcmôžeme zapisovat’ do súboru. prototyp funkcie putc
int putc(int c, FILE *stream);
Funkcia zapíše do súboru, na ktorý ukazujestreamznak. Návratová hodnota fun-kcie je znak, ktorý bol zapísaný do súboru aleboEOFv 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
* 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);
return 0; }
if ((fw = fopen(OUTPUT, "w")) == NULL) { //open file for writing printf("Cannot open file ’%s’\n", OUTPUT);
return 0; }
while ((c = getc(fr)) != EOF)
putc(toupper(c), fw); //toupper -> convert letter to upper case (a -> A)
//close file descriptor fclose(fr);
fclose(fw);
return 0; }
Programˇcítazo 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 funkcietoupper. Na použitie tejto funkcie bolo potrebné pripojit’ hlaviˇckový súborctype.h. Následne sa znakzapisuje
do súboru ‘out.txt’, ktorý bol otvorený na zapisovanie. Cykluswhileje použitý preto, lebo ˇcítame dovtedy, kým nenarazíme na koniec súboru, ˇciž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 funkcief closezatvorit’.
Skúste si rozmysliet’, ako by ste implementovali (naprogramovali) funkciutoupper.
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 fun-kciu, tak pri súboroch budeme používat’ fprintf, fscanf funkcie. Jednotlivé formáty pre príslušné typy premenných (znak, celé ˇcíslo, reálne ˇcíslo, ret’azec) nájdete v ˇcasti 3.3.
KAPITOLA 6. VSTUP A VÝSTUP ZO/DO SÚBORU 5
6.3.1
Vstup - funkcia
f scanf
Pomocou funkcief scanfmôžeme naˇcítat’ vstup zo súboru, ktorý môže predstavovat’ znak, celé ˇcíslo, reálne ˇcí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ˇcet úspešne naˇcítaných hodnôt (parametrov) alebo v prípade chyby hodnotaEOF.
6.3.2
Výstup - funkcia
f printf
Pomocou funkcief printfmôžeme zapisovat’ do súboru znak, ˇcíslo (celé, reálne) ale-bo 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);
return 0; }
if ((fw = fopen(OUTPUT, "w")) == NULL) { //open file for writing printf("Cannot open file ’%s’\n", OUTPUT);
return 0; }
fSum += fNumber; //fSum = fSum + fNumber
fprintf(fw, "Sum: %lg\n", fSum); printf("Sum: %lg\n", fSum);
//close file descriptor fclose(fr);
fclose(fw);
return 0; }
Program ˇcíta ˇcísla zo súboru ‘in.txt’. Ked’že v súbore môžu byt’ aj reálne ˇcísla, tak je použitá premenná typu f loata vo funkcii f scanf je%f. Premennáf Sum predstavuje súˇcet všetkých ˇcísel, ktoré sú v súbore ‘in.txt’. Po naˇcítaní všetkých ˇcísel
zapíšemevý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.