| ← knihovna stdio.h | C/C++ | datové proudy → |
V této kapitole začneme systematický výklad funkcí z knihovny <stdio.h>. Její název je odvozen ze slov standard input output, neboli standardní vstup a výstup. V předchozí kapitole jste se mohli podívat na přehled funkcí deklarovaných v souboru <stdio.h>. V této kapitole si povíme něco málo nezbytné teorie a v dalších kapitolách se podíváme na praxi. Doposud jsme používali pouze vstup z klávesnice a výstup na monitor, ale už nastal čas naučit se pracovat se soubory :-).
O vstupu a výstupu jsme si povídali v souvislosti s funkcemi printf() a scanf(). Bylo by možná dobré, kdyby jste si oprášili pojmy jako stdin, stdout a stderr, nebo výrazy bloková a znaková zařízení. Funkce printf() a scanf() jsou typickými představiteli knihovny <stdio.h>. Spoustu z toho, co jste se v souvislosti s těmito funkcemi dozvěděli (např. o formátovacích řetězcích) využijete i v dalších funkcích. Nakonec si ještě dovolím připomenout makro EOF (End Of File), které se používá k indikaci konce souboru.
Standardní vstup a výstup se považují také za soubory (s drobnými rozdíly, například „skutečné“ soubory mají své jméno a jsou někde uloženy ...). Na rozdíl od ostatních souborů (např. textových, binárních a dalších speciálních souborů) jsou standardní vstup a výstupy otevřeny a programu přístupny automaticky při spuštění programu. Jak zajistit přístup k ostatním souborům, nebo jaký je rozdíl mezi textovými a binárními soubory se dozvíte při výkladu funkcí, které s těmito soubory pracují. Jelikož však už víte, co jsou to struktury, můžu vám ukázat deklarace standardního vstupu a výstupů:
| FILE *stdin; | Standardní vstup (typicky klávesnice) |
|---|---|
| FILE *stdout; | Standardní výstup (typicky obrazovka) |
| FILE *stderr; | Standardní chybový výstup (typicky obrazovka) |
Jedná se tedy o ukazatele na strukturu FILE. Ta je deklarovaná v souboru <stdio.h> a slouží k práci se soubory. Jak tato struktura vypadá není důležité. Zmiňuji se o ní v této chvíli proto, protože struktura FILE je argumentem spousty funkcí ze souboru <stdio.h>.
Existují dva základní způsoby jazyka C, jak přistupovat k souborům. Buďto pomocí souborového proudu, nebo pomocí přímého volání.
Knihovna <stdio.h> deklaruje přístup pomocí souborového proudu. Tento způsob přístupu k souborům je definován normou ANSI jazyka C (a také normou POSIX). K souborovému proudu se přistupuje pomocí struktury FILE. Díky normě ANSI máte jistotu, že používané funkce budou podporovány všemi („dobrými“) překladači. Díky tomu je převážně používán tento způsob práce se soubory. Tímto způsobem přístupu k souborům se budeme zabývat nejdříve.
Přímé volání má přímou vazbu na systém. Tím je zaručena maximální rychlost přístupu k souborům, ale také implementační závislost. Pro funkce pracující s přímím voláním je potřeba použít knihovny <io.h>, <sys/stat.h> a <fcntl.h>. K souboru se nepřistupuje pomocí struktury FILE, ale pomocí manipulačního čísla tzv. deskriptoru souboru. Jedná se o datový typ int. Přímé volání není součástí normy ASCII, ale je definována normou POSIX.
Existuje ještě jedno dělení přístupu k souborům a to na textový a binární přístup. Textový soubor je takový soubor, ve kterém je uložen pouze text. Toto překvapivé zjištění umožňuje zjednodušit některé souborové operace a zlepšit tak přenositelnost mezi různými operačními systémy. Problém textových souborů spočívá ve znaku '\n'. Je to označení konce řádku. V DOSu je konec řádku dán dvěma bajty 13 a 10, zatímco v Linuxu pouze jedním (10). V jiných systémech je to pro změnu 10 a 13 (v tomto pořadí). Při textovém přístupu k souboru můžete načítat a zapisovat textové řetězce. Přitom se nemusíte starat o to, jakým způsobem je znak '\n' interpretován. Nový řádek je vnitřně reprezentován jedním znakem, který je vždy roven '\n' (při čtení/zápisu souboru dochází k automatické konverzi).
Při binárním přístupu k souboru čtete i zapisujete data bajt po bajtu. V takovém případě, pokud chcete zapsat textový soubor, musíte zapsat znak '\n' v závislosti na tom, v jakém OS jej budete chtít číst. Při binárním přístupu máte tedy větší kontrolu nad zpracovávanými daty, ale práce s takovými soubory může být o něco náročnější.
V souboru <stdio.h> najdete makra FOPEN_MAX a FILENAME_MAX.
FOPEN_MAX udává maximální počet otevřených souborů. Maximum otevřených souborů omezuje operační systém, mnohdy podle aktuální konfigurace systému.
FILENAME_MAX udává maximální délku jména souboru. V systému MS-DOS je známé omezení 8+3, tj. 8 znaků, tečka a tři znaky (přípona).
Chcete-li, aby vaše programy byli maximálně přenositelné, využívejte těchto maker.
| ← knihovna stdio.h | C/C++ | datové proudy → |
