C:只读取文件的最后一行.没有循环

使用C,有没有办法只读取文件的最后一行而不循环它的整个内容

事情是该文件包含数百万行,每行包含一个整数(long long int).文件本身可能非常大,我认为甚至高达1000mb.我确定最后一行不会超过55位数,但也可能只有2位数.使用任何类型的数据库都没有选择…我已经考虑过了.

也许这是一个愚蠢的问题,但是来自PHP背景我觉得很难回答.我到处看,但一无所获.

目前我正在使用:

if ((fd = fopen(filename,"r")) != NULL) // open file
{
    fseek(fd,SEEK_SET); // make sure start from 0
    while(!feof(fd))
    {
        memset(buff,0x00,buff_len); // clean buffer
        fscanf(fd,"%[^\n]\n",buff); // read file *prefer using fscanf
    }
    printf("Last Line :: %d\n",atoi(buff)); // for testing I'm using small integers
}

这样我循环文件内容,一旦文件大于~500k行,事情就会慢下来……

先感谢您.
格言

解决方法

如果有最大线长,请在结束前寻找该距离.
读到最后,找到缓冲区中的最后一行.

如果没有最大行长度,猜一个合理的值,最后读取那么多,如果没有行尾,请加倍猜测并再试一次.

在你的情况下:

/* max length including newline */
static const long max_len = 55 + 1;
/* space for all of that plus a nul terminator */
char buf[max_len + 1];

/* Now read that many bytes from the end of the file */
fseek(fd,-max_len,SEEK_END);
ssize_t len = read(fd,buf,max_len);

/* don't forget the nul terminator */
buf[len] = '\0';

/* and find the last newline character (there must be one,right?) */
char *last_newline = strrchr(buf,'\n');
char *last_line = last_newline+1;

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...