读书人

求优化资料已行为单位反向输出程序

发布时间: 2012-12-31 11:57:52 作者: rapoo

求优化文件已行为单位反向输出程序
如题:下面算法是每次都从文件尾开始算,想优化为每次在输出的行的下行为起点。谢谢!

若文件太大现在程序效率太低了,意思是找第二行b时,以c行为起点;找第一行a时,以b行为起点

现在结果:
> ./reverse_1 a.txt
cccccccccc
bbbbbbbbbb
aaaaaaaaaa

a.txt内容
> cat a.txt
aaaaaaaaaa
bbbbbbbbbb
cccccccccc

程序内容:
cat reverse_1.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char *argv[]) {
int ret;

FILE *fp;
int c;
int begin,end=-1;

char readbuf[1024];

fp=fopen(argv[1],"r");

while((begin=fseek(fp,end,SEEK_END))==0) {

if((ret=ftell(fp))==0 || (c=fgetc(fp))=='\n') {
memset(readbuf,0,sizeof(readbuf));
fgets(readbuf,1024,fp);
printf("%s",readbuf);
}

end--;
}

fclose(fp);

exit(0);
}


[解决办法]
楼主是觉得这里循环每次只读一个字节太慢?
c=fgetc(fp))=='\n'

那么能不能记录一下每行的开始位置呢,这样就不用一次一个字节了。


/**
* @file rcat.c
* @brief
*/

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
FILE *fp;
long *pos;
int num, siz;
char buf[1024];

if (argc != 2)
exit(1);

fp = fopen(argv[1], "r");
if (fp == NULL){
perror(argv[1]);
exit(2);
}

num = 0;
siz = 1024;
pos = (long *)malloc(sizeof(long) * siz);
pos[0] = 0;

while (fgets(buf, sizeof(buf), fp)) {
if (++num == siz) {
siz *= 2;
pos = (long *)realloc(pos, sizeof(long) * siz);


}
pos[num] = ftell(fp);
}

while (num--) {
fseek(fp, pos[num], SEEK_SET);
fgets(buf, sizeof(buf), fp);
printf("%s", buf);
}

fclose(fp);

return 0;
}

读书人网 >C语言

热点推荐