//
// Created by xia on 2022/3/16.
//
#include "common.h"
int main(int argc,char *argv[])
{
if(argc <2 || strcmp(argv[1],"--help")==0)
errExit("%s [-n lines] file",argv[0]);
int opt,n=10;
while ((opt = getopt(argc,argv,"n:")) != -1)
{
switch (opt) {
case 'n':
n = getInt(optarg,GN_ANY_BASE,"n");
break;
case '?':
case ':':
errExit("unknown [%c]",optopt);
default:
fatal("Unexpected case in switch()");
}
}
if(optind>=argc)
errExit("%s [-n lines] file",argv[0]);
FILE *fp = fopen(argv[optind],"r");
int fd = fileno(fp);
off_t offset = lseek(fd,0,SEEK_END);
if((off_t)-1 == offset)
errExit("lseek");
offset--;
int line_count = -1;
int c;
while(offset >= 0 && line_count < n)
{
fseek(fp,offset--,SEEK_SET);
c = fgetc(fp);
if(c == -1)
errExit("fgetc");
if(c == '\n')
line_count++;
}
if(offset == -1)
fseek(fp,0,SEEK_SET);
#define BUF_SIZE 1024
char buf[BUF_SIZE];
while (!feof(fp))
{
if(fgets(buf,BUF_SIZE,fp)==NULL)
break;
printf("%s",buf);
}
exit(EXIT_SUCCESS);
}
其中common头文件里只包含了一些常用的头文件和处理错误的函数,对理解程序没啥影响,需要这部分的代码可以评论留邮箱。