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

前端之家收集整理的这篇文章主要介绍了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&C++相关文章