C语言实现linux下的tail -n <n> 命令

本文介绍了如何用C语言实现Linux系统下的tail -n命令,该命令用于显示文本文件的最后n行。内容包括利用fseek函数从文件尾部开始向前读取,通过计数换行符来确定已读行数。即使文件末尾没有换行符,Linux文本文件也会在最后添加一个额外的换行符。

linux下的tail -n <n>命令的作用就是输出文本文件的最后n行,如果文件的总行数小于n,则输出文件的所用行。


其通过C语言的fseek的实现方法如下:


#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE 256

void myTail(char* filename, unsigned int n)
{
FILE* f = fopen(filename, "r");
if(!f)
{
printf("Can not open the file!\n");
return;
}

fseek(f, -1, SEEK_END); // SEEK_END位置是一个无效的位置,对于文件而言,SEEK_END的前一个位置是文件中最后的那个数据的位置
unsigned int num = 0;
while(true)
{
if(fgetc(f) == '\n') ++num;
if(num > n) break;
if(fseek(f, -2, SEEK_CUR ) != 0) // 当读取好一个字符串后,文件的指针会移动到下一个位置上,所以要倒序读取,此时文件的指针需要向前移动2个字节
{
fseek(f, 0, SEEK_SET); // 如果fseek返回值不是零,说明已经到达的文件的头部,该文件需要从头全部输出
break;
}
}

char buffer[BUFSIZE];
while(fgets(buffer, BUFSIZE, f)) // 此处没有用feof判断,因为用feof判断会导致最后一行输出两次,feof是在文件指针失效后,还要读取一次才判断为真
{
printf("%s", buffer);
}
}


上述函数的思路,就是从文件的结尾开始往前读,读到的换行符的数量 - 1就是已经经过的行数,需要注意的是,对于一个linux下的文本文件,文件的最后一行即使没有换行符在最终文件的最后也是有一个换行符的。如下图,hexdump -C输出文件的二进制中所描述的那样


可以看到,无论文件最后是否换行,都会多出一个最后的换行符。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值