All pastes #717180 Raw Edit

tail.cpp

public cpp v1 · immutable
#717180 ·published 2007-09-27 13:20 UTC
rendered paste body
#include <fstream>#include <vector>#include <string>#define BUF_SIZE 512/* Save the last 'n_lines' lines of 'filename' into vector 'dest'. * ignore_last_line is useful for \n-terminated files. * Function returns number of written lines or -1 on error. */int tail(std::string filename, int n_lines, std::vector<std::string> *dest, bool ignore_last_line){	int length = ignore_last_line ? (n_lines + 1) : n_lines;	int count = 0;	char buf[length][BUF_SIZE];	std::ifstream fin;	fin.open(filename.c_str(), std::ifstream::in);	if(!fin.good())		return -1;		while(!fin.eof()) {		fin.getline(buf[count % length], BUF_SIZE);	/*			if(fin.fail() && !fin.eof()) {			// fin.fail() is set if either the current bufs is longer than BUF_SIZE-1 characters			// or if an EOF mark is found before another newline. The latter is responsible for the blank 			// line at the end of the output. Try ignore_last_line = true.		}        */		count++;	}	fin.close();	int start = (count < length) ? 0 : count;	int stop = (count < length) ? count : (count + length);	if(ignore_last_line) stop--;		for(int i = start; i < stop; i++) 		dest->push_back(buf[i % (length)]);	return ((count < n_lines) ? (ignore_last_line ? (count - 1) : count) : n_lines);}