0

シェルで単純な履歴関数を作成しようとしていますが、何らかの理由で履歴テキスト ファイルに書き込んでいるときに入力が複製されます。たとえば、ユーザーは、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;
}
4

0 に答える 0