Jazyk C (príklady) - Súbor

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání


Základy informatiky - jazyk C


Riešené príklady

Algoritmy

Prvé programy

Podmienky

Cykly

Polia

Funkcie

Súbor

Vzorové príklady

Neriešené príklady


zdroj: Juraj Ďuďák, Zbierka úloh z algoritmizácie pre predmet Základy informatiky

ISBN: 978-80-8075-199-9

Obsah

V tejto časti bude ukázaná práca so súbormi v jazyku C. Pre prácu so súborom budeme používať funkcie pre prácu so štandardným vstupom­/výstupom definovanými v knižninci stdio.h. Pre zvládnutie týchto príkladov sa predpokladá znalosť funkcií fopen, fclose, fprintf, fscanf, feof, putc, getc a práca s dátovým typom FILE*.

FILE

Dátový typ FILE sa používa na identifikovanie súboru, s ktorým budeme pracovať. Tento dátový typ sa nikdy neoužíva priamo (napr: FILE subor0;), ale vždy sa používa premenná typu ukazovateľ na súbor: FILE *subor;. S premennou subor sa potom robia všetky operácie so súborom (otvorenie, zápis, čítanie, zatvorenie).

fopen, fclose

Otvorenie súboru
FILE *fopen("nazov_suboru",mod);

Funkcia fopen má 2 argumenty: prvý argument je názov súboru, ktorý chceme otvoriť. Názov súboru môže obsahovať relatívnu alebo absulútnu cestu k súboru. Druhý argument je (textový reťazec) mód otvorenia súboru: "r" – na čítanie, "w" – na zápis, "a" – pridávanie na koniec súboru. Funkcia vracia ukazateľ na premennú typu FILE. Premenná typu FILE obsahuje informácie o otváranom súbore ako sú: deskriptor súboru, stavové príznaky, veľkosť buffera, … Ak sa súbor podarilo otvoriť, fopen vráti ukazovateľ na otvorený súbor, v opačnom prípade vráti konštantu NULL.

Zatvorenie súboru
int fclose(FILE *fp); Argument funkcie fclose je ukazovateľ na otvorený súbor. Ak sa súbor podarí zatvoriť, funkcia vráti 0, v opačnom prípade vráti konštantu EOF.

Vstup/výstup znaku

int getc(FILE *stream); Funkcia getc vracia prečítaný znak zo súboru identifikovaným ukazovateľom stream. int putc(int c,FILE *stream); Funkcie putc zapíše znak c do súboru identifikovaným ukazovateľom na otvorený súbor stream.

Formátovaný vstup/výstup

Funkcie pre formátovaný vstup/výstup (fprintf, fscanf) majú rovnaké použitie ako funkcie printf a scanf. Jediný rozdiel v použití je pridanie prvého argumentu do funkcie (FILE *stream), ktorý nám určuje, s ktorým súborom budeme pracovať. int fprintf(FILE *stream,char *format,arg1,arg2,...,argn); int fscanf(FILE *stream,char *format, &arg1,&arg2,...,&argn);

Programy

Čítanie po slovách

Zadanie
V textovom súbore data.txt je uložený nejaký text. Vytvorte program, ktorý tento text vypíše na monitor. Ak sa súbor nepodarí otvoriť, vypíšte chybové hlásenie a program ukončite.
Analýza problému
Úloha je jednoduchá, stačí zo súboru postupne čítať slová a vypisovať ich na monitor. Zo súboru budeme čítať, pokiaľ nenarazíme na koniec súboru.
 1 #include <stdio.h>
 2 void main()
 3 {
 4 
 5     FILE *fp;
 6     char c[20];
 7     fp = fopen("data.txt","r");  // subor, z ktoreho budem citat
 8     if(fp == NULL)
 9     printf("Subor data.txt neexistuje\n");
10     else  // ak subor existuje
11     {
12         do  // v cykle
13         {
14             fscanf(fp,"%s",c); // citaj retazce po slovach
15             printf("%s ",c);  // a vypis na monitor
16         } while (!feof(fp));  // pokial nenarazis na koniec suboru
17         fclose(fp);  // nakoniec zatvor subor
18     }    
19 
20 }

Počet viet v súbore

Zadanie
V textovom súbore data.txt je uložený nejaký text. Vytvorte program, ktorý zistí koľko je v súbore viet.
Analýza problému
Ak budeme predpokladať, že za každou vetou je bodka, potom počet viet je zhodný s počtom bodiek. V tomto prípade sa čítanie po slovách neukazuje vhodné. Budeme čítať po znakoch a budeme počítať všetky výskyty bodiek.
 1 #include <stdio.h>
 2 void main()
 3 {
 4 
 5     FILE *fp;
 6     int vety=0;
 7     char c;
 8     fp = fopen("data.txt","r");
 9     if (fp == NULL) printf("Subor data.txt neexistuje\n");
10     else
11     {
12         do
13         {
14             c = getc(fp);  //precita jeden znak zo suboru
15             if(c=='.')
16                 vety++;
17         } while (c != EOF);  // opakuj cyklus pokial sa nenarazi na koniec suboru
18         fclose(fp);
19         printf("V subore je %d viet",vety);
20     }
21 
22 }

Tlač súboru

Zadanie
V textovom súbore je uložený nejaký text. Vytvorte program, ktorý vytlačí tento súbor (odošle ho na tlačiareň). Program sa spýta na názov súboru. Po zadaní názvu súboru, tento vytlačí.
Analýza problému
Zo súboru budeme čítať po znaku, pokiaľ nenarazíme na koniec súboru. Prečítaný znak ihneď odošleme na tlačiareň. Tlačiareň si možno predstaviť ako jednoduchý textový súbor, do ktorého budeme zapisovať. Jediná vec, čím sa líši od textového súboru je špeciálny názov tlačiarne. V prostredí Windows má tlačiareň názov $LPT. Tento súbor si otvoríme na zápis a budeme doňho zapisovať. To, čo tam zapíšeme, sa vytlačí.
 1 #include <stdio.h>
 2 void main(void)
 3 {
 4 
 5     FILE *fp,*printer;
 6     char filename[25];
 7     char c;
 8     printf("Zadaj nazov suboru: ");
 9     scanf("%s",filename);
10     fp = fopen(filename,"r");
11     printer=fopen("$LPT","w");
12     /*  printer=fopen("PRN","w"); pre DOS  */
13     if (fp == NULL) printf("Zadany subor (%s) neexistuje\n",filename);
14     else if (printer==NULL)printf("Tlaciaren neexistuje\n");
15     else
16     {
17 
18     do
19     {
20         c = fgetc(fp);  /* nacitaj 1 znak zo suboru */
21         if (c != EOF)
22         {
23             putchar(c);
24             putc(c,printer);
25         }
26     } while (c != EOF);  /* opakuje az po koniec suboru */
27 
28     }
29     fclose(fp);
30     fclose(printer);
31 }

Kopírovanie súboru

Zadanie
Vytvorte program, ktorý skopíruje obsah jedného súboru do druhého súboru. Názvy súborov načítajte v programe z klávesnice. Pri kopírovaní zmeňte všetky malé písmená na veľké.
Analýza problému
Zo súboru budeme čítať po slovách (mohli by sme aj po znakoch) a každé prečítané slovo skonvertujeme na slovo s veľkými písmenami. Na toto nám poslúži funkcia strupr definovaná v knižnici string.h, ktorá skonvertuje malé písmená na veľké. Funkcia strupr vracia ukazovateľ na char, preto si musíme definovať pomocnú premennú (char *slovo_upr;), v ktorej bude slovo skonvertované na veľké písmená.
 1 #include <stdio.h>
 2 #include <string.h>
 3 void main()
 4 {
 5 
 6     FILE *f1,*f2;
 7     int c;
 8     char zdroj[20],ciel[20];
 9     printf("\nZadaj nazov zdrojoveho suboru: ");
10     scanf("%s",zdroj);
11     printf("\nZadaj nazov cieloveho suboru: ");
12     scanf("%s",ciel);
13     f1 = fopen(zdroj,"r");  // subor z ktoreho budem citat
14     f2 = fopen(ciel,"w");  // subor zo ktoreho budem zapisovat
15     char slovo[50], *slovo_upr;
16     if(f1==NULL)
17         printf("Subor %s sa nepodarilo otvorit", zdroj);
18     else
19     {
20         do  // v cykle
21         {
22             fscanf(f1,"%s",slovo); // citaj retazce po slovach
23             slovo_upr =strupr(slovo);  //konvertuj na velke pismena
24             fprintf(f2,"%s ", slovo_upr);  // a zapis do suboru
25         } while (!feof(f1));  // pokial nenarazis na koniec suboru
26         fclose(f1);  // nakoniec zatvor subory
27         fclose(f2);
28     }
29 
30 }

Analýza dát

Zadanie
V súbore udaje.txt sa nachádzajú celé čísla oddelené od seba medzerou alebo znakom ‘\n’ (nový riadok). Tieto čísla by mali byť v rozsahu 0 až 100. Avšak môže sa stať, že sú tam aj väčšie čísla. Úlohou je skopírovať tieto čísla zo súboru udaje.txt do súboru upravene.txt. Avšak len tie, ktoré sú v dovolenom intervale – t.j. v rozsahu 0 až 100.
Analýza problému
Keďže vieme, že v súbore sú len čísla, budeme zo súboru čítať len celé čísla (formát %d). Ak bude prečítané číslo v dovolenom intervale, tak ho zapíšeme do súboru upravene.txt.
 1 #include <stdio.h>
 2 void main()
 3 {
 4 
 5     FILE *fp,*upr;
 6     int c;
 7     fp =fopen("udaje.txt","r");  // subor, z ktoreho budem citat
 8     if (fp == NULL) printf("Subor udaje.txt neexistuje\n");
 9     else  // ak subor existuje
10     {
11         upr =fopen("upravene.txt","w"); //subor, do ktoreho budem zapisovat
12         do  // v cykle
13         {
14             fscanf(fp,"%d",&c); // citaj cisla
15             if( (c>0) && (c<101) ) // ak je cislo v danom intervale
16                 fprintf(upr,"%d ",c);  // a zapis do suboru
17         } while (!feof(fp));  // pokial nenarazis na koniec suboru
18         fclose(fp);  // nakoniec zatvor subory
19         fclose(upr);
20     }
21 
22 }