ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux实现cat、grep、zip

2021-09-30 19:03:55  阅读:176  来源: 互联网

标签:fp grep zip int cat char return buf readlen


文章目录

代码都比较简短,都是大致原理的实现,不再写注释。

linux cat实现

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    char *buf = malloc(sizeof(char)*1025);
    size_t nread;
    ssize_t readlen;
    FILE *fp = stdin;

    int i = 1;
    if(argc==1)
    {
        while((readlen=getline(&buf,&nread,fp))>0)
        {
            buf[readlen] = 0;
            printf("%s",buf);
        }
        return 0;
    }
    for(;i<argc;i++)
    {
        fp = fopen(argv[i],"rb");
        if(fp == NULL)
        {
            printf("wcat: cannot open file\n");
            return 1;
        }

        while((readlen=getline(&buf,&nread,fp))>0)
        {
            buf[readlen] = 0;
            printf("%s",buf);
        }
        fclose(fp);
    }
    return 0;
}

image-20210816162744383

linux grep实现

这个也是比较简单,没有正则,只是简单地匹配,每行查找一个子串而已。

// 同理,输入有两种形式,stdin和文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
    char *buf = malloc(sizeof(char)*1025*64);
    size_t nread;
    ssize_t readlen;
    FILE *fp = stdin;

    int i = 2;
    if(argc==1)
    {
        printf("wgrep: searchterm [file ...]\n");
        return 1;
    }
    if(argc==2)
    {
        while((readlen=getline(&buf,&nread,fp))>0)
        {
            buf[readlen] = 0;
            if(strstr(buf,argv[1]))
                printf("%s",buf);
        }
        return 0;
    }
    for(;i<argc;i++)
    {
        fp = fopen(argv[i],"rb");
        if(fp == NULL)
        {
            printf("wgrep: cannot open file\n");
            return 1;
        }

        while((readlen=getline(&buf,&nread,fp))>0)
        {
            buf[readlen] = 0;
            if(strstr(buf,argv[1]))
                printf("%s",buf);
        }
        fclose(fp);
    }
    return 0;
}

image-20210816164655897

linux zip实现

有点像刷题,几个例子,盲打,几个组合拳下来才能全部通过。

//这个的规则就是aaaabcc -> 4ab2c
#include <stdio.h>
#include <stdlib.h>

void diwrite(int n,char c)
{
    fwrite(&n,4,1,stdout);
    fwrite(&c,1,1,stdout);
}

int main(int argc,char *argv[])
{
    char lastc = 0;
    char curc;
    int nread;
    int count = 0;
    FILE *fp = stdin;

    int i = 1;
    if(argc==1)
    {
        printf("wzip: file1 [file2 ...]\n");
        return 1;
    }
    for(;i<argc;i++)
    {
        fp = fopen(argv[i],"rb");
        if(fp == NULL)
        {
            printf("wzip: cannot open file\n");
            return 1;
        }

        while((nread = fread(&curc,1,1,fp))==1)
        {
            if(curc==lastc)
            {
                count++;
                continue;
            }
            if(count!=0)
                diwrite(count,lastc);
            count = 1;
            lastc = curc;
        }
        fclose(fp);
    }
    diwrite(count,lastc);
    return 0;
}

image-20210816172511621

本文同步发布于orzlinux.cn

标签:fp,grep,zip,int,cat,char,return,buf,readlen
来源: https://blog.csdn.net/qq_36704378/article/details/120571253

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有