Knihovna stdio.h
Knihovna <stdio.h> obsahuje opravdu hodně užitečných funkcí. Ty nejdůležitější funkce již znáte (scanf(), printf(), sprintf()…). Spousta dalších funkcí je určena pro práci se soubory a budu je postupně probírat v dalších kapitolách. Zde se zaměřím na některé jednoduché funkce pro práci se standardním vstupem a výstupem a uvedu stručný přehled funkcí, které v souboru <stdio.h> jsou.
Funkce getchar(), gets(), putchar() a puts()
Definice funkcí getchar()
, gets()
,
putchar()
, a
puts()
najdete o pár řádků níže,
proto je nebudu tady opisovat. Podívejte se na ně (teď hned!).
Funkce getchar()
načte ze
standardního vstupu jeden znak a vrátí jej jako typ int. V případě chyby
vrací speciální hodnotu EOF (v případě
uzavřeného/chybného standardního vstupu). Protože vrací typ int a
nikoliv typ char, je často třeba tuto hodnotu
přetypovat.
S touto funkcí jste se již setkali v kapitole, která popisovala
konstrukci switch.
Funkce gets()
načte ze standardního vstupu řetězec do
textového pole a vrátí ukazatel na toto pole. Načítá znaky, dokud
nenarazí na konec řádku ('\0'
) nebo EOF.
Tato funkce může překročit velikost pole paměti, do které řetězec ukládá a
způsobit tak havárii programu! Návratovou hodnotou je ukazatel na paměť, kam
řetězec ukládá (tedy návratová hodnota je rovna argumentu funkce).
Místo funkce gets()
raději používejte funkci
fgets() (proberu jí později, nebojte).
Vyhnete se tak problémům s překročením velikosti paměti. Funkce
gets()
je dnes navíc označená jako deprecated (zastaralá).
Funkce putchar()
vytiskne
jeden znak (jenž je argumentem
funkce) do standardního výstupu. Vrací zapsaný znak (tedy to samé
jako je argument), nebo EOF v případě chyby.
A konečně funkce puts()
vytiskne řetězec, jenž je jejím argumentem, do standardního výstupu.
V případě úspěchu vrací nezáporné číslo, jinak EOF. Funkce puts()
vytiskne po
řetězci ještě znak '\n'
(nová řádka).
Používáním těchto funkcí značně zoptimalizujete svůj kód. Proto,
kde můžete, tam se složitým funkcím typu
printf()
a scanf()
vyhýbejte a
místo nich používejte tyto jednodušší.
- /*------------------------------------------------*/
- /* c26/gets1.c */
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <string.h>
- {
- znak noveho radku, a to nechci */
- }
- /*------------------------------------------------*/
Makro _CRT_SECURE_NO_WARNINGS
je tu kvůli funkcím scanf()
a gets()
,
viz scanf().
Nedivte se, pokud by vás překladač fackoval za použití funkce
gets()
,
je to skutečně kvůli její nebezpečnosti. Ovšem v tomto příkladě
není ani bezpečné použití funkce scanf()
, protože nijak neomezujeme
maximální možnou délku načítaného řetězce.
U funkce scanf() to však
jde zařídit (narozdíl od gets()
).
Výstup z programu může být následující:
Zadejte libovolny text: Mam 25000 Euro. Mam 25000 Euro. Zadejte libovolny text: Mam 25000 Euro. Mam
Jak vidíte, zatímco funkce gets()
načte
řetězec až do znaku nového řádku, funkce scanf()
načítá řetězec k prvnímu „bílému znaku“ (mezera, tabulátor, nový řádek).
Výčet funkcí ze stdio.h
- Funkce fopen() otevře souborový proud.
- Otevře soubor se jménem path a přesměruje do něj souborový proud stream. Používá se pro
přesměrování standardního vstupu
stdio
, nebo výstupůstdout
astderr
. - Funkce remove() smaže soubor pathname.
- Funkce rename() přejmenuje soubor oldpath na soubor newpath.
- Funkce fileno() vrací deskriptor souboru datového proudu stream.
- Funkce fflush() slouží k vyprázdnění datového proudu stream. Vrací 0 v případě úspěchu, jinak EOF.
- Funkce fclose() uzavře (a vyprázdní) datový proud stream.
- Funkce feof() vrací kladnou nenulovou hodnotu v případě dosažení konce souboru stream, jinak 0.
- Funkce ferror() v případě chyby souboru stream vrací kladnou nenulovou hodnotu, jinak 0.
- Funkce clearerr() nuluje indikátor konce souboru a chyby pro souborový proud stream.
- Funkce fseek() posune kurzor v souboru stream na pozici vzdálenou offset od místa whence.
- Funkce ftell() vrátí aktuální pozici kurzoru souboru stream.
- Funkce rewind() posune kurzor na začátek souboru stream.
- Funkce fgetpos() uloží aktuální pozici kurzoru do proměnné pos.
- Funkce fsetpos() obnoví pozici kurzoru z proměnné pos.
- Funkce fgetc() načte znak ze souborového proudu stream.
- Funkce fgets() načte řetězec délky size ze souborového proudu stream.
- Funkce getc() načte znak ze souborového proudu stream.
- Funkce getchar() načte a vrátí jeden znak ze standardního vstupu.
- Funkce gets() načte ze standardního vstupu řetězec do textového pole s a vrátí ukazatel na toto pole.
- Vrátí znak c do proudu stream, je-li to možné. Více jak jedno vrácení znaku, před dalším čtením proudu, není garantováno. V případě úspěchu vrací znak c, jinak EOF.
- Funkce printf() slouží k formátovanému výstupu do
stdout
. - Funkce fprintf() slouží k formátovanému výstupu do souborového proudu stream.
- Funkce sprintf() zapíše formátovaný výstup do paměti, kam ukazuje str.
- Funkce snprintf() zapíše formátovaný výstup do paměti, kam ukazuje str, nejvýše size znaků.
- Funkce scanf() čte data ze standardního vstupu.
- Funkce fscanf() čte data ze souborového proudu stream.
- Funkce sscanf() načítá formátovaný řetězec z paměti, kam ukazuje str.
- fputc() tiskne znak c do souborového proud stream.
- fputs() tiskne řetězec s1 do souborového proudu stream.
- putc() tiskne znak c do
souborového proud stream. Rozdíl mezi
fputc()
aputc()
je zanedbatelný. Používejtefputc()
. - Funkce putchar() vytiskne znak c do standardního výstupu.
- Funkce puts() vytiskne řetězec s1 a
po něm ještě znak
'\n'
(nová řádka).
- Funkce fread() načte nmemb dat o velikosti size ze souboru stream do paměti kam ukazuje ptr. Návratovou hodnotou je počet správně načtených položek.
- Funkce fwrite() zapíše nmemb dat o velikosti size do souboru stream z paměti kam ukazuje ptr. Návratovou hodnotou je počet správně zapsaných položek.
- Funkce perror() vypíše chybové hlášení na základě proměnné errno za řetězec s1 a dvojtečku, nebo jen chybové hlášení, pokud má s1 hodnotu NULL.
A jako vždy, nejedná se o úplný výčet obsahu <stdio.h>, pár dalších funkcí a maker si určitě můžete dohledat v dokumentaci.