Jednoduchá C++ implementace programu tail
Tento program jsem vytvořil v rámci studia - zadání bylo napsat zjednodušený tail, který běžně najdeme v UNIXových systémech. Měl jsem vytvořit implementaci v C i v C++ (prý abychom si to trochu vyzkoušeli), ale zveřejním pouze C++ verzi, která zvládá neomezeně dlouhé řádky (implementace tohoto v C je nepoměrně pracnější). Zpracování argumentů je stejné pro obě verze (jednoduchá C "knihovna").
Co je to tail?
Nejdřív si povíme trochu teorie. Pokud nepoužíváte Linux nebo jiný UNIXový systém, dost možná jste o programu tail nikdy neslyšeli. V zásadě je to jednoduchý filtr (viz. můj článek o filtrech), který vypisuje na standardní výstup (stdout) posledních n řádek přečtených ze standardního vstupu (stdin) nebo souboru. GNU implementace umí různá kouzla (viz. manuálové stránky), což jsem já naštěstí dělat nemusel. Moje implementace umí jen vypisovat posledních n řádků a všechny řádky od řádku n.
Implementace
Vypisovat všechny řádky od řádku n je opravdu triviální - stačí mít jeden string jako buffer a počítat přečtené řádky. Jakmile narazíme na řádek n, je splněna podmínka a jednoduše s každou iterací vypíšeme obsah našeho bufferu na stdout.
Implementace výpisu posledních n řádků je trochu problémovější. Jelikož jde o filtr, program musí umět zpracovávat stream - nevíme tedy dopředu, kolik řádků bude. Musíme mít tedy uložných vždy posledních n řádků a jakmile narazíme na konec (souboru nebo streamu), obsah tohoto bufferu vypíšeme (ve stejném pořadí, jako jsme jej přečetli samozřejmě). Já to vyřešil pomocí queue<string> - fronty stringů.
Fronta
Pokud by jste někdo náhodou nevěděl, tak fronta je paměť, do které můžeme zapisovat pouze na konec a číst pouze ze začátku. Dobře vystihující je anglická zkratka FIFO - First In, First Out. Popisuje chování fronty (které opravdu funguje stejně, jako fronta v obchodě) - kdo první přijde, první odejde.
Závěr
Nápověda k použití je přímo v programu a dostanete se k ní pomocí přepínače -h, respektive --help. Pro překlad je přiložen Makefile.
$ ./tail --help
Na závěr bych ještě podotknul, že o C++ nemám zatím prakticky žádné
teoretické znalosti, takže jsem nejspíš některé věci řešil zbytečně
složitě (pomocí knihovny C) a šlo by to lépe. Za jakékoliv připomínky,
korekce a návrhy budu samozřejmě rád.
Galerie

Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 62x (2.83 kB)
Aplikace je včetně zdrojových kódů v jazyce C