学习了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';
坏了,代码莫名其妙不能变色了,看起来肯定很难受。。。。。
不过其实也没有多难看的,将就着看吧
仅为个人想法,如有不足之处请评论指出,多谢