Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.

Windows 7 zápisová práva UAC - Soubory a práce s nimi v C++

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.


 

Předchozí článek
Úvod do práce se soubory v jazyce C++
Všechny články v sekci
Soubory a práce s nimi v C++
Přeskočit článek
(nedoporučujeme)
Proudy v C++
Článek pro vás napsal Patrik Valkovič
Avatar
Uživatelské hodnocení:
11 hlasů
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity