Práce se soubory  (2015)

 

Zadání:

Vytiskněte statistiku výskytu bajtů (znaků) v souboru. Název zpracovávaného souboru je dán na příkazové řádce při spuštění programu. Tisk statistiky proveďte na konzolu ve formátu: první řádek obsahuje celkový počet bajtů/znaků (délka souboru); další řádky obsahují: hodnota bajtu/znaku dekadicky; hodnota bajtu/znaku hexa; vlastní znak (je-li „tištitelný“ - funce isxxx (isalpha, isnumber, is...)) jinak mezera, počet výskytů bajtu s touto hodnotou v souboru; procentní zastoupení v souboru. Ošetřete případ, kdy je soubor prázdný.

Tisk statistiky proveďte v pořadí podle hodnoty znaku a následně seřazený sestupně podle četnosti znaku. Pro setřídění použijte metodu, kdy se nebude třídit původní pole, ale (druhé) pole obsahující indexy (odkazy na původní pole).

Výstup programu by měl být v tomto tvaru:

14561
0; 0x0; ; 134; 1.2%
1; 0x1; ; 268; 2.4%



Pozn.: Ve cvičeních se snažte vyřešit co nejvíce, zbytek dodělejte za DU (příště budete potřebovat).



Doporučené řešení:

  1. Vytvořte nový projekt – prázdnou konzolovou aplikaci

  2. Vytvořte soubory projektu – main01.c (ve kterém bude funkce main), funkce01.c (ve kterém budou funkce zpracovávající soubor a provádějící tisk), funkce01.h (ošetřený hlavičkový soubor umožňující volání funkcí ze souboru funkce.c)
    Do pracovního adresáře nakopírujte soubor pro vyhodnocení statistiky (v případě spouštění z MSVC je to adresář kde jsou .c a .h soubory. V případě spouštění .exe souboru je to adresář, ve kterém se vyskytuje tento .exe soubor).
    Předpřipravené testovací soubory.

  3. Napište funkci main, vytiskněte parametry argc a zadané (naplněné, smysluplné) parametry argv (nezapomeňte načíst/includovat hlavičkový soubor pro funkci tisku printf)

  4. V prostředí MSVC nastavte parametr argument na název načítaného souboru

  5. Ve funkci main proveďte test přítomnosti parametru názvu souboru na příkazové řádce (tj. musí být přítomny dva parametry) – není-li druhý parametr přítomen, vytiskněte hlášení s popisem chybového stavu a program ukončete s návratovou hodnotou 1. Pro ukončení bez chyby použijte návratovou hodnotu 0.

  6. Otevřete soubor, ošetřete chybové stavy
    Pokuste se otevřít soubor – pokud se soubor nepodaří otevřít (pro čtení, v binárním módu), vypište chybový text a ukončete program s návratovou hodnotu 2. Uvědomte si, že otevřené soubory je nutné zavřít v případě, že už je nepotřebujeme. Na konci funkce main tedy soubor zavřete. V případě, že se to nepodaří, vytiskněte popis chyby a vraťte návratovou hodnotu 3.

  7. V souboru funkce.c napište hlavičky/prototypu pro tři funkce (tj. funkce se zatím prázdným tělem):
    - statistika: funkce bude mít jako parametr otevřený soubor a vrátí kód chyby (pokud k chybě nedošlo vrátí hodnotu 0). Tato funkce vytvoří statistiku souboru, vytiskne ji (pomocí funkce tisk), následně zavolá funkci setrid, která setřídí prvky statistiky podle velikosti (pole statistiky zůstane nezměněné, setřídí se jen pole indexů). Následně funkce statistika tyto prvky opět vytiskne (pomocí stejné stejné funkce tisk).

    - tisk: funkce bude mít jako parametr pole statistiky znaků (jakého datového typu mohou být prvky tohoto pole bude-li obsahovat počty znaků?), a pole s indexy, které budou určovat pořadí setříděných znaků (pro neseřazené pole tedy bude pole indexů obsahovat 0,1,2...255; pro setříděné například 45, 12, … což znamená, že se nejdříve vytiskne znak s indexem 45, potom s indexem 12 …).

    - funkce setrid, která dostane dva parametry. První bude pole statistiky, druhé bude pole indexů. Tato funkce setřídí indexy tak, aby první index byl indexem prvku s největší četností ve statistice, druhý prvek obsahoval index druhého nejčastějšího (nebo stejně častého) prvku v souboru ...

  8. K souboru funkce.c vytvořte hlavičkový soubor (funkce.h) – ošetřete ho proti vícenásobnému načtení. Pomocí tohoto souboru zveřejněte funkci statistika ze souboru funkce.c.

  9. Z funkce main zavolejte funkci statistika, vyhodnoťte návratovou hodnotu – došlo-li k chybě vypište text chyby a vraťte návratovou hodnotu 4 (nezapomeňte, že máte pravděpodobně stále otevřený soubor!).

  10. Jako vstup použijte textový soubor, ve funkci statistika načítejte znaky souboru a v rámci ověření správnosti načítání hodnoty, kopírujte na konzolu (monitor). Pro test konce souboru použijte funkce feof.

  11. Při načítání znaků aktualizujte hodnoty v poli statistiky s názvem cetnost.

  12. Napište funkci tisk pro tisk pole statistiky.

  13. Napište funkci sestrid, která naplní pole indexů tak, aby indexy ukazovaly postupně na prvky od nejčetnějšího.

  14. „Zrušte“ tisk/kopii znaků při načítání a vyzkoušejte správnou funkci programu i pro binární soubor. (například jiný .exe).

  1. Uložte výsledky namísto tisku na konzolu do souboru. Název souboru bude dán jako další parametr na příkazovém řádku. V případě, že nebude přítomen, tiskněte výsledky na konzolu (uvědomte si, že konzola je také stream („otevřený soubor“) jako soubor – s názvem stdout, takže v tomto případě stačí předat místo otevřeného souboru parametr stdout). Nezapomeňte ošetřit chybové stavy spojené s otevřením a manipulací s dálším souboru. (Uvědomte si, že máte otevřeny dva soubory a že stdout se nezavírá).







Poslední úpravy 2015-09-21