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


アニメ『チェインクロニクル ~ヘクセイタスの閃~』
主人公たち、負けてしまうんですね。主人公、見た目は弱そうなんですが、こんな大部隊のリーダーなんですね。

前回に引き続き、WindowsでC#プログラミングです。seq風コマンドの次は、head風コマンドです。

headのファイルを読み込んで頭10行表示する基本動作から作ります。

     1	using System;
     2	using System.IO;
     3	
     4	class Head{
     5		static void Main(string[] args){
     6			int i,num=10;
     7	
     8			TextReader tr;
     9	
    10			tr=new StreamReader(args[0]);
    11			string line;
    12			for(i=1;(line=tr.ReadLine())!=null && (i<=num);i++){
    13				Console.WriteLine(line);
    14			}
    15			tr.Dispose();
    16		}
    17	}

引数で指定したファイルをTextReaderで読み込んで頭10行表示するプログラムです。
一応動きます。

D:\tmp> head head.cs
using System;
using System.IO;

class Head{
	static void Main(string[] args){
		int i,num=10;

		TextReader tr;

		tr=new StreamReader(args[0]);
D:\tmp> head head.cs

ファイルを複数使えるように改造してみます
headは複数ファイル指定時は、各ファイルのタイトルを表示して、head処理をするように修正してみます。

     1	using System;
     2	using System.IO;
     3	
     4	class Head{
     5		static void Main(string[] args){
     6			int i,num=10;
     7			int fileind=0,filenum=args.Length;
     8	
     9			TextReader tr;
    10			do{
    11				tr=new StreamReader(args[fileind]);
    12				Console.WriteLine("==> "+args[fileind]+" <==");
    13				string line;
    14				for(i=1;(line=tr.ReadLine())!=null && (i<=num);i++){
    15					Console.WriteLine(line);
    16				}
    17				tr.Dispose();
    18			}while(++fileind<args.Length);
    19		}
    20	}

実行すると、

D:\tmp> head head.cs seq.cs
==> head.cs <==
using System;
using System.IO;

class Head{
	static void Main(string[] args){
		int i,num=10;
		int fileind=0,filenum=args.Length;

		TextReader tr;
		do{
==> seq.cs <==
using System;

class Seq{
	static void Main(string[] args){
		int inc = 1;
		int first = 1;
		int i,last;
		if(args.Length > 2)
			inc = int.Parse(args[1]);
		if(args.Length > 1)
D:\tmp>

各ファイルのhead時にタイトルが表示されました。

では標準入力と、-(ハイフン)による行数指定もやってみましょう。

-(ハイフン)のチェックは面倒なので、引数を数値に変換したときに、マイナスの数値になったら行数指定のオプションと解釈するように作ります。
エラーがcatchされるのは、オプションがない場合です。

     1	using System;
     2	using System.IO;
     3	
     4	class Head{
     5		static void Main(string[] args){
     6			int i,tmp,num=10;
     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 line;
    28				for(i=1;(line=tr.ReadLine())!=null && (i<=num);i++){
    29					Console.WriteLine(line);
    30				}
    31				tr.Dispose();
    32			}while(++fileind<args.Length);
    33		}
    34	}

実行結果です。

Leave a Reply

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

CAPTCHA