Vstup a výstup zo/do súboru

Loading....

Loading....

Loading....

Loading....

Loading....

Full text

(1)

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

(2)

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.

(3)

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

(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);

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.

(5)

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; }

(6)

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.

Figure

Updating...

References

Updating...

Related subjects :