Začínáme programovat v jazyce C (7. díl)

Vítejte u posledního dílu seriálu o programování v jazyce C. Dnes si budeme povídat o řetězcích, odvozených datových typech a o práci se soubory.

Řetězce

V jazyce C ještě není definován datový typ řetězec. Namísto řetězce je využíváno pole znaků, které je zakončené nulovým znakem “. Kvůli ukončení nulovým znakem musíme velikost pole (řetězce) definovat o jeden byte větší.

char id_retezec[velikost];

Inicializovat můžeme takto:

char id_retezec[] = {'a' 'b' ''};
char id_retezec[] = "zdravim";

Načtení a výpis řetězce můžeme provádět pomocí nám již známých příkazů scanf() a printf(), ale také pomocí příkazů které jsou pro řetězce přímo určené – pro čtení gets() a pro výpis puts(). Funkce gets se od funkce scanf() liší ve způsobu načítání. scanf() načítá pouze po první výskyt bílého znaku, gets() načítá vše co zapisujeme.

Na závěr dodám, že práce s řetězcem je shodná s prací s polem.

Funkce pro práci s řetězci

strcpy() slouží pro překopírování. Cíl musí mít dostatečnou velikost.

strcpy(zdroj, cil);

strcat() slouží pro připojení obsahu zdroje k obsahu cíle. Cíl musí mít dostatečnou velikost.

strcat(zdroj, cil);

strcmp() slouží k porovnávání dvou řetězců. Jsou li řetězce shodné, vrací funkce 0, je-li první větší, vrací 1 a je li první menší a druhý větší, tak navrací -1.

strcmp(retezec_1, retezec2);

strlen() slouží k vracení délky řetězce ve znacích. Do řetězce se nezapočítává nulový znak.

strlen(retezec);

Nyní se podíváme na odvozené datové typy.

Odvozeným datovým typem je struktura.

Struktura je strukturovaný, heterogenní datový typ – může obsahovat různé prvky různých datových typů., Definuje se pomocí klíčového slova struct.

struct jméno_typu {
typ prvek1;
typ prvek2;
 . . .
typ prvekn;
} seznam_promennych;

Položka jmeno_typu je jméno nového typu, který je představován touto strukturou a seznam_promennych deklaruje konktretní proměnné tohoto typu. Pro přístup k prvkům používáme selektoru tečka, Tečku umístíme mezi identifikátory proměnné typu struktura a položky, s kterou chceme pracovat.

id_struktura.prvek;

Dále existují další odvozené datové typy, které se často nevyužívají a proto se jimi nebude více zabývat. Jedná se o tyto typy: unie a výčtové typy.

A nakonec se podíváme asi na nejdůležitější kapitolu a to na soubory. Soubor může poskytovat nebo přijímat data. V C existují dva typy souborů a to textový (většinou s koncovkou txt) a binární (koncovka dat nebo bin). Rozdíl mezi těmito soubory je v tom, že do binárního souborů jsou data ukládána stejným způsobem jako v paměti počítače (pro nás nečitelné), kdežto v textovém souboru jsou ukládány pro nás v čitelné podobě a lze je upravovat v textovém editoru.

V hlavičkovém souboru stdio.h je pro práci se soubory zaveden datový typ FILE.

FILE *id_souboru

Před tím, než budeme se souborem chtít pracovat, musíme ho nejdřív otevřít. To provedeme pomocí funkce fopen(), která vrací ukazatel na daný soubor. Je-li tato funkce neúspěšná, vrací NULL.

id_soubor = fopen("jmeno_souboru.pripona", "rezim");

Pro textové soubory existují tyto režimy:

  • r otevře soubor pro čtení
  • w otevře soubor pro zápis
  • a otevře soubor pro připisování
  • r+ otevře soubor pro čtení/zápis
  • w+ otevře soubor pro čtení/zápis
  • a+ otevře soubor pro čtení/připisování

Pro binární soubory existují tyto režimy:

  • rb otevře soubor pro čtení
  • wb otevře soubor pro zápis
  • ab otevře soubor pro připisování
  • rb+ otevře soubor pro čtení/zápis
  • wb+ otevře soubor pro čtení/zápis
  • ab+ otevře soubor pro čtení/přípisování

Pokud soubor neexistuje, tak v režimech, kdy lze zapisovat se vytvoří, jen v režimech, kdy dochází pouze ke čtení otevření souboru selže.

Po ukončení práce se souborem a jeho uzavření existuje funkce fclose().

fclose("soubor");

Při úspěchu vrací 0, při neúspěchu konstantu EOF.

Funkce pro práci se soubory

rename() slouží pro přejmenování souboru.

rename("stare_jmeno", "nove_jmeno");

Při úspěchu vrací 0, při neúspěchu nenulovou hodnotu.

remove() slouží k smazání daného souboru. Při úspěchu vrací 0, při chybě nenulovou hodnotu.

remove("jmeno_souboru");

rewind() pro přesun aktuální pozice na začátek. Funkce je bez návratové hodnoty.

rewind(id_soubor);

feof() pro zjištění konce souborů. Je-li aktuální pozice na konci vrací nenulovou hodnotu. V opačném případě vrací 0.

feof(id_souboru);

Vstup a výstup znaků

Pro souborový vstup/výstup znaků se užívá funkcí getc() a putc().

To by bylo ode mě vše, doufám, že se vám seriál líbil. Jakékoliv dotazy rád zodpovím pod článkem v komentářích.



O Martin Pitřík

Zajímám se o jazyk C, C++ a C#. V současné době stojím za vznikem projektu ElMetr, který si klade za cíl vytvořit program pro elektroniku zcela zdarma.