在Linux中用C打印最后5行文件

时间:2014-10-22 11:29:17

标签: c linux file-io lseek

我需要在C中编写一个程序,它通过使用open,read,write,close,lseek等基本函数打印出最后五行文件。到目前为止我的代码:

int main(int argc, char *argv[]){
    int fd1=open(argv[1], O_RDONLY);
    char c;
    int currPos = lseek(fd1,-2,SEEK_END);
    while(currPos != -1){
        read(fd1,&c,sizeof(c));
        currPos--;
        currPos=lseek(fd1,currPos,SEEK_SET);
        if (c == '\n'){

        }
    }
    return 0;
}

任何人都可以帮助我吗?我想我需要将这些字符存储在数组中然后向后打印,但我不知道如何。

2 个答案:

答案 0 :(得分:1)

为什么不在读回第五个换行符时调用读取的字符数(调用n)然后读取n个字符?您不需要存储数据,它已经存储在文件中。

答案 1 :(得分:1)

在if语句中,您可以计算从文件末尾遇到的'\n'个字符数。当您遇到第6行结束时,您知道您位于第6行的末尾(假设最后一行还包含末尾的行尾字符),所以你只需从那一点打印到文件的末尾。

您不需要将字符保存在数组中,因为它们已保存在您的文件中。 你可以这样做(在你的while循环之后):

int i=read(fd1,&c,1);
while(i){
    printf("%c",c);
    i = read(fd1,&c,1);
}

它可能不是最有效的方法,但它应该可以解决问题。

注意:无需编写sizeof(c),因为ccharchar s总是1个字节长。 此外,您应该始终检查read的返回值,您永远不知道系统出现问题的时间,并且程序因read出错而崩溃。