C言語ケーススタディ ファイルTYPEコマンドの作り方2

前回作成したTYPEコマンドは、行番号の桁が増えると桁がずれてしまいます。 これはprintf関数の%d指定を%5dのように変更すれば、桁を揃えて印字することができます(行番号が6桁以上になればまたずれてしまいます)。


#include <stdio.h>

main(int argc, char *argv[])
{
	FILE	*fp;
	char	buff[1000];
	int	lno;

	if(argc != 2){
		printf("コマンドの入力形式が間違っています.\n");
		return;
	}
	fp = fopen(argv[1], "rb");
	if(fp == NULL){
		printf("ファイルがオープンできません[%s].\n", argv[1]);        
		return;
	}
	for(lno = 1; ; lno++){
		if(fgets(buff, sizeof(buff)-1, fp) == NULL)
			break;
		printf("%5d: %s", lno, buff);
	}
	fclose(fp);
}
Study Cにロードする Study Cにロードし編集する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて... 「run file」のように実行する必要があるので実行ボタンはありません

上記のプログラムでは、行番号が一定幅(5文字分)で印字されます。 ただし、表示しているファイルにタブ(Tab)文字が使われていると桁が正しく表示されなくなってしまいます。 これはタブ文字が8文字ごとに桁を揃えて表示するため行頭のタブ文字がずれて表示されてしまうためです。 本来ならタブ文字を空白文字に変換する処理が必要なのですが、行頭の行番号と': 'を合計して8桁になるようにしておけば一応正しく表示されるようになります。


#include <stdio.h>

main(int argc, char *argv[])
{
	FILE	*fp;
	char	buff[1000];
	int	lno;

	if(argc != 2){
		printf("コマンドの入力形式が間違っています.\n");
		return;
	}
	fp = fopen(argv[1], "rb");
	if(fp == NULL){
		printf("ファイルがオープンできません[%s].\n", argv[1]);        
		return;
	}
	for(lno = 1; ; lno++){
		if(fgets(buff, sizeof(buff)-1, fp) == NULL)
			break;
		printf("%6d: %s", lno, buff);
	}
	fclose(fp);
}
Study Cにロードする Study Cにロードし編集する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて... 「run file」のように実行する必要があるので実行ボタンはありません

今回は、このプログラムで一応完成としますが、上記のタブの問題以外にも一行が999文字以上のファイルでは正しく表示されないという問題もあります。