我需要帮助了解如何实现Linux的tail
使用的组合,C命令fseek()
和getline
。
我正在使用fseek()
到达文件末尾,然后使用 while 循环向后迭代。
如果检测到换行符('\n')。我会打印出该行,然后返回到调用之前到达getline
的位置减去检测到 '\n' 的位置。
否则,如果未检测到 '\n',则使用与当前位置的 -2 偏移量,我将向后迭代。
我知道有更简单的方法可以执行涉及缓冲区的 tail 命令,但是我的算法是否正确?如果是这样,实现它的最佳方法是什么。
提前致谢。
void tail(FILE *ifp, int k) {
int line_count=0;
char *line=NULL;
size_t len=0;
//go to end of file
if(fseek(ifp,-1,SEEK_END)) {
fprintf(stderr,"Failure in reaching end of file\n");
}
//while loop which will iterate backward starting at the end of file until line_count = k.
while(line_count != k) {
//if detected a newline character, increment line_count, print out line then return back to previous position.
if(fgetc(ifp)=='\n') {
getline(&line, &len, ifp);
printf("%s", line);
fseek(ifp,-strlen(line), SEEK_CUR);
line_count++;
//free(line);
} else {
//move back a single positon
fseek(ifp,-(strlen(line)+2), SEEK_CUR);
}
}
//free(line);
fclose(ifp);
printf("-----\nfunction exited\n-------\n");
}
您可以:
将最后 N 行保留在缓冲区中并继续前进,或
从文件末尾开始向后 N 行。
考虑到任意文件大小,第二种方法更有效。因此,您的方法很好,效率更高。但是,您的代码需要工作。
在您的代码中,您可能想要检查k
文件中少于行的情况。在这里查看GNU 中的尾部实现以获取更多信息。
1)内存泄漏:用getline分配的内存最后需要释放:
if(line)
free(line)
2)当你击中 a '\n'
(你的if
变成true
)时,你仍然应该先向后退(想想'\n'
文件中的最后一个会发生什么,这'\n'
是你希望击中的第一个)。但是,您的代码执行了一个getline
向前发展的过程。
3)您else
不寻找单个位置,这取决于前strlen(line)
一行而不是当前行的值,并且您可能会错过一些'\n'
此搜索或您的搜索可能是非法的 --> 确保您没有击中传球后退时文件的开始。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句