Shell命令编写——查看文件的命令tail -n

该程序使用C语言实现,从指定的输入文件读取内容,并打印到标准输出。通过命令行参数接收输入文件路径及输出文件路径。程序首先打开输入文件,定位到文件末尾,然后逐行向前读取直至第一行的开始位置,最后将文件内容完整地打印出来。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>


#define BUFFERSIZE 4096


int main(int ac,char *av[]){
	
	/*创建输入文件的文件描述符*/
	int in_fd;
	
	int len = sizeof(char);
	char buf;


	char buffer[BUFFERSIZE];
	int n_chars;


	long t;


	/*对输入时的参数进行判定*/
	if(ac != 3){
		fprintf(stderr,
		"usage: %s source destination\n",*av);
		exit(0);
	}


	char *line = av[1];


	int nline;


        /*我只处理第二个字符串av[1]的前两个数字*/
       
        if(line[2]=='\0'){
        	nline = (int)line[1]-48;
	}else{
		nline = ((int)line[1]-48)*10+((int)line[2]-48);
	}	


	if((nline>=100)||(line[0]!='-'))
	{
		printf("Please input '-n' as the param\n");
		exit(0);
	}


	if((in_fd=open(av[2],O_RDONLY))==-1){
		printf("Can not open:%s\n",av[2]);
		exit(1);
	}


	/*首先令指针指向文件结尾处*/


	lseek(in_fd,0,SEEK_END);




	/*由于最后一行中没有回车符号,所以要逐行回退指针*/


	while((t=(lseek(in_fd,-1,SEEK_CUR))!=-1)&&(nline>=0)){
		
		read(in_fd,&buf,len);


		if(buf=='\n'){
			nline--;
		}
		lseek(in_fd,-1,SEEK_CUR);
	}




 	lseek(in_fd,1,SEEK_CUR);
	
	while(((n_chars=read(in_fd,buffer,BUFFERSIZE))>0)){
	        if((write(1,buffer,n_chars))!=n_chars){
		        printf("Write error to\n");
	                exit(1);
		}
	}




	if(close(in_fd)==-1){
		printf("Error close files\n");	
		exit(1);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值