シェルで単純な履歴関数を作成しようとしていますが、何らかの理由で履歴テキスト ファイルに書き込んでいるときに入力が複製されます。たとえば、ユーザーは、hello、hi、bonjour、history の順に入力します。この履歴ファイルは次のようになります: hello hello hi hello hi bonjour hello hi bonjour history . 私の履歴ファイルは、hello hi bonjour history としか表示されません。
ここに私のコードがあります:
#include "parser.h"
#include "shell.h"
#include <stdio.h>
#include <string.h>
int main(void) {
char input[MAXINPUTLINE];
FILE *ptr_file;
int count=1;
char *history="history";
char *last="!!";
ptr_file =fopen(".simpleshell_history", "w");
//ptr_file =fopen(".variables", "w");
signal_c_init();
printf("Welcome to the sample shell! You may enter commands here, one\n");
printf("per line. When you're finished, press Ctrl+D on a line by\n");
printf("itself. I understand basic commands and arguments separated by\n");
printf("spaces, redirection with < and >, up to two commands joined\n");
printf("by a pipe, tilde expansion, and background commands with &.\n\n");
printf("\nlpsh$ ");
while (fgets(input, sizeof(input), stdin)) {
stripcrlf(input);
parse(input);
//printf(input);
if(strcmp(input, last)==0) {
fclose(ptr_file);
char buf[1000];
ptr_file =fopen(".simpleshell_history","r");
while(fgets(buf,1000, ptr_file)!=NULL) {
}
memmove(buf, buf+2, strlen(buf));
printf(buf);
}
fprintf(ptr_file,"%i ", count);
fprintf(ptr_file,"%s\n", input);
count++;
if(strcmp(input, history)==0) {
//printf("it works");
fclose(ptr_file);
char buf[1000];
ptr_file =fopen(".simpleshell_history","r");
while (fgets(buf,1000, ptr_file)!=NULL) {
printf("%s",buf);
}
fclose(ptr_file);
ptr_file =fopen(".simpleshell_history","a");
}
printf("\nlpsh$ ");
}
fclose(ptr_file);
return 0;
}