Tiny programs (C, C++, C#, ...)
File detail
Source code
/*
* Soubor: tail2.cc - implementace utility tail v C++
* Kamil Dudka, FIT, DU2, priklad 1b, 17.4.2005
*/
#include <iostream>
#include <fstream>
#include <queue>
const unsigned long DefaulLinesCount = 10;
/*
* Vlastni funkce, provadejici filtrovani streamu
*/
void tail (std::istream &, unsigned long);
/*
* Funkce Error vytiskne chybove hlaseni na stderr a ukonci
* program s chybovym kodem 1. Pred chybovym hlasenim tiskne
* test "tail2: ".
*/
inline void Error(const char *fmt);
/*
* Funkce main nacte parametry a zavola funkci tail
*/
int main (int argc, char *argv[]) {
using namespace std;
bool minusDetected = false;
unsigned long linesCount = DefaulLinesCount;
fstream fileInput;
istream *pInput = &cin;
// Cyklus postupne nacita parametry
for (int i=1; i<argc; i++) {
if (argv [i][0] == '-') {
// Pokud je prvni znak '-', pokusi se nacist cislo
if (argv [i][1] == '-')
Error ("Pocet radku musi byt kladny!");
if (minusDetected)
Error ("Duplicitni parametr!");
minusDetected = true;
if (1!= sscanf (argv[i]+1, "%lu", &linesCount))
Error ("Neplatny parametr!");
} else {
// Pokud neni prvni znak '-', pokusi se otevrit soubor
fileInput.open(argv[i],ios::in);
if (!fileInput.is_open())
Error ("Nelze otevrit vstupni soubor!");
else
pInput = &fileInput;
}
}
// Zavola vlastni filtr
tail (*pInput, linesCount);
// Po skonceni zavre vstupni soubor
fileInput.close();
}
inline void Error(const char *errMsg) {
// Vypis chybove hlasky na stderr
std::cerr << "tail2: " << errMsg << "\n";
// Shodi program s chybovym kodem 1
exit (1);
}
void tail (std::istream &input, unsigned long linesCount) {
// Vytvoreni fronty fifo
using std::string;
std::queue<string> fifo;
// Buffer pro nacteni jednoho radku
string tmp;
// Cyklus nacita radky ze vstupniho souboru do pameti fifo
for (unsigned long i=0; getline(input,tmp); i++) {
fifo.push(tmp);
if (i>=linesCount)
// Odmazani radku na zacatku fronty
fifo.pop();
}
// Cyklus pro vypis prvku fronty
for (; !fifo.empty(); fifo.pop())
std::cout << fifo.front() << "\n";
}