CUIからGUIへ(1)

Windows,Mac,Unixで改行コードが異なる。そこで相互変換を行うプログラムについて考える。

改行コードの可視化

まず、改行コードがどう違うかを目で確かめるために以下のプログラムを作った。
この改行コードが見つかったら、改行せずにエスケープ文字を使って出力する。

/*
  改行コードの可視化プログラム
*/
#include <stdio.h>

int main(int argc, char *argv[])
{
	// "r"で開くと改行コードが自動で変換されるので、
	// バイナリモードで開く
	FILE *fp = fopen("aaa.txt", "rb");
	if (fp == NULL) {
		printf("file not found\n");
	}

	/*
	  win  \r\n
	  mac  \n
	  unix \r
	*/
	int tmp;
	while ((tmp = fgetc(fp)) != EOF) {
		if (tmp == '\r') {
			printf("\\r");
			continue;
		}
		if (tmp == '\n') {
			printf("\\n");
			continue;
		}
		printf("%c", tmp);
	}
	fclose(fp);
	getchar();
	return 0;
}

"aaa.txt"という名前のWindowsのテキストファイルを作って実行すると、改行の位置に\r\nと出力される。

ここまで出来れば相互変換のイメージがつくのではないだろうか。

簡単なインターフェイス

メインである改行コード変換の部分は後にまわして、先にインターフェイスについて考える。

上のプログラムは対象ファイルが"aaa.txt"で固定されているので、とてもしょぼい。そこでCUIプログラムでお馴染みのコマンド引数を使って自由に指定できるようにする。

ついでに関数化もしたプログラムが下のリストだ。(関数名がへちょいがw)

/*
  改行コードの可視化プログラム
*/
#include <stdio.h>

int sub(char *filename);

int main(int argc, char *argv[])
{
	if (argc != 2) {
		printf("コマンド引数に対象ファイルを"
                         "指定してください。\n");
		getchar();
		return 0;
	}

	sub(argv[1]);

	getchar();
	return 0;
}

int sub(char *filename)
{
	// "r"で開くと改行コードが自動で変換されるので、
	// バイナリモードで開く
	FILE *fp = fopen(filename, "rb");
	if (fp == NULL) {
		printf("\"%s\"が見つかりません。\n", filename);
		return 0;
	}

	/*
	  win  \r\n
	  mac  \n
	  unix \r
	*/
	int tmp;
	while ((tmp = fgetc(fp)) != EOF) {
		if (tmp == '\r') {
			printf("\\r");
			continue;
		}
		if (tmp == '\n') {
			printf("\\n");
			continue;
		}
		printf("%c", tmp);
	}
	fclose(fp);
	return 0;
}

これで任意のテキストファイルについて変換を行うことが出来る。