#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