#include<stdlib.h>
#include"RingBuffer.h"
#include<fstream>
#include<iostream>
#include<string>
using namespace std;
// tail 処理関数のプロトタイプ
void tail( istream& is, int size ) ;
/////////////////////////////////////////////////////////////////////////////
// 使い方表示
void usage( ){
cerr << "usage : mytail [ -number ] [ file... ]
" ;
}
///////////////////////////////////////////////////////////////////////////////
// メイン
int main( int argc, char** argv ){
// 出力行数:デフォルトは10行
int output_lineno = 10 ;
// オプションの取得
if( argc >= 2 && argv[1][0] == '-' ){
// 出力行数を獲得する
output_lineno = atoi( &argv[1][1] ) ;
if( output_lineno <= 0 ){
usage( ) ;
return 1 ;
}
// 引数を調整する
argc-- ; argv++ ;
}
// 標準入力から読み込む時
if( argc == 1 ){
// 処理本体は tail 関数に任せる
tail( cin, output_lineno ) ;
}
// ファイルから読み込む時
else{
for( int i = 1 ; i < argc ; i++ ){
// 入力ファイルストリームを準備する
// オブジェクト名はifs
// ファイル名は順次argvに格納されている
ifstream ifs( argv[i] ) ;
tail( ifs, output_lineno ) ;
}
}
// 正常終了
return 0 ;
}
////////////////////////////////////////////////////////////////////////////
// tail 処理関数
void tail( istream& is, int size ){
// 出力行数分のリングバッファ
// string型のリングバッファを獲得する
// オブジェクト名はring_buf, サイズは size
RingBuffer<string> ring_buf( size ) ;
// 入力行
string line ;
// 1行ずつリングバッファに読み込む
while( getline( is, line ) ){
// リングバッファに詰め込む
ring_buf.add( line ) ;
}
// リングバッファに残っている行を順次出力する
int length = ring_buf.GetLength();
for( int i = 0 ; i < length ; i++ )
cout << ring_buf.get(i) << endl;
}
|