您的位置:首页 > 运维架构 > Linux

linux中head、tail命令的实现

2015-11-11 09:08 666 查看
head命令:

#include <stdio.h>
#include <stdlib.h>
#define ARGC_SIZE1 2
#define ARGC_SIZE2 3
#define PRINTF_LINE 10
enum ERR
{
EXT_SUCCESS,
ARGC_ERROR,
FILE_OPEN_ERROR
};
int main(int argc,char *argv[])
{
FILE *fp;
char c,*file_name;
int iLine = 0;
int k = 0;
if (argc < ARGC_SIZE1)
{
printf("please use FILENAME\n");
return ARGC_ERROR;
}
if(argc == ARGC_SIZE1)
{
iLine = PRINTF_LINE;
file_name = argv[1];
}
else if(argc == ARGC_SIZE2)
{
iLine = (-atoi(argv[1]));
iLine = (iLine>0)?iLine:(0-iLine);
file_name = argv[2];
}
fp = fopen(file_name,"r");
if(fp == NULL)
{
perror("head open:");
fclose(fp);
return FILE_OPEN_ERROR;
}
while((c=fgetc(fp))!= EOF)
{
putchar(c);
if(c == '\n')
k++;
if((k)==iLine)
break;
}
fclose(fp);
return EXT_SUCCESS;
}


tail命令:
#include <stdio.h>
#include <stdlib.h>
#define ARGC_SIZE1 2
#define ARGC_SIZE2 3
#define PRINTF_LINE 10
enum ERR
{
EXT_SUCCESS,
ARGC_ERROR,
FILE_OPEN_ERROR
};
int main(int argc,char *argv[])
{
FILE *fp;
char c,*file_name;
int iLine = 0;
int num = 0;
int m = 0,k = 0;
if (argc < ARGC_SIZE1)
{
printf("please use FILENAME\n");
return ARGC_ERROR;
}
if(argc == ARGC_SIZE1)
{
iLine = PRINTF_LINE;
file_name=argv[1];
}
else if(argc == ARGC_SIZE2)
{
iLine = (atoi(argv[1]));
iLine = (iLine>0)?iLine:(0-iLine);
file_name=argv[2];
}
fp = fopen(file_name,"r");
if(fp == NULL)
{
perror("tail open:");
fclose(fp);
return FILE_OPEN_ERROR;
}
while((c=fgetc(fp))!=EOF)
{
if(c=='\n')
num++;
}
num++;
fseek(fp,0,SEEK_SET);
while(((c=fgetc(fp))!=EOF) && (k<num-iLine))
{
m++;
if(c=='\n')
k++;
}
fseek(fp,m,SEEK_SET);
while((c=fgetc(fp))!= EOF)
{
putchar(c);
}
fclose(fp);
return EXT_SUCCESS;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: