cat命令的简单实现
阅读原文时间:2023年07月08日阅读:2

cat命令的简单实现

目标:简单的实现cat命令

实现的mic_cat命令主要有三大功能

1.mic_cat命令一次显示整个文件 $ mic_cat filename

2.mic_cat命令从键盘创建一个文件 $ mic_cat > filename

3.mic_cat命令将几个文件合并为一个文件 $ mic_cat filename1 filename2 >file

实现的参数(最常用的两个)

-n 由1开始对所有输出行数编号

-s 当遇到两行以上的空白行,就换为一行空白

代码

环境:ubuntu 14.04 gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)

新手菜鸟 如有错误 欢迎指正

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdbool.h>
#define LENMAX 512
bool show_number=false;
bool squeeze_blank=false;
bool had_blank=false;
void do_cat(FILE *);
int main(int argc,char *argv[])
{
    int opt;
    FILE * fp;
    while((opt=getopt(argc,argv,"sn"))!=-1){
        switch(opt){
            case 's':
                squeeze_blank=true;
                break;
            case 'n':
                show_number=true;
                break;
            case '?':
                printf("unknow option :%c\n",optopt);
                exit(1);
        }
    }
    if(argc==1)
      do_cat(stdin);
    else
        for(; optind<argc;optind++){
            fp=fopen(argv[optind],"r");
            if(!fp){
                printf("open error :%s\n",argv[optind]);
                exit(1);
            }
            do_cat(fp);
          }
}
void do_cat(FILE *fp)
{
    char line[LENMAX];
    int l=1;
    while(fgets(line,LENMAX,fp)){
        if(squeeze_blank)
        {
            if(line[0]=='\n'){
              if(had_blank==false){
                  if(show_number)
                    printf("%d    ",l++);
                  fputs(line,stdout);
                  had_blank=true;
              }
              else
                continue;
            }
            else{
                if(show_number)
                  printf("%d    ",l++);
                fputs(line,stdout);
                had_blank=false;
            }

        }
        else{
            if(show_number)
              printf("%d    ",l++);
            fputs(line,stdout);
        }
    }
}