5. díl - Manipulace se soubory a práce s errory

C++ Práce se soubory Manipulace se soubory a práce s errory

Zatím jsme si řekli pouze o jedné operaci - otevření souboru. Dnes se podíváme na další módy, se kterými lze soubor otevřít. Také si řekneme, jak pracovat s errory, jestliže nějaká operace selže.

Další módy fopen

Ve druhém článku jsme si řekli o třech módech: pro čtení (r), pro zápis (w) a pro přidání na konec souboru (a). Funkce fopen může přijímat ještě další módy, které jsou shrnuty v tabulce.

mód popis
"r" Read - Otevře soubor pro čtení. Soubor musí existovat.
"w" Write - Otevře soubor pro zápis. Pokud soubor neexistuje, tak jej vytvoří. Jestliže soubor již existuje, je všechen jeho obsah smazán a soubor bude prázdný.
"a" Append - Otevře soubor pro zápis od konce souboru. Dosavadní obsah souboru zůstává zachován a další zápisy se připisují na konec souboru. Pokud soubor neexistuje, tak je vytvořen. Operace fseek je v tomto stavu ignorována.
"r+" Read/Update - Soubor je otevřen pro zápis i pro editování. Soubor musí existovat.
"w+" Write/Update - Soubor je otevřen pro zápis i pro editaci. Pokud soubor neexistuje, bude vytvořen. Pokud soubor existuje, bude jeho obsah ztracen. Oproti "w" můžeme tedy přečíst, co jsme již napsali.
"a+" Append/Update - Otevře soubor pro zápis i pro editaci. Pokud soubor neexistuje, bude vytvořen. Operace fseek přesouvá ukazatel pro čtení, ale veškeré operace zápisu se umístí na konec souboru

Kromě toho jsme si ve třetím díle řekli o binárních souborech a módu "b". Ten lze aplikovat k libovolnému módu a soubor poté bude brán jako binární.

Smazání a přejmenování souboru

Jak je vidět z tabulky, vytvoření souboru nám obstarává fopen. Pro přejmenování souboru máme funkci rename, která přijímá dva parametry. Prvním parametrem je starý název souboru, zatímco druhým parametrem je nový název. Pokud je soubor úspěšně přejmenován, funkce vrací 0. Při výskytu erroru je návratová hodnota nenulová.

Pro smazání souboru máme funkci remove. Jejím jediným parametrem je název souboru. Jako u všech funkcí, návratová hodnota je 0 při úspěchu, nenulová hodnota při neúspěchu.

int main(int argc, char** argv)
{
    FILE* soubor;

    if ((soubor = fopen("soubor.txt", "r"))== 0)
        printf("Soubor se nepodarilo otevrit pro cteni\n");
    if ((soubor = fopen("soubor.txt", "w")) != 0)
        printf("Soubor se podarilo otevrit pro zapis\n");
    if (fprintf(soubor, "Hello World") != 0)
        printf("Zapis do souboru se zdaril\n");
    if (fclose(soubor) == 0)
        printf("Zavreni souboru se zdarilo\n");
    if ((soubor = fopen("soubor.txt", "r")) != 0)
    {
        printf("Operatovny pokus o otevreni pro cteni se zdaril\n");
        fclose(soubor);
    }

    if (rename("soubor.txt", "data.txt") == 0)
        printf("Prejmenovani souboru se zdrailo\n");
    if ((soubor = fopen("soubor.txt", "r")) == 0)
        printf("soubor.txt se nepodarilo otevrit pro cteni\n");
    if ((soubor = fopen("data.txt", "r")) != 0)
    {
        printf("data.txt se podarilo otevrit pro cteni\n");
        fclose(soubor);
    }
    if(remove("data.txt")==0)
        printf("Smazani data.txt se zdarilo\n");
    if ((soubor = fopen("soubor.txt", "r")) == 0)
        printf("soubor.txt se nepodarilo otevrit pro cteni\n");
    if ((soubor = fopen("data.txt", "r")) == 0)
        printf("data.txt se nepodarilo otevrit pro cteni\n");


    return (EXIT_SUCCESS);
}

Všimněte si různých návratových hodnot pro jednotlivé funkce. Pokud si nejste jisti, co funkce vrací, je potřeba se podívat do dokumentace. Výstup z programu můžeme vidět zde:

Manipulace se soubory v C

Práce s errory

Když narazíme na problém, měli bychom alespoň uživatele informovat o tom, jaká chyba nastala. Ne vždy to ale víme. V jednom případě soubor nemusí existovat a ve druhém k němu nemusíme mít dostatečná oprávnění. Funkce nám sice vrátí nenulovou hodnotu, která udává kód chyby, ale prosté číslo dekódovat neumíme. Naštěstí má C i na tuto situaci připravené funkce, které nám pomohou.

Nejdůležitější je funkce perror. Ta přijímá jako parametr textový řetězec, který se vypíše současně s popisem chyby. Další funkcí je clearerr, která zruší chybové stavy pro soubor, který dostane jako parametr. Například když čtení narazí na konec souboru, nastaví se pro soubor speciální příznak. Aby mohl být soubor opět čten, musí být příznak zrušen. právě tuto operaci provádí clearerr. Jak tyto funkce fungují budu opět demonstrovat na jednoduchém příkladu.

int main(int argc, char** argv)
{
    int data[16];
    FILE* soubor;

    if ((soubor = fopen("nejaky_soubor.txt", "r")) == 0)
        perror("Nepodarilo se otevrit soubor");
    soubor = fopen("nejaky_soubor.txt", "w");
    if (fread(data, sizeof (int), 16, soubor) == 0)
        perror("Zapis se nepodaril");
    remove("nejaky_soubor.txt");

    return (EXIT_SUCCESS);
}

Nejprve otevřeme soubor pro čtení. Na začátku jsme si řekli, že soubor musí existovat, takže otevření souboru se nepovede a operace skončí s chybou, kterou vypíšeme. Poté otevřeme soubor pro zápis a zkusíme z něj něco přečíst. Taková operace opět skončí s chybou. Pro ukázku příkládám výstup:

Práce s errory v C

Konec souboru

Ve velké většině případů chceme přečíst soubor až do jeho konce. Jak ale zjistíme, že jsme na konci souboru? Metod je několik a nyní si o nich povíme.

První způsobem je použít funkci feof, která přijímá jako parametr ukazatel na FILE. Vrátí-li funkce nenulovou hodnotu, potom jsme se při čtení souboru dostali na jeho konec, ve zbytku případů vrací 0.

Dále většina funkcí, které něco čtou (jako fscanf, fgets a další) vrací hodnotu EOF, pokud dosáhli konce souboru. Některé funkce (například fgetc) mohou vracet EOF pouze jako indikování erroru, proto doporučuji prostudovat dokumentaci. EOF je makro definované v knihovně stdio.h.

Pro představu opět přikládám ukázkový program i s výpisem.

int main(int argc, char** argv)
{
    char buffer[128];
    FILE* soubor =  fopen("soubor.txt","w");
    fprintf(soubor, "Hello World");
    fclose(soubor);
    soubor = fopen("soubor.txt","r");

    while(fscanf(soubor,"%s",buffer)!=EOF);
    printf("Scanf precetlo do konce souboru\n");

    rewind(soubor);
    while(fgetc(soubor)!=EOF);
    if(feof(soubor))
        printf("Fgetc precetlo do konce souboru\n");

    rewind(soubor);
    fgets(buffer,128,soubor);
    if(feof(soubor))
        printf("Fgets precetlo do konce souboru\n");

    return (EXIT_SUCCESS);
}
Práce s koncem souboru v C

Tím jsme probrali všechny funkce, které C pro práci se soubory má a tato série je tímto uzavřena. Pokud byste něčemu nerozuměli, můžete mě kontaktovat do zpráv nebo do komentářů pod článek. Přeji hodně úspěchů při programování v C.


 

Stáhnout

Staženo 2x (104.24 kB)
Aplikace je včetně zdrojových kódů v jazyce C

 

  Aktivity (2)

Článek pro vás napsal patrik.valkovic
Avatar
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 



 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!