Cílem tohoto článku je seznámení čtenářů se základní prací zápisu a čtení dat souboru, dále smazání a zjištění, zda soubor existuje.
Jednotlivé kroky si nejprve ukážeme a následně popíšeme.
 

 

Co je potřeba?

  • V první řadě je potřebná alespoň základní znalost programovaní v jazyce C/C++.
  • Vhodný kompilátor (nejlépe vývojové prostředí MS Visual Studio).
  • Knihovny: windows.h  stdio.h.

 

Vytvoření a zápis do souboru

FILE *soubor = fopen( "soubor.txt", "wb" );
if( soubor == NULL ) return 0;

Prvním argumentem funkce fopen() je adresa s názvem souboru. Pokud není zadána adresa a jedná se o samostatný název (jako v našem případě), pak se se souborem pracuje na výchozí adrese spuštěné aplikace.

Druhý argument označuje, zda-li chceme soubor připravit pro zápis [w]čtení [r] nebo zápis na konec souboru [a]. Znak "w" - write a "b" - byte tedy znamená, že se do souboru chystáme zapisovat byty. V případě že soubor existuje, automaticky se, při připravení k zápisu, jeho obsah vymaže. V opačném případě dojde k jeho vytvoření.

Po úspěšném připravení souboru k naší akci (zápisu), funkce vrátí a uloží adresu do ukazatele soubor. Pokud se nepodaří soubor připravit, ukazatel bude v hodnotě NULL a podmínka nám v tomto případě zajistí ukončení další práce.

fwrite( "Hello World!", 1, 13, soubor );
fclose( soubor );

Funkce fwrite() nám zajistí zápis dat do souboru.

První argument je ono datové pole, muže jím být i samotný ukazatel paměti.
Druhý argument určuje velikost elementu. Jeho využití si ukážeme níže.
Třetí argument určuje délku dat v bytech. V našem případě jde o počet znaků "Hello World" + zakončovací nulový znak.

A po dokončení zápisu samozřejmě soubor uzavřeme funkcí fclose().

 

Čtení ze souboru

FILE *soubor = fopen( "soubor.txt", "rb" );
if( soubor == NULL ) return 0;

Vše funguje obdobně jako u zápisu, jen je zde zapsán druhý argument "rb" - read byte. V případě, že soubor neexistuje, funkce fopen() nám vrátí do ukazatele hodnotu NULL, kde jsme opět situaci ošetřili podmínkou.

char pole[13];
fread( pole, 1, 13, soubor );
fclose( soubor );

Před čtením je nutné vytvořit pole, do kterého později uložíme přečtená data (viz. řádek 3). 

Funkce fread() funguje opět podobně jako fwrite(), jen s tím rozdílem, že namísto čtení z pole, bude do pole zapisovat přečtená data. Funkce vrací počet přečtených bytů a v případě, že je v souboru méně než 13 bytů, vrátí nám tedy tolik kolik bylo možné přečíst.

Nakonec soubor uzavřeme.

 

Smazání souboru

remove( "soubor.txt" );

Tato funkce zajistí smazání souboru a pokud akce neproběhla úspěšně, vrátí nám nulu.

 

Dynamické čtení dat ze souboru

FILE *soubor = fopen( "soubor.txt", "rb" );
fseek( soubor, 0, SEEK_END );

Pomocí funkce fseek() posuneme pozici čtení ze souboru na uplný konec souboru. To zajistí poslední argument SEEK_END. Druhý argument v tuto chvíli zanedbáváme.

int pozice = ftell( soubor );
fseek( soubor, 0, SEEK_SET );

Funkce ftell() nám vrátí pozici čtení. Momentálně se nachází na konci souboru, tudíž díky ni zjistíme celkovou velikost souboru v bytech. Tuto hodnotu uložíme do proměnné pozice, kterou dále použijeme pro vytvoření pole.

fseek() s argumentem SEEK_SET nastaví čtení souboru na pozici danou jejím druhým argumentem. V tuto chvíli je to 0, tedy úplný začátek souboru.
V případě, že zvolíme jinou hodnotu, následná funkce fread() bude od tohoto místa číst.

char *data = new char[velikost+1];
fread( data, 1, velikost, soubor );
data[velikost] = "\0";
printf( data );
delete[] data;
fclose( soubor );

Nyní je zapotřebí vytvořit pole pomocí operandu new typ_promenne[delka_pole]. Vrátí nám adresu, kterou uložíme do ukazatele data. Pole se vytvoří tak veliké, jako je počet bytů v našem souboru a přidáme jeden byt navíc, pro vložení ukončovacího znaku.

Dále pomocí fread() přečteme všechny byty ze souboru a uložíme je do pole data. Opět necháváme velikost elementu na jedničče.

Po přečtení dat vložíme na konec pole již zmíněný ukončovací znak, který nám zajistí správné vypsání textu do konzole. Kdyby tento znak nebyl, příkaz printf() by nevěděl, kde se nachází konec textu.

Nakonec odstraníme naše vytvořené pole (line 9) a soubor uzavřeme.

 

Čtení a zápis více-elementové hodnoty

int cislo = 12345;
fwrite( &cislo, sizeof(cislo), 1, soubor );

Vytvoříme si 4-bytovou proměnnou typu int a nastavíme ji hodnotu, kterou chceme uložit do souboru.

U funkce fwrite() získáme ukazatel na úloženou proměnnou v paměti znaménkem & před názvem proměnné.

Dále získáme velikost proměnné, v bytech, operandem sizeof() a předáme ji jako velikost elementu. Jelikož integer zabere v paměti 4 byty, velikost elementu je také rovna 4.

A třetím argumentem je počet uložení tohoto elementu.

Stejný postup je i při čtení ze souboru, avšak musíme znát velikost jednotlivých elementů.

Přidat komentář

Bezpečnostní kód
Obnovit