linux: my_cat实现

my_cat实现

功能:

-b 空行不标行号
-n 空行标行号

现在版本不支持读入多个文件,可以类似 ./a.out -b test -n test,因为optind每次while后都不移动,所以不知道如何实现类似./a.out -b test1 test2,多个文件读入。

Code:

知识点:getopd, fopen, fgets函数特性

/*************************************************************************
    > File Name: my_cat.c
    > Author: evadai
    > Mail: ***@126.com 
    > Created Time: Tue 27 Oct 2020 04:11:13 PM CST
 **************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MAX_SIZE 1024
int b_flag = 0;
int n_flag = 0;

void my_cat(const char *name){
    FILE *fp;
    //文件无法打开
    if ((fp = fopen(name, "r")) == NULL){
        perror("name");//文件名 + 上一个错误原因
        exit(1);
    }
    //正常
    int count = 0;
    char buff[MAX_SIZE] = {0};
    while((fgets(buff, MAX_SIZE, fp)) != NULL){
        if (n_flag || (b_flag && buff[0] != '\n')){
            printf("%d\t%s", ++count, buff);
        }else if(b_flag && buff[0] == '\n'){
            printf("\n");
        }else{
            //不需要行号
            printf("%s", buff);
        }
        //printf("%s", buff);//不用加\n
    }
    return;
}


int main(int argc,char **argv){
    char ch;
    //getopt取参规则?返回-1? 
    while ((ch = getopt(argc, argv, "bn")) != -1){
        //printf("%c\n", ch);//循环取出所有参数,只输出b or n
        //状态分类
        switch (ch){
            case 'b': b_flag = 1; break;
            case 'n': n_flag = 1; break;
            default://接收到b,n以外参数,输出正确的文件名+参数提示
                fprintf(stderr, "Usage : %s [-b|-n] file\n ", argv[0]);
                exit(1);//return -1
        }
        my_cat(argv[optind]);
        b_flag = 0;
        n_flag = 0;
    }
    //printf("%d %d", argc, optind);
    //my_cat(argv[optind]);
    return 0;
}

my_ls实现

功能

Code

知识点:
linux目录操作(dirent, opendir, readdir, access)
窗口尺寸取出(iostl, winsize)
分列输出【复杂!】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值