Česky
Kamil Dudka

Tiny programs (C, C++, C#, ...)

File detail

Name:Downloadtail2.cc [Download]
Location: tiny > IJC > du2
Size:2.1 KB
Last modification:2007-08-29 17:44

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";
}