Přednáška http://efis.tul.cz/~dana.nejedlova/ Základy programování, Programování I a II Přednáška z jazyka C Probralo se to do snímku "Rekurzívní funkce". Cvičení Čtení dat z textového souboru jako funkce Program čte čísla a znaky. #include #define SOUBOR "vstup.txt" int main(void) { FILE *fr; int c; fr = fopen(SOUBOR, "r"); do { if (fscanf(fr, "%d", &c) == 1) { printf("%d %d\n", c, 2*c); } else { putchar(getc(fr)); putchar('\n'); } } while (!feof(fr)); fclose(fr); return 0; } Program čte čísla a znaky a má toto čtení jako funkci typu procedura. #include #define SOUBOR "vstup.txt" void cti_cisla_a_znaky(FILE *fr) { int c; do { if (fscanf(fr, "%d", &c) == 1) { printf("%d %d\n", c, 2*c); } else { putchar(getc(fr)); putchar('\n'); } } while (!feof(fr)); } int main(void) { FILE *fr; fr = fopen(SOUBOR, "r"); cti_cisla_a_znaky(fr); fclose(fr); return 0; } \Projekt_Cteni\main.c|15|warning: control reaches end of non-void function [-Wreturn-type]| Funkce nemá příkaz return a má jiný návratový typ než void. Program s ověřením správnosti otevření a uzavření souboru uvnitř funkce main(). #include #define SOUBOR "vstup.txt" int cti_cisla_a_znaky(FILE *fr) { int c, pocet_nactenych_cisel = 0; do { if (fscanf(fr, "%d", &c) == 1) { printf("%d %d\n", c, 2*c); pocet_nactenych_cisel++; } else { putchar(getc(fr)); putchar('\n'); } } while (!feof(fr)); return pocet_nactenych_cisel; } int main(void) { FILE *fr; if ((fr = fopen(SOUBOR, "r")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", SOUBOR); return 1; } printf("Ze souboru %s bylo nacteno %d cisel.", SOUBOR, cti_cisla_a_znaky(fr)); if (fclose(fr) == EOF) { printf("Soubor %s se nepodarilo uzavrit.\n", SOUBOR); return 1; } return 0; } \Projekt_Cteni\main.c|10|warning: implicit declaration of function 'exit' [-Wimplicit-function-declaration]| Chybí knihovna stdlib.h s funkcí exit(). Program s ověřením správnosti otevření a uzavření souboru uvnitř funkce cti_cisla_a_znaky(). #include #include #define SOUBOR "vstup.txt" int cti_cisla_a_znaky() { FILE *fr; int c, pocet_nactenych_cisel = 0; if ((fr = fopen(SOUBOR, "r")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", SOUBOR); exit(1); } do { if (fscanf(fr, "%d", &c) == 1) { printf("%d %d\n", c, 2*c); pocet_nactenych_cisel++; } else { putchar(getc(fr)); putchar('\n'); } } while (!feof(fr)); if (fclose(fr) == EOF) { printf("Soubor %s se nepodarilo uzavrit.\n", SOUBOR); exit(1); } return pocet_nactenych_cisel; } int main(void) { printf("Ze souboru %s bylo nacteno %d cisel.", SOUBOR, cti_cisla_a_znaky()); return 0; } Program s funkcí pro čtení čísla ze souboru a vypsání jeho popisu do konce řádky. #include #include #define SOUBOR "cisla_s_popisem.txt" double cti_double_ze_souboru(FILE *fr) { int znak; double cislo; if (fscanf(fr, "%lf", &cislo) != 1) printf ("Chybi hodnota v souboru %s!\n", SOUBOR); printf("Precteno %f", cislo); while (((znak = getc(fr)) != '\n') && !feof(fr)) putchar(znak); putchar('\n'); return cislo; } double cti_int_ze_souboru(FILE *fr) { int znak; int cislo; if (fscanf(fr, "%d", &cislo) != 1) printf ("Chybi hodnota v souboru %s!\n", SOUBOR); printf("Precteno %d", cislo); while (((znak = getc(fr)) != '\n') && !feof(fr)) putchar(znak); putchar('\n'); return cislo; } int main(void) { FILE *fr; double sazba_DPH_zakladni, sazba_DPH_snizena; int rok_vyroby; if ((fr = fopen(SOUBOR, "r")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", SOUBOR); return 1; } sazba_DPH_zakladni = cti_double_ze_souboru(fr); sazba_DPH_snizena = cti_double_ze_souboru(fr); rok_vyroby = cti_int_ze_souboru(fr); if (fclose(fr) == EOF) { printf("Soubor %s se nepodarilo uzavrit.\n", SOUBOR); return 1; } printf("Sazba DPH zakladni = %f\nSazba DPH snizena = %f\nRok vyroby = %d", sazba_DPH_zakladni, sazba_DPH_snizena, rok_vyroby); return 0; } Obsah souboru "cisla_s_popisem.txt": 0.21 Základní sazba DPH 0.15 Snížená sazba DPH 2005 Rok výroby Kdyby byl obsah řádku souboru ve formě popis čísla a číslo, tak by se mohla použít funkce strtok() viz snímek mých přednášek z jazyka C "Funkce strtok()".