2014-10-22 117 views
0

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

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; 
} 

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

+0

你的代码效率很低。如果可能的话,'read'应该与几千字节的缓冲区一起使用,并且您应该*总是*使用它的返回值并检查错误! – 2014-10-22 13:27:23

回答

1

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

1

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

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

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

它可能不是做最有效的方式,但它应该做的伎俩。

注意:无需编写sizeof(c),因为ccharchar s总是1个字节长。 另外,你应该总是检查返回值read,你永远不知道系统中什么时候出现错误,并且你的程序因为read出错而崩溃。