Jednoduchá C++ implementace programu tail

C++ Linux 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ženo 17x (2.76 kB)
Aplikace je včetně zdrojových kódů v jazyce C

 

  Aktivity (1)

Program pro vás napsal David Novák
Avatar
Autor v současné době studuje FIT VUT Brno a zajímá se především o nízkoúrovňové programování (C/C++, ASM) a návrh hardwaru (VHDL). Je zde také členem výzkumného týmu ANT@FIT (Accelerated Network Technologies).

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 



 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!