#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define LINE_SIZE 256
#define CMD_SIZE 100
 
void temporary_save(FILE *txtfile , FILE *temp); 
void execmd(FILE *txt, FILE *temp, char *txtname, char *temp_cmd, int *p);
void display_all(FILE *txt);
void save_end(int *p);
void not_save(FILE *txt, FILE *temp, char *txtname, int *p);
 
int main(int argc, char *argv[]){
 
	FILE *txtfile,*temp;
	int start = 0;
	int coe = 1;//終了条件(Condition Of End)
	int *p_coe = &coe;        //coeへのポインタ
	char cmd[CMD_SIZE];            //コマンド
	char temp_text[L_tmpnam];	//一時的ファイルのファイル名
	tmpnam(temp_text);	        //一時的ファイルのファイル名の決定
 
 
	//ファイルの引数を調べる。
	if(argc != 2){
		printf("引数にはファイルのパスを指定してください\n");
		exit(1);
	}
 
 
	//終了するまで無限ループ
	while(coe){
 
 
		//ファイルが開けるかどうかを調べる。
		if((txtfile = fopen(argv[1], "r")) == NULL){
			printf("ファイルを開くことが出来ません");
			exit(1);
		}
 
		//*を表示する
		if(start) printf("*");
		else{
			//変更せずに終了するときに使用する変更前のファイルの保存
			temp = fopen(temp_text, "w");
			temporary_save(txtfile,temp);
			temp = freopen(temp_text,"r",temp);
			txtfile = fopen(argv[1], "r");
			printf("ファイルを終わりまで読み込みました\n*");
			start++;
		}
 
		//コマンドを入力
		fgets(cmd, CMD_SIZE, stdin);
		execmd(txtfile, temp, argv[1], cmd, p_coe);
 
		//ファイルを閉じる
		fclose(txtfile);
	}
	fclose(temp);
	remove(temp_text);		//一時的ファイルを削除する
	return 0;
}
 
//一時的ファイルの保存
void temporary_save(FILE *txtfile,FILE *temp){
 
	int c;            /* 文字を読み込む */
 
	/* ファイルから EOFが現れるまで1字読み込む */
	while ((c = getc(txtfile)) != EOF) {
 
		fputc(c,temp);
 
	}
	fclose(txtfile);
 
}
 
 
 
//機能はここに追加
void execmd(FILE *txt, FILE *temp, char *txtname, char *temp_cmd, int *p){
 
	if(strcmp(temp_cmd, "l\n") == 0 || strcmp(temp_cmd, "L\n") == 0) display_all(txt);
	if(strcmp(temp_cmd, "e\n") == 0 || strcmp(temp_cmd, "E\n") == 0) save_end(p);
	if(strcmp(temp_cmd, "n\n") == 0 || strcmp(temp_cmd, "N\n") == 0) not_save(txt,temp,txtname,p);
 
	return;
}
 
//以下は拡張した関数群
 
//すべての行を表示
void display_all(FILE *txt){
	char str[LINE_SIZE];
	int i = 1;
 
	while(!feof(txt)){
		if(fgets(str, LINE_SIZE - 1, txt) == NULL) strcpy(str, "\n");
		if(ferror(txt)){
			printf("ファイルエラー\n");
			break;
		}
 
		if(!feof(txt)) printf("%8d: %s", i, str);
		else{
			if(strcmp(str, "\n") != 0) printf("%8d: %s\n", i, str);
		}
		i++;
	}
 
	return;
}
 
//セーブして終了
void save_end(int *p){
 
	*p = 0;
 
	return;
}
 
//セーブしないで終了
void not_save(FILE *txt, FILE *temp,char *txtname, int *p){
 
	int c;            /* 文字を読み込む */
 
	txt = freopen(txtname,"w",txt);		//読み込みから書き込みへ
 
	/* ファイルから EOFが現れるまで1字読み込む */
	while ((c = getc(temp)) != EOF) {	//最初に保存してた内容を読み込み
 
		fputc(c,txt);			//元のファイルに戻す
 
 
	}
	*p = 0;
}
最終更新:2007年07月04日 02:04