要对一个有几百万行的txt检索出其中的一行:
思路:先计算出具体有多少行,每一行可以看作是一个char *的指针,例如我的renrenwang.txt 有1367866行,那就定义一个char **pp他是一个二级指针,也可以看作是一个指针数组pp[i]表示其中的一行.因为每一行的长度不一样,如果按照最长的一个对其的话,就有可能浪费了许多内存,可以用 fgets(str,275,pf),读取一行放入缓冲区str中,然后strlen求出一行的大小,动态分配此大小的内存空间,再把指向这个内存空间的指针赋值给pp[i],就实现了用一个二级指针管理很多个动态分配的内存.原理如图,图中文件的行数假设为100.
#define _CRT_SECURE_NO_WARNINGS //关闭安全检查
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char **pp=NULL;//存储指针数组的地址
void initdatatomem(char *path)
{
pp= (char **)malloc(sizeof(char *)* 1367866);
FILE *pf = fopen(path, "r");
if (pf == NULL)
{
printf("fail");
}
else
{
for (int i = 0; i < 1367866; i++)//关键代码
{
char str[275] = {0};
fgets(str, 275, pf);//依次读取
int strlength = strlen(str) + 1;//获取要分配的字符串长度
char *px = (char *)malloc(sizeof(char *)*strlength);//分配内存
strcpy(px, str);
px[strlength - 1] = '\0';//设定最后一个字符为'\0'
pp[i] = px;
}
}
printf("载入内存ok\n");
}
void *findstr(char *searchstr)
{
for (int i = 0; i < 1367866; i++)
{
char *ptemp = strstr(pp[i], searchstr);//遍历指针数组 字符串查找
if (ptemp != NULL)
{
printf("\n%s", pp[i]);//打印
}
}
}
int getfilesize(char *path)
{
FILE *pf;
pf = fopen(path, "r");//读取方式打开
if (pf == NULL)
{
return -1;//表示打开失败
}
else
{
fseek(pf, 0, SEEK_END);//把文件指针移动到文件末尾
int num = ftell(pf);//获取文件指针开始到当前位置有多少个字节
fclose(pf);
return num;
}
}
int getn(char *path)
{
FILE *pf;
pf = fopen(path, "r");//读取方式打开
if (pf == NULL)
{
return -1;//表示打开失败
}
else
{
int i = 0;
while (!feof(pf))//判断是否到了文件末尾
{
char str[275];
fgets(str, 275, pf);//读取一行
i++;//获取有多少行
}
fclose(pf);
return i;
}
}
void main()
{
char *path = "C:\\Users\\Administrator\\Desktop\\大数据\\人人网500W数据库泄露\\renrenwang.txt";
int num = getfilesize(path);
printf("%d字节,%fK,%fM", num, num/1024.0, num/1024.0/1024.0);
printf("\n有%d行", getn(path));//1367866
initdatatomem(path);
char searchstr[100];
scanf("%s", searchstr);
findstr(searchstr);
system("pause");
}