【发布时间】:2019-11-22 09:48:59
【问题描述】:
我试图从末尾开始在文本文件中查找包含子字符串的字符串。该文件有数千万行。 (要求是从文件末尾读取。我不能使用 sed/awk/grep 等)
下面的程序可以完成这项工作,但需要很长时间。我怎样才能让它运行得更快?
#include <stdio.h>
#include <stdlib.h>
char *strrev(char *str)
{
char *p1, *p2;
if (! str || ! *str)
return str;
for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
{
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
}
return str;
}
int main(int argc, char *argv[])
{
FILE *fd;
char len[100];
int ch,count;
int fpos=0;
char *filename = argv[1];
fd = fopen(filename, "r");
fseek(fd, 0, SEEK_END);
fpos = ftell(fd);
while (fpos > 0)
{
fseek(fd, -2, SEEK_CUR);
if(ftell(fd) <= 2)
break;
ch = fgetc(fd);
fpos--;
count = 0;
memset( len, 0, sizeof(len));
while(ch != '\n')
{
len[count++] = ch;
if(ftell(fd) < 2)
break;
fseek(fd, -2, SEEK_CUR);
ch =fgetc(fd);
}
strrev(len);
if( strstr(len,"TEST") !=NULL )
{
printf("Found test. \n");
break;
}
//if(found)
//do other stuff
}
fclose(fd);
}
【问题讨论】:
-
也许您可以使用
fread阅读大量文本。 -
从EOF读取文件时如何读取完整的行?
-
对文件中的每个字符使用
fgetc、ftell和fseek逐字符读取绝对是非常低效的。 -
而且还为每一行调用
strrev效率低下。此外,“聪明的”异或交换的东西效率低下。您应该推出自己的“strstr”,直接搜索反向字符串。但无论如何,如果您阅读大量文本,您甚至不需要反转任何内容。
标签: c linux performance file