Windows+C#でtail風コマンドを作る



アニメ「青の祓魔師 京都不浄王篇」
毎夜寒すぎなので毛布にくるまりながらアニメを見ています。ヒートテックの上にセーターを着てその上に毛布です。暖かくはなりますが、背中が痒い時に厚着しすぎて掻けません。我慢です。
燐たちがテレビアニメにようやく帰ってきました。主題歌はUVERworld、青の祓魔師に合っています。第二期の一話目、周囲がよそよそしいです。一期で燐がいくら暴れたからって、冷たすぎます。常に得体のしれないものと向き合ってる割には、メンタル弱すぎな気がします。特にしえみさんの燐への態度にはがっかり。まあ皆若いからでしょうか。
燐だけがなんだかぐっと大人になった気もします。そういえば燐は悪魔の子なので、尻尾があります。前からの疑問、悪魔の尻尾って何で尖っているんでしょう。やっぱり背中を掻くためでしょうか。

今回はtail風コマンドです。tailもまたtacから作れます。
差分を見ていきましょう。

< class Tac{
---
> class Tail{

tailに変えておきます。

< 		int num=1,nflag=0;
---
> 		int num=1,tmp;

ナンバリングは必要ないのでnflagは取っ払って、代わりに文字列数値変換時に使うtmpを定義します。

< 			if(args[0]=="-n"){
< 				nflag=1;
---
> 			if((tmp=int.Parse(args[0])) < 0){
> 				num=tmp*-1;

headの時と同じく、マイナス値を利用します。

> 				if(filenum>1)
> 					Console.WriteLine("==> "+args[fileind]+" <==");

ここもheadと同じく、複数ファイルの時はヘッダを付けます。

< 			int i=lines.Length-1;
< 			while(i-->0){
< 				if(nflag==1)
< 					Console.Write(String.Format("{0,6}	", num++));
< 				Console.WriteLine(lines[i]);
---
> 			if(lines.Length < num)
> 				num = lines.Length;
> 			for(int i=num;i>0;i--){
> 				Console.WriteLine(lines[lines.Length-i-1]);

-(ハイフン)で指定する数字がファイルの行数より少ない場合のチェックも入れておきます。

tail風コマンドのソースを全部見てみます。

     1	using System;
     2	using System.IO;
     3	
     4	class Tail{
     5		static void Main(string[] args){
     6			int num=1,tmp;
     7			int fileind=0,filenum=args.Length;
     8	
     9			try{
    10				if((tmp=int.Parse(args[0])) < 0){
    11					num=tmp*-1;
    12					fileind=1;
    13					filenum--;
    14				}
    15			}catch{
    16			}
    17	
    18			TextReader tr;
    19			do{
    20				if(filenum==0){
    21					tr=Console.In;
    22				}else{
    23					tr=new StreamReader(args[fileind]);
    24					if(filenum>1)
    25						Console.WriteLine("==> "+args[fileind]+" <==");
    26				}
    27				string[] lines = tr.ReadToEnd().Split('\n');
    28				if(lines.Length < num)
    29					num = lines.Length;
    30				for(int i=num;i>0;i--){
    31					Console.WriteLine(lines[lines.Length-i-1]);
    32				}
    33				tr.Dispose();
    34			}while(++fileind<args.Length);
    35		}
    36	}

実行結果です。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA