Tail 命令 - 使用 fseek() 和 getline() - 输出乱序

奥马尔

我需要帮助了解如何实现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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用grep和sed tail -f输出作为'at'命令的参数源进行命令替换

来自分类Dev

使用 Linux 命令 head 和 tail

来自分类Dev

使用fread和fseek逐行读取

来自分类Dev

使用 fseek 、 fread 和指针读取文件

来自分类Dev

使用tail -f命令分页

来自分类Dev

在tail命令中使用变量

来自分类Dev

使用tail -f命令分页

来自分类Dev

使用tail -f命令分页

来自分类Dev

使用grep命令模拟tail -1命令

来自分类Dev

awk命令中的getline安全使用吗?

来自分类Dev

如何使用颜色区分命令和输出

来自分类Dev

使用VBA运行和保存命令输出

来自分类Dev

TestKichen,Serverspec和乱序命令执行

来自分类Dev

如何使用fseek和fwrite将文本插入文件

来自分类Dev

fseek和feof的用法

来自分类Dev

使用getline和strsep发生内存泄漏

来自分类Dev

在弦上使用cin和getline

来自分类Dev

使用getline和awk的奇怪行为

来自分类Dev

在Mac OS-X中将tail -f与多个Grep命令一起使用时无输出

来自分类Dev

在Mac OS-X中将tail -f与多个Grep命令一起使用时无输出

来自分类Dev

tail -f命令和null复制效果不佳

来自分类Dev

简单使用“ tail”和“ grep”。多种条件

来自分类Dev

使用sed和regex解析无线测量的iwlist命令输出

来自分类Dev

如何单线打印和使用命令输出?

来自分类Dev

在if语句中使用mysql命令的输出和退出代码

来自分类Dev

在使用cat和tee时隐藏命令的输出

来自分类Dev

使用sed打印和替换ps命令输出中的文本

来自分类Dev

curl 命令使用 bash 脚本 grep 输出和验证

来自分类Dev

fseek和fread C编程