使用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;