记住最后一个命令的简单历史记录

时间:2014-04-19 13:11:01

标签: c arrays file-io char

我正在尝试在c中模拟一个shell终端,其中一个功能是提供一个简单的内存来记住最后 命令执行。所以我要说的是:

  • 每次用户输入命令(String)时,字符串都会保存在文件中(command_histroy.txt)
  • 如果用户输入" r" (命令==" r"),终端调用函数 getSavedCommand(),因为我只保存一个命令所以我的函数是:

     char* getSavedCommand(void){
      char cmd[1000];
       int i=0;
       char* filename = "files/command_history.txt";
    
         FILE* file = fopen(filename,"r");
           if(file!=NULL){
            int c;
              do{
                c = fgetc(file);
                cmd[i]=c;
                i++;
              } while (c != EOF);
            }else{
                puts("Error Reading file");
          }
         return cmd;
        }
    

因此,在文件" command_history.txt"中,只存储了一行,我重新确认它会在一个字符数组中返回这一行。为了测试,我打印了结果:

    cmd = getSavedCommand();
    printf("|%s|",cmd);

我得到的结果是:

   arj@arj-Inspiron-1545:~/projet$ ./a.out 
   |ls -l /home/arj
   �|
   arj@arj-Inspiron-1545:~/projet$ 

我想要的是:

         |ls -l /home/arj|

我认为EOF正在创造问题。有人能帮助我吗?

2 个答案:

答案 0 :(得分:1)

问题之一是你在返回之前不要终止你的数组。最后你需要cmd[i] = '\0'之类的东西。

另一个更严重的问题是,您正在返回指向函数返回时被销毁的对象的指针。 cmd对象具有自动存储功能,并在功能结束时被销毁。使用malloc分配数组,或将指针作为getSavedFunction的参数传递给数组。

答案 1 :(得分:0)

这个功能(加上命令行版本和其他一些好东西)是GNU readline的全部要点(如果在Linux上,它可能是作为预构建的包提供的)或其BSD克隆{{3 (可能在BSD Unix上已经可用)。