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í.

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

Program byl vytvořen v roce 2015.

 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 59x (2.83 kB)
Aplikace je včetně zdrojových kódů v jazyce C

 

Všechny články v sekci
Zdrojákoviště jazyka C - Programování v Linuxu
Program pro vás napsal David Novák
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
Autor se zajímá především o nízkoúrovňové programování (C/C++, ASM) a návrh hardwaru (VHDL).
Aktivity