Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Učíme se C (19. díl) - Práce se soubory I.
21. února 2001, 00.00 | V tomto článku si ukážeme jak pracovat v C se soubory. Jaké jsou módy otevření a funkce pro manipulaci se soubory..
Práce se soubory
V jazyce C je práce se soubory realizována pomocí tzv. datových proudů (streams), které si lze představit jako určitou konečnou posloupnost bytů, jako jsou například soubory. Datové proudy ale nemusí nutně představovat jenom soubory, ale mohou to být třeba data proudící sítí apod. Datovými proudy jsou například i standardní vstup a výstup. My se dnes ale budeme zabývat proudy souborovými.
Souborový proud je v C představován ukazatelem na strukturu FILE, ve které jsou uloženy nejrůznější informace o příslušném souboru, a tak můžeme tento proud definovat stejně jako jakýkoliv jiný ukazatel v C.
FILE *identifikátor;
Budeme-li chtít pro práci se souborem použít proměnnou f, definujeme ji tímto způsobem:
FILE *f;
Takto nadefinovaný pointer je ale samozřejmě neinicializovaný a pro přístup k souboru jej tedy ještě nelze použít. Pro jeho inicializaci použijeme funkci fopen().
Otevření souboru
FILE *fopen(char *filename, char *mode);
Funkce fopen() se pokusí otevřít soubor, jehož jméno jsme jí předali v řetězci filename. V případě, že se soubor podařilo otevřít, vrátí funkce příslušný ukazatel. Pokud se však soubor otevřít nepodařilo (například pokud nebyl nalezen), vrací hodnotu NULL. Protože možnost, že se soubor nepodaří otevřít, je velice reálná, neměli bychom zapomínat tuto skutečnost testovat. (viz. příklad o několik řádků dále)
Druhým parametrem - mode určujeme, v jakém módu bude soubor otevřen. I tento parametr je definován jako řetězec. Jednotlivé režimy otevření souboru určujeme pomocí kombinace několika znaků.
r | (read) | Soubor bude otevřen pro čtení. |
w | (write) | Soubor bude otevřen pro zápis. V případě, že otevíraný soubor již existuje, bude nejdřív zkrácen na nulovou délku. Pokud otevíraný soubor dosud neexistuje, vytvoří se nový. |
a | (append) | Stejně jako v předchozím případě bude soubor otevřen pro zápis. Pokud otevíraný soubor neexistuje, vytvoří se nový, ale jestliže soubor již existuje, nebude, narozdíl od módu w, nijak zkracován. |
Po otevření souboru se automaticky nastavuje pozice tzv. file-pointeru, tedy místa, ze kterého se bude číst, nebo kam se bude zapisovat. Pro módy r a w je file-pointer nastaven na začátek souboru a pro soubor otevřený v režimu append je nastaven na pozici za posledním bytem souboru. Mód append je tedy určen pro připojení nových dat k souboru.
Všechny tři režimy otevření souboru lze ještě doplnit o znaménko +. Pak bude soubor otevřen najednou pro čtení i zápis. Jinak se ale vlastnosti jednotlivých režimů nemění.
Znaménkem + jsme ale ještě nevyčerpali všechny možnosti jak soubor otevřít. V C totiž můžeme soubory otevírat buď jako textové, nebo jako binární. To určíme pomocí znaků b nebo t připojených k řetězci mode. Oba způsoby jsou skoro stejné, ale narozdíl od souborů, které byly otevřeny jako binární, pro soubory otevřené v textovém módu se při čtení i při zápisu provádí konverze oddělovače řádků. Je- li tedy, například v DOSu, oddělovačem řádků sekvence znaků '\13' a '\10', ze souboru se celá dvojice přečte jako znak '\n'. Naopak, pokud zapisujeme znak '\n', ve skutečnosti se zapíše celá kombinace '\13' a '\10'.
Př. Testování, zda byl soubor otevřen
|
Uzavření souboru
Přestaneme-li s otevřeným souborem pracovat, měli bychom ho, ačkoliv to není povinné, hned uzavřít. Počet najednou otevřených souborů je totiž omezen. Uzavření souboru provedeme voláním funkce fclose().
int fclose (FILE *file);
Podařilo-li se soubor uzavřít, vrací funkce hodnotu 0. Opačný případ, tedy že se soubor uzavřít nepodařilo, nastává nejčastěji, snažíme-li se uzavřít v dané chvíli neotevřený soubor. V takovém případě vrací funkce hodnotu EOF. Jiný důvod selhání prakticky nenastává, a proto se návratová hodnota funkce fclose() většinou ani netestuje.
Testování konce souboru
Testovat konec souboru se dá v zásadě dvěma způsoby. Buď kontrolou návratových hodnot čtecích funkcí (o kterých bude řeč v příštím díle), nebo použitím funkce feof(). První způsob se používá především pro čtení pomocí funkce getc(), která vrací hodnotu EOF, pokud bylo dosaženo konce souboru. Druhým způsobem, pomocí funkce feof(), můžeme stejnou skutečnost zjistit pro libovolnou operaci čtení. Pokud se poslední taková operace pokoušela číst již za koncem souboru, vrací funkce feof() pravdivou (nenulovou) hodnotu. V opačném případě vrací nulu.
int feof(FILE *file);
Obsah seriálu (více o seriálu):
- Učíme se C (1. díl)
- Učíme se C (2. díl)
- Učíme se C (3.díl)
- Učíme se C (4. díl)
- Učíme se C (5.díl)
- Učíme se C (6.díl)
- Učíme se C (7.díl)
- Učíme se C (8.díl)
- Učíme se C (9.díl) - Řetězce
- Učíme se C (10.díl) - Vstupně výstupní funkce
- Učíme se C (11.díl) - Formátovaný výstup
- Učíme se C (12.díl) - Formátový specifikátor
- Učíme se C (13.díl)
- Učíme se C (14.díl) - Vícerozměrná pole
- Učíme se C (15.díl) - Ukazatele
- Učíme se C (16.díl) - Modifikátory paměťové třídy
- Učíme se C (17.díl) - Pole a ukazatel
- Učíme se C (18. díl) - Dynamická alokace paměti
- Učíme se C (19. díl) - Práce se soubory I.
- Učíme se C (20. díl) - Práce se soubory II.
- Učíme se C (21. díl) - Parametry funkce main()
- Učíme se C (22. díl) - Ukazatele na funkce
- Učíme se C (23. díl) - Složité deklarace a definice
- Učíme se C (24. díl) - Funkce s proměnným počtem parametrů
- Učíme se C (25. díl) - Bitové operátory a bitové pole
- Učíme se C (26. díl) - Datové typy enum a union
- Učíme se C (27. díl - závěr) - Programové moduly
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007