Tohle je vlastně tak trochu pokračování čtvrté kapitoly, ale potřebujete k tomu znát
podmínky a cykly, takže jsem to musel přehodit.

4.5 Souborový vstup a výstup
    Se soubory se dělá podobně jako s konzolí. Je tam ale jeden rozdíl - konzole je
    jen jedna, ale souborů je víc, takže každý soubor se v Céčku otevře do svojí vlastní
    proměnné :


#include <stdio.h>

int main()
{
    FILE *soubor;

    soubor = fopen("jmeno_soub", "jak_otevrit"); // otevře soubor
    if(soubor == NULL) {
        printf("Nepodařilo se otevřít soubor");

        getchar();
        return 0;
    }

    fclose(soubor); // uzavře soubor

    getchar();
    return 1;
}
To by bylo. Jsou tu funkce fopen a fclose. fopen slouží k otevření souboru. Parametry jsou jmeno_soub (jméno souboru) a jak_otevrit udává jak se soubor otevře. varianty jsou : Nás zatím zajímají jen první tři. Pokud se rozhodneme pro čtení, musí soubor existovat, jinak funkce fopen vrátí NULL. Pokud to bude pro zápis, soubor se smaže (pokud je) a vytvoří se znovu. A pro připojení se vytvoří novej, nebo se připisuje do existujícího. To je hezký, teď umíme otevřít soubor, ale jak se dostat k datům v souboru ? Jde to pomocí stejných funkcí jako pro konzoli. To jsou fgetc, fputc (obdoby getchar a putchar) a fscanf a fprintf. Dáme příklad :

void main()
{
    FILE *fr;
    char c;

    fr = fopen("text.txt", "r");
    if(fr == NULL) {
        printf("Soubor nejde otevrit !\n");

        getchar();
        return;
    }

    c = fgetc(fr);

    fclose(fr);

    putchar(c);

    getchar();
}
Tenhle program otevře soubor text.txt, přečte z něj jeden znak a ten vytiskne. Pokud chcete přečíst celou řádku, dáte to do smyčky, dokud c nebude '\n'. Ale co když narazíme na konec souboru ? V souboru stdio.h je funkce feof(FILE *), která vrátí nulu, pokud nejsme na konci souboru. To by se taky dalo dát dyo smyčky. Ale je tu ještě jedna možnost a tou je konstanta EOF (End Of File). Ta je obvykle -1 (ale nemusí), z čehož vyplývá že nemůžeme použít char (ten má moc malý rozsah), ale musíme použít int. Následující program vypíše celý soubor na obrazovku :

void main()
{
    FILE *fr;
    int c;

    fr = fopen("text.txt", "r");
    if(fr == NULL) {
        printf("Soubor nejde otevrit !\n");

        getchar();
        return;
    }

    while((c = fgetc(fr)) != EOF)
        putchar(c);
    // čte a tiskne soubor text.txt

    fclose(fr);
    getchar();
}
Tag. To je hezké, ale k ničemu to není. Můžeme pomocí toho leda kopírovat soubory. Užitečnější jsou funkce fscanf a fprintf. Zkusíme program, kterej načte dvě čísla ze souboru a.txt a uloží je do b.txt :

void main()
{
    FILE *fr, *fw;
    int a, b;

    fr = fopen("a.txt", "r");
    fw = fopen("b.txt", "w"); // otevreme pro zapis
    if(fr == NULL || fw == NULL) {
        printf("Soubor nejde otevrit !\n");

        if(fr != NULL)
            fclose(fr);
        if(fw != NULL)  // před koncem programu musíme
            fclose(fw); // uzavřít všechny soubory

        getchar();
        return;
    }

    fscanf(fr, "%d %d", &a, &b);
    fprintf(fw, "%d + %d = %d\n", a, b, a + b);

    fclose(fr);
    fclose(fw);

    getchar();
}
No a nakonec zkusíme ještě program na připojení textu. Takže to třeba přečte všechny čísla v a.txt, vynásobí je dvěma a připojí k b.txt :

void main()
{
    FILE *fr, *fw;
    int i;

    fr = fopen("a.txt", "r");
    fw = fopen("b.txt", "a"); // otevreme pro pripojeni (append)
    if(fr == NULL || fw == NULL) {
        printf("Soubor nejde otevrit !\n");

        if(fr != NULL)
            fclose(fr);
        if(fw != NULL)  // před koncem programu musíme
            fclose(fw); // uzavřít všechny soubory

        getchar();
        return;
    }

    while(!feof(fr)) {
        fscanf(fr, "%d", &i);
        fprintf(fw, "%d\n", i * 2);
    }

    fclose(fr);
    fclose(fw);

    getchar();
}
To by vám zatím mělo stačit pro pochopení základní práce se soubory. 1) Napište program, kopírující obsah souboru a.txt do b.txt 2) Zkuste napsat program, který spočítá mezery v souboru Text.txt 3) Napište program, který spočítá slova v souboru Text.txt 4) Pokuste se o program, který spočítá samohlásky v souboru Text.txt Mnno, snad to není tak složitý a pokud to nechápete, pište, pište ...
Zpátky