热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C写的实现wc和ls函数

以下是用linuxC写的实现wc功能的函数#include#defineBEGIN1;intmain(intargc,char*argv[]){intcharacters,
以下是用linux C写的实现wc功能的函数

#include

#define BEGIN 1;

int main(int argc, char *argv[])
{
    int characters, lines, words, state;
    char c;

    state = characters = lines = words = 0;
    while((c = getchar()) != '0') {
        characters++;
        if(c == '\n') {
            lines++;
            state = 0;
            continue;
        } else if(c == ' ') {
            state = 0;
            continue;
        } else if(c == '\t') {
            state = 0;
            continue;
        } else {
            if(state == 0) {
                state = BEGIN;
                words++;
            }
            continue;
        }
    }

    printf("%d characters. %d words. %d lines.\n", characters, words, lines);
}

以下是用linux C写的实现ls部分功能的函数。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


//用lstat函数获取文件的类型
int get_mode(char *file)
{
    struct stat buf;
    char *ptr;

    if(lstat(file, &buf) <0)
    {
        printf("error\n!");
    }
    switch(S_IFMT&buf.st_mode)
    {
        case S_IFREG:ptr = "-";break;
        case S_IFDIR:ptr = "d";break;
        case S_IFCHR:ptr = "c";break;
        case S_IFBLK:ptr = "b";break;
        case S_IFIFO:ptr = "f";break;
        case S_IFLNK:ptr = "l";break;
        case S_IFSOCK:ptr = "s";break;
        default:ptr = "UNKNOW";
    }

    printf("%s", ptr);

    return 0;
}

//用stat获取文件拥有者,用户组和其他组的权限
int get_rwx(char *file)
{
    struct stat buf;

    if(stat(file, &buf) == -1)
    {
        perror("stat \n");
        return 0;   
    }

    //文件拥有者的权限获取
    if(S_IRUSR&buf.st_mode) {
        printf("r");   
    } else {
        printf("-");
    }
    if(S_IWUSR&buf.st_mode) {
        printf("w");   
    } else {
        printf("-");
    }
    if(S_IXUSR&buf.st_mode) {
        printf("x");   
    } else {
        printf("-");
    }
   
    //文件用户组的权限获取
    if(S_IRGRP&buf.st_mode) {
        printf("r");   
    } else {
        printf("-");
    }
    if(S_IWGRP&buf.st_mode) {
        printf("w");   
    } else {
        printf("-");
    }
    if(S_IXGRP&buf.st_mode) {
        printf("x");   
    } else {
        printf("-");
    }

    //文件其他组的权限获取
    if(S_IROTH&buf.st_mode) {
        printf("r");   
    } else {
        printf("-");
    }
    if(S_IWOTH&buf.st_mode) {
        printf("w");   
    } else {
        printf("-");
    }
    if(S_IXOTH&buf.st_mode) {
        printf("x");   
    } else {
        printf("-");
    }

    return 0;
}

//获取文件的大小
long get_size(char *file)
{
    struct stat buf;
    long n;

    stat(file, &buf);   
    n = buf.st_size;   
   
    return n;
}

//获取文件的修改时间
int get_time(char *file, char *ch)
{
    struct stat buf;

    stat(file, &buf);
    strcpy(ch, ctime(&buf.st_mtime));   
    ch[strlen(ch) - 1] = '\0';

    return 0;
}

//文件的硬链接数目,并且打印出来
int get_nlink(char *file)
{
    struct stat buf;

    stat(file, &buf);
    printf(" %d", buf.st_nlink);
   
    return 0;
}

//获取文件拥有者和用户组的name
int get_name(char *file)
{
    struct stat buf;
    char name1[20], name2[20];

    stat(file, &buf);
    strcpy(name1, getpwuid(buf.st_uid)->pw_name);
    strcpy(name2, getpwuid(buf.st_gid)->pw_name);
    printf(" %s %s", name1, name2);

    return 0;
}

//浏览文件夹的内容
struct dirent **scan_dir(int *n)
{
    struct dirent **namelist;
   
    (*n) = scandir(".", &namelist, 0, alphasort);
    if ((*n) <0)
        perror("scandir");

    return namelist;
}

//实现ls不带参数的命令
int no_ls()
{
    struct dirent **namelist;
    int i, n;
    long all_size = 0, size;

    namelist = scan_dir(&n);
    for(i = 0; i         if(namelist[i]->d_name[0] != '.') {
            printf("%-s  ", namelist[i]->d_name);
        }
       
        free(namelist[i]);
    }
    printf("\n");
    free(namelist);

    return 0;
}

//实现ls -l的命令
int l_ls()
{
    struct dirent **namelist;
    int n, i;
    long all_size = 0, size;
    char ch[40] = {0};

    namelist = scan_dir(&n);
   
    //得到文件总的大小
    for(i = 0; i         if(namelist[i]->d_name[0] != '.') {
            size = get_size(namelist[i]->d_name);
            all_size += size;
        }
    }

    //打印信息
    printf("总用量:%ld\n", all_size);
    for(i = 0; i         if(namelist[i]->d_name[0] != '.') {
            get_mode(namelist[i]->d_name);
            get_rwx(namelist[i]->d_name);
            get_nlink(namelist[i]->d_name);
           
            get_name(namelist[i]->d_name);

            printf(" %5ld", get_size(namelist[i]->d_name));
            get_time(namelist[i]->d_name, ch);
            printf(" %s", ch);
            printf(" %s", namelist[i]->d_name);
            printf("\n");
        }
        free(namelist[i]);
    }
    free(namelist);

    return 0;
}

//实现ls -al的命令
int al_ls()
{
    struct dirent **namelist;
    int n, i;
    long all_size = 0, size;
    char ch[40] = {0};
   
    namelist = scan_dir(&n);
   
    //得到文件总的大小
    for(i = 0; i         size = get_size(namelist[i]->d_name);
        all_size += size;
    }

    printf("总用量:%ld\n", all_size);
    for(i = 0; i         get_mode(namelist[i]->d_name);
        get_rwx(namelist[i]->d_name);
        get_nlink(namelist[i]->d_name);   

        get_name(namelist[i]->d_name);

        all_size += size;
        printf(" %5ld", get_size(namelist[i]->d_name));
        get_time(namelist[i]->d_name, ch);
        printf(" %s", ch);
        printf(" %s", namelist[i]->d_name);
        printf("\n");
        free(namelist[i]);
    }
    free(namelist);

    return 0;
}

//实现ls -a的命令
int a_ls()
{
    struct dirent **namelist;
    int i, n;

    namelist = scan_dir(&n);
    for(i = 0; i         printf("%-s  ", namelist[i]->d_name);
        free(namelist[i]);
    }
    printf("\n");
    free(namelist);

    return 0;
}

//实现ls -A的命令
int A_ls()
{
    struct dirent **namelist;
    int i, n, test1, test2;

    namelist = scan_dir(&n);
    for(i = 0; i         test1 = strcmp(".", namelist[i]->d_name) == 0;
        test2 = strcmp("..", namelist[i]->d_name) == 0;
        if(test1 || test2){
            free(namelist[i]);
            continue;
        }
        printf("%-s  ", namelist[i]->d_name);
        free(namelist[i]);
    }
    printf("\n");
    free(namelist);

    return 0;
}

//浏览指定目录下的文件
int dir_ls(char *name)
{
    struct dirent **namelist;
    char file[20] = {0};
    int i, n;

    strcpy(file, "./");
    strcat(file, name);

    printf("%s\n", name);
    n = scandir(file, &namelist, 0, alphasort);
    for(i = 0; i         if(namelist[i]->d_name[0] == '.') {
            free(namelist[i]);
            continue;
        }
        printf("%-s  ", namelist[i]->d_name);
        free(namelist[i]);
    }
    printf("\n");
    free(namelist);

    return 0;
}

//实现多个输入文件时的输出name_ls
int name_ls(int argc, char **argv)
{
    int i;
    struct stat buf;

    for(i = 1; i         if(lstat(argv[i], &buf) <0) {
            perror("lstat:\n");
        }

        switch(S_IFMT&buf.st_mode) {
            case S_IFDIR:dir_ls(argv[i]);break;
            default:file_ls(argv[i]);
        }
    }

    return 0;
}

//实现file_ls
int file_ls(char *file)
{
    int fd;
    struct stat buf;
   
    if(lstat(file, &buf) <0) {
        perror("lstat:\n");
        return 0;
    }
    switch(S_IFMT&buf.st_mode) {
        case S_IFDIR:dir_ls(file);return 0;
    }

    if((fd = open(file, O_RDONLY)) == -1) {
        printf("没有找到%s文件!\n", file);
    } else {
        close(fd);
        printf("%s\n", file);
    }

    return 0;
}

//实现mylist
int mylist(char *option)
{
    if(strcmp(option, "-l") == 0) {
        l_ls();
    } else if(strcmp(option, "-al") == 0 || strcmp(option, "-la") == 0) {
        al_ls();   
    } else if(strcmp(option, "-a") == 0) {
        a_ls();
    } else if(strcmp(option, "-A") == 0) {
        A_ls();
    } else {
        file_ls(option);
    }

    return 0;
}

//主函数
int main(int argc, char *argv[])
{
    if(argc == 1) {
        no_ls();   
    } else if(argc == 2) {
        mylist(argv[1]);   
    } else if(argc > 2) {
        name_ls(argc, argv);
    } else {
        perror("Input error!\n");
    }

    return 0;
}



阅读(3795) | 评论(0) | 转发(1) | 0

上一篇:例析#define

下一篇:一个汉字真的由两个字节存放吗?

相关热门文章
  • 欢迎icysky0605在ChinaUnix博...
  • 欢迎xiaoniu02623在ChinaUnix...
  • 欢迎禹诺在ChinaUnix博客安家!...
  • 欢迎lenswolf在ChinaUnix博客...
  • 欢迎qjy133456在ChinaUnix博客...
  • linux 常见服务端口
  • xmanager 2.0 for linux配置
  • 【ROOTFS搭建】busybox的httpd...
  • openwrt中luci学习笔记
  • 什么是shell
  • linux dhcp peizhi roc
  • 关于Unix文件的软链接
  • 求教这个命令什么意思,我是新...
  • sed -e "/grep/d" 是什么意思...
  • 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~ 评论热议

推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文介绍了解决mysql 5.1启动问题的方法,通过修改my.ini文件中的相关配置,包括innodb_data_home_dir和skip-innodb等,可以解决启动问题。同时还介绍了如何调整内存池来存储metadata信息。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
author-avatar
afagds
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有