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

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输出文件的二进制中所描述的那样


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


展开阅读全文

没有更多推荐了,返回首页