Jednoduchá C ++ implementácie programu tail
Tento program som vytvoril v rámci štúdia - zadanie bolo napísať zjednodušený tail, ktorý bežne nájdeme v UNIXových systémoch. Mal som vytvoriť implementáciu v C aj v C ++ (vraj aby sme si to trochu vyskúšali), ale zverejním iba C ++ verziu, ktorá zvláda neobmedzene dlhé riadky (implementácia tohto v C je nepomerne pracnejšie). Spracovanie argumentov je rovnaké pre obe verzie (jednoduchá C "knižnica").
Čo je to tail?
Najskôr si povieme trochu teórie. Ak nepoužívate Linux alebo iný UNIXový systém, dosť možno ste o programe tail nikdy nepočuli. V zásade je to jednoduchý filter (viď. Môj článok o filtroch), ktorý vypisuje na štandardný výstup (stdout) posledných n riadok prečítaných zo štandardného vstupu (stdin) alebo súboru. GNU implementácia vie rôzne kúzla (viď. Manuálové stránky), čo som ja našťastie robiť nemusel. Moja implementácia vie len vypisovať posledných n riadkov a všetky riadky od riadku n.
Implementácia
Vypisovať všetky riadky od riadku n je naozaj triviálne - stačí mať jeden string ako buffer a počítať prečítané riadky. Akonáhle narazíme na riadok n, je splnená podmienka a jednoducho s každou iterácií vypíšeme obsah nášho buffera na stdout.
Implementácia výpisu posledných n riadkov je trochu problémovejšie. Keďže ide o filter, program musí vedieť spracovávať stream - nevieme teda dopredu, koľko riadkov bude. Musíme mať teda ukladacích vždy posledných n riadkov a akonáhle narazíme na koniec (súbore alebo streamu), obsah tohto buffera vypíšeme (v rovnakom poradí, ako sme ho prečítali samozrejme). Ja to vyriešil pomocou queue <string> - fronty stringov.
Fronta
Ak by ste niekto náhodou nevedel, tak fronta je pamäť, do ktorej môžeme zapisovať iba na koniec a čítať iba zo začiatku. Dobre vystihujúce je anglická skratka FIFO - First In, First Out. Popisuje správanie fronty (ktoré naozaj funguje rovnako, ako fronta v obchode) - kto prvý príde, prvý odíde.
Záver
Pomoc na použitie je priamo v programe a dostanete sa k nej pomocou prepínača -h, respektíve --help. Pre preklad je priložený Makefile.
$ ./tail --help
Na záver by som ešte podotkol, že o C ++ nemám zatiaľ prakticky žiadne teoretické vedomosti, takže som najskôr niektoré veci riešil zbytočne zložito (pomocou knižnice C) a išlo by to lepšie. Za akékoľvek pripomienky, korekcia a návrhy budem samozrejme rád.
Galéria
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 60x (2.83 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C