Lekce 2 - Typy souborů a správné umístění souborů v C++
V minulé lekci, Úvod do práce se soubory v jazyce C++, jsme si ukázali jak zapisovat do textových souborů v C++ a jak z nich číst. Zmínili jsme si rozdíl mezi formátovanými a neformátovanými operacemi a vytvořili ukázkové příklady.
V dnešním C++ tutoriálu se nejdříve podíváme na teoretická fakta o souborech. Dále si něco řekneme o právech pro zápis v operačních systémech Windows a Linux a jak se s nimi vypořádat.
Způsoby uložení dat
Všechny soubory v našem počítači jsou víceméně dvou typů a to buď textové nebo binární.
Textové soubory
Textové soubory si můžeme představit jako jednotlivé řádky textu a jsou lidsky čitelné v nějakém textovém editoru (např. v Poznámkovém bloku). Mohou být tzv. ploché nebo mohou mít vnitřní strukturu.
Ploché soubory (flat files)
Ploché textové soubory nemají žádnou výraznou vnitřní strukturu. Můžeme mezi ně zařadit např. dopis:
Drahá Brynn, opatruj se, Malcolm unikl a jistě si pro mne brzy přijde jako pro prvního. Musíš navést Brandona, dovést ho k amuletu, klíčem k zaříkávadlu by možná mohla být levandulová růže. Kallak
Nebo uložení osob telefonního seznamu tak, že každou osobu uložíme na samostatnou řádku a její vlastnosti oddělíme středníky. (Tomuto formátu říkáme CSV, což je zkratka z Comma Separated Values, hodnoty oddělené čárkou nebo středníkem):
Jan Novák;731589641 Karel Nový;728412656 Tomáš Marný;603482145
Pokud ukládáme nějaké nastavení, můžeme zvolit zápis podobný ini souborům:
velikost_pisma=10 hlasitost=15 barva=modra
Hierarchické soubory
Hierarchické soubory jsou textové soubory, které kromě samotných dat a oddělovačů obsahují nějaké pokročilejší formátování a dokáží uložené položky seskupovat do složitějších struktur. Klasickým příkladem souboru tohoto typu je např. XML, který je navíc samopopisný. C++ jako takové s těmito soubory pracovat neumí a sami bychom takovou knihovnu psali jen velmi těžko. Naštěstí existují již hotové knihovny pro práci s takovými soubory a tak máme práci značně ulehčenou. Ukažme si jen pro úplnost jak XML soubor vypadá:
<?xml version="1.0" encoding="UTF-8" ?> <uzivatele> <uzivatel vek="22"> <jmeno>Pavel Slavík</jmeno> <registrovan>21.3.2000</registrovan> </uzivatel> <uzivatel vek="22"> <jmeno>Jan Novák</jmeno> <registrovan>30.10.2012</registrovan> </uzivatel> </uzivatele>
Binární soubory
Data lze kromě do textové podoby uložit tzv. binárně. Jednoduše vezmeme tu část paměti RAM, kde je uložený uživatel (nebo cokoli jiného), a uložíme tyto jedničky a nuly úplně stejně na pevný disk. Takový soubor nebude lidsky vůbec čitelný a pokud ho otevřeme v textovém editoru, uvidíme jen náhodnou směs bajtů, kterou se nám editor zoufale pokusí zobrazit jako text, ale moc nám to nepomůže.
ŕétśKw?&·ßąÚŚXzý]wçuҦÂŕĄKÖu×u<'żř§FyíÚ&yě+óB÷qÍ÷{}ű8]ľńâ4YôŤĹľ ¶SúT@˝»úó&ŕ…7¨ď^iŻ˝>SVÔŰ=%sCúżz·:vç*Ó–ÉFÝvĐŰć۲xZIčőÍ»˙»{e‡ú9sĆ´”sĐÜĺ;ä5őÓ[îńŻëź~M=Żt?ů}€ż›8ŢĄ3ĘŐß«ĄK˝€óÖĎV-6kz:h] `bą˙ţűóŞlB?e"¨M7§L{ózeo:dţ.úĚôĽŰEŹÁőĆU°¶ËLŮiÍż]Ę|µ'î†ůË/S?._&íŹIű’éë&Ęŝ޳i d:Ŕţů9§ÉTňD¶H|·^cşÜűT“ĚR!đž5łĺˇ§–ĘĄ˘‚zŕ>Ë×ďSˇN/óźł™¶AÍŚÄ/–ĎĎË~\łŹ°Ňý‹˛D?rîGŻŻäµ®^çÉ…˛b«:ׯąŹ_ŘőÍ»˙&đΖéöv SiŰÍúű^yřĆäu5e§5˙vłJÝÇö€}Ë.›)łôĽż-KŐŰ‘aMOŁË/č•&EQEQă[ůʶmŕ›ę.-Őáb»ě2!ĐňFöJ§ąó'Đž'çČÔsUxŇuó*Ůă;ˇŃˇŕ¶A٫žWʍ€fěŮ!ŰĚÄéŰc&
Binární soubory mohou šetřit pamětí, jelikož např. číslo
1500
nemusíme ukládat jako 4 textové znaky (tedy 4 čísla), ale
jako jen jedno číslo. Na druhou stranu malá změna, např. přidání
vlastnosti k položce, způsobí, že starší soubory přestanou být
kompatibilní a soubor se musí konvertovat, což je poměrně
nepříjemné.
Práva k zápisu souboru
Následující pasáž se týká těch, kteří v C++ chtějí programovat aplikaci, která bude pracovat se soubory a kterou budou používat koncoví uživatelé na systému Windows nebo Linux. Pro akademické účely různých cvičebních programů a podobně ji můžete s klidem přeskočit. Začátečníkům možná zamotá hlavu, nic si z toho nedělejte.

Od Windows Vista existuje v systémech Windows tzv. UAC
(User Account Control).
Technologie zakazuje zápis na systémový oddíl disku (nejčastěji
C:\
) v případě, že zápis není povolen administrátorem nebo
že se nejedná o zápis do osobních složek uživatele. Toto opatření
samozřejmě naplnilo diskuzní fóra o programování a rozbilo řadu
aplikací. Důležité však je, že toto opatření je správné a
pouze zabraňuje špatně napsaným aplikacím měnit co se jim
zlíbí. Linuxové systémy mají podobná opatření již dlouhou
dobu.
Koncepce systému Windows zahrnuje uživatelské účty.
Každý uživatelský účet je realizován složkou (většinou
C:\users\jmeno_uzivatele\
). Tato složka obsahuje mimo jiné
dokumenty, pracovní plochu a také tzv. složku s daty aplikací. K této
složce se lze dostat při zadání klíče %appdata%
do cesty.
Zkuste si %appdata%
napsat do cesty průzkumníka a složku
otevřít. Uvidíte, že ve složce má své podsložky mnoho aplikací, které
máte nainstalovány. Právě zde je místo pro nastavení vašich
aplikací a další data. Vaše aplikace si zde samozřejmě vytvoří
složku se svým jménem a do té si bude vše ukládat. Nebudeme omezováni UAC
a zároveň bude naše aplikace umožňovat jiné nastavení pro různé
uživatele, aniž bychom to v C++ programovali. %appdata%
míří
vždy k appdata aktuálně přihlášeného uživatele.
Ačkoli si programy v C++ data často ukládají do složky s programem,
pokud je chceme dávat do rukou běžným uživatelům, je to chyba (i když
zrovna u jazyka C++, který je multiplatformní, by se dalo předpokládat, že
s touto složkou Windows pracovat nebude). Náš program např. na ploše bude
fungovat korektně, nicméně když se poté nainstaluje do složky
Program Files\
na disku C
, spadne s chybou při
zápisu na disk. Problém lze samozřejmě obejít tím, že aplikaci spustíme
jako správce, ale to je špatné řešení.
Obdobné postupy zavádí i Linux. Ten pro změnu ukládá data aplikace do
skrytých složek v domovském adresáři uživatele. Tím je opět dosaženo
toho, že aplikace může mít různé nastavení pro různé uživatele. Dále
může aplikace ukládat dočasné soubory do adresáře /tmp/
a
logy do adresáře /logs/
.
Jak je z výše popsaného patrné, řešení není zcela snadné. Budeme-li chtít do aplikace zapracovat logiku výběru správné cesty, stane se aplikace platformě závislá (tj. bude fungovat buď pro Windows nebo jen pro Linux). Situace se řeší podmíněnými překlady a externími knihovnami, protože standardní knihovna nemá k tomuto účelu definované funkce. Pro jednoduchost tohoto kurzu nebude brána problematika v potaz a všechny soubory budou ukládány do adresáře s aplikací.
Příště, v lekci Proudy v C++, se podíváme na slíbené proudy. Řekneme si, co to je, jak nám pomohou a jak s nimi pracovat.