利用文件操作实现补全功能

学习了linux下的一些文件操作函数,玩一点有趣的东西

关于补全

用过最多的应该就是linux下终端的table键了

可以补全命令,文件之类的东西

这次我们来看一看怎么实现补全文件这个功能

我们先来看看我们要使用的关于文件操作方面函数

DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);

其实也就这两个就够了,opendir用于打开目录,readdir用于读取目录信息

具体实现思路就是输入文件名,然后遍历当前目录,利用strncmp()函数,n值设置为输入的文件名的大小

遇到相同则存入另一个字符串,最后判断,根据存入字符串的数量来输出

具体代码实现如下

#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termio.h>
#include<unistd.h>
#include<dirent.h>
#include<stdlib.h>
int main(void)
{
 
    char ch[20];
    char str[20][20];                       //用于存储所有补全文件
    int i;                                                      //循环变量
    int count = 0;                                              //计数器
 
    struct dirent *ptr;
    DIR *dir;
    printf("20:17-wh@wh-ST-Plus-KN:~$ ");
    scanf("%s",ch);
 
    if((dir = opendir(".")) == NULL) {
        perror("");
        return 0;
    }
    while((ptr = readdir(dir)) != NULL)
        if(!strncmp(ch,ptr->d_name,strlen(ch)))                         //与输入的字符之间进行判断
                strcpy(str[count++],ptr->d_name);           //若相同,则计数并存储起来
 
    if(count == 0)
        printf("no file!!!");
    if(count == 1) {
            printf("20:17-wh@wh-ST-Plus-KN:~$ ");
                puts(str[0]);
    }
 
    else
            for(i = 0;i < count;i++)
                printf("%s\t",str[i]);
                putchar('\n');
 
    return 0;
}

最后,如果想要命令补全的话,只需要打开存放命令文件的目录,在终端下输入echo $PATH 即可看到所有的存放命令文件的目录,按照上述方法遍历即可

下面贴出实现命令补全功能的代码

仅供参考

//打开存放命令文件的目录名的文件
    int cnt = 0;
    int fd;
    char c;                                                 //用于读取文件
    char pt[50] = "";                                           //用于存储目录文件名
    if((fd = open("1.txt",O_RDONLY)) == -1) {               //打开存放目录文件名的文件,利用echo $PATH >> 1.txt重定向输出得到
        perror("open:");
        return 0;
    }
    while(read(fd,&c,sizeof(char)) > 0) {
        if(c != ':')
            pt[cnt++] = c;                                      //拼接目录文件名
        else {                                                  //得到目录文件名,打开目录文件
            if((dir = opendir(pt)) == NULL) {                   //重复上述比较步骤,得到补全的命令名
                perror("");
                return 0;
            }
            while((ptr = readdir(dir)) != NULL) {
                if(!strncmp(ch,ptr->d_name,strlen(ch)))
                    strcpy(str[count++],ptr->d_name);
            }
            int length = strlen(pt);
            for(i = 0;i < length;i++)
                pt[i] = '\0';
            closedir(dir);
            cnt = 0;
        }
    }
    close(fd);
    


又有灵感了,可以利用getch()函数无缓冲输入来模拟终端环境,只需要在输入上面搞点功夫就好,其他地方完全不变,营造出在使用终端的假象

 char cata[20];
    getcwd(cata,20);                        //获取当前目录
    int k;                                      //若为主目录,则换成~
    for(k = 0;k < strlen(cata);k++)
        if(!strncmp(cata,"/home/wh",7)) {
            cata[0] = '~';
            int m = strlen(cata);
            for(k = 1;k < strlen(cata) - 7;k++)
                cata[k] = cata[k+7];
            cata[m - 7] = '\0';
        }
     
    char c;
    char ch[50];
    int count = 0;
    printf("\033[35m\33[1m");
    printf("\033[35m20:17\33[1m-\033[32mwh@wh-ST-Plus-KN\33[1m\033[37m:\33[1m\033[34m%s\33[1m\033[37m$\33[1m ",cata);
    printf("\033[37m\33[1m");   
    while(c = getch() ) {
        
        if(c == '   ') 
            break;
        ch[count++] = c;
        
    }
    ch[count++] = '\0';     

坏了,代码莫名其妙不能变色了,看起来肯定很难受。。。。。

不过其实也没有多难看的,将就着看吧

 

仅为个人想法,如有不足之处请评论指出,多谢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值