微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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;

原文地址:https://www.jb51.cc/c/116259.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐