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šší.

  1. /*------------------------------------------------*/
  2. /* c26/gets1.c                                    */
  3. #define _CRT_SECURE_NO_WARNINGS
  4. #include <stdio.h>
  5. #include <string.h>
  6.  
  7. int main(void)
  8. {
  9.     char text[80];
  10.     printf("Zadejte libovolny text: "); /* puts() by nam na konec vytisklo
  11.                                            znak noveho radku, a to nechci */
  12.     (void) gets(text);
  13.     puts(text);
  14.     printf("Zadejte libovolny text: ");
  15.     scanf("%s", text);
  16.     puts(text);
  17.  
  18.     return 0;
  19. }
  20.  
  21. /*------------------------------------------------*/
Visual Studio

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

FILE *fopen(const char *path, const char *mode);
Funkce fopen() otevře souborový proud.
FILE *freopen(const char *path, const char *mode, FILE *stream);
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 a stderr.
int remove(const char *pathname);
Funkce remove() smaže soubor pathname.
int rename(const char *oldpath, const char *newpath);
Funkce rename() přejmenuje soubor oldpath na soubor newpath.
int fileno(FILE *stream);
Funkce fileno() vrací deskriptor souboru datového proudu stream.
int fflush(FILE *stream);
Funkce fflush() slouží k vyprázdnění datového proudu stream. Vrací 0 v případě úspěchu, jinak EOF.
int fclose(FILE *stream);
Funkce fclose() uzavře (a vyprázdní) datový proud stream.

int feof(FILE *stream);
Funkce feof() vrací kladnou nenulovou hodnotu v případě dosažení konce souboru stream, jinak 0.
int ferror(FILE *stream);
Funkce ferror() v případě chyby souboru stream vrací kladnou nenulovou hodnotu, jinak 0.
void clearerr(FILE *stream);
Funkce clearerr() nuluje indikátor konce souboru a chyby pro souborový proud stream.

int fseek(FILE *stream, long offset, int whence);
Funkce fseek() posune kurzor v souboru stream na pozici vzdálenou offset od místa whence.
long ftell(FILE *stream);
Funkce ftell() vrátí aktuální pozici kurzoru souboru stream.
void rewind(FILE *stream);
Funkce rewind() posune kurzor na začátek souboru stream.
int fgetpos(FILE *stream, fpos_t *pos);
Funkce fgetpos() uloží aktuální pozici kurzoru do proměnné pos.
int fsetpos(FILE *stream, fpos_t *pos);
Funkce fsetpos() obnoví pozici kurzoru z proměnné pos.

int fgetc(FILE *stream);
Funkce fgetc() načte znak ze souborového proudu stream.
char *fgets(char *s, int size, FILE *stream);
Funkce fgets() načte řetězec délky size ze souborového proudu stream.
int getc(FILE *stream);
Funkce getc() načte znak ze souborového proudu stream.
Funkce getchar() načte a vrátí jeden znak ze standardního vstupu.
char *gets(char *s);
Funkce gets() načte ze standardního vstupu řetězec do textového pole s a vrátí ukazatel na toto pole.
int ungetc(int c, FILE *stream);
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.

int printf(const char *format, ...);
Funkce printf() slouží k formátovanému výstupu do stdout.
int fprintf(FILE *stream, const char *format, ...);
Funkce fprintf() slouží k formátovanému výstupu do souborového proudu stream.
int sprintf(char *str, const char *format, ...);
Funkce sprintf() zapíše formátovaný výstup do paměti, kam ukazuje str.
int snprintf(char *str, size_t size, const char *format,...);
Funkce snprintf() zapíše formátovaný výstup do paměti, kam ukazuje str, nejvýše size znaků.

int scanf(const char *format, ...);
Funkce scanf() čte data ze standardního vstupu.
int fscanf(FILE *stream, const char *format, ...);
Funkce fscanf() čte data ze souborového proudu stream.
int sscanf(const char *str, const char *format, ...);
Funkce sscanf() načítá formátovaný řetězec z paměti, kam ukazuje str.

int fputc(int c, FILE *stream);
fputc() tiskne znak c do souborového proud stream.
int fputs(const char *s1, FILE *stream);
fputs() tiskne řetězec s1 do souborového proudu stream.
int putc(int c, FILE *stream);
putc() tiskne znak c do souborového proud stream. Rozdíl mezi fputc() a putc() je zanedbatelný. Používejte fputc().
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).

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
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.
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
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.

Komentář Hlášení chyby
Created: 29.8.2003
Last updated: 24.6.2014
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..