海量数据查询:
由于要查询的数据较多,如果在磁盘上进行查询则速度较慢,这时可以把要查询的相关数据读到内存中,然后再进行查询。
这儿是使用的把数据按行读入到内存中,然后在内存中进行查询。
这儿需要注意的几个问题是开辟内存时的初始化工作,
比如初始化 memset(g_bh, "\0", sizeof(char *)*NUM); //初始化时这儿不小心把 '\0' 写成了 "\0",结果造成了意想不到的程序崩溃...
这样的大意造成的后果不太会查。所以一定要小心。
由于此处用了大量的分配内存 malloc,一是分配后要进行初始化工作,二是要进行分配后的判断内存分配是否成功。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<string.h>
#define NUM 2027358
//#define LINE 254 //一行最大长度
char **g_bh;
int getnum(char *path) //得到行数
{
int num = 0; //统计行数
FILE *pfr = fopen(path, "r");
if (pfr == NULL)
{
return -1;
}
else
{
char str[256] = { 0 };
while (fgets(str, 255, pfr))
{
num++;
}
}
return num;
}
int getmax(char *path) //得到最大行数据长度
{
int num = 0; //统计行数
FILE *pfr = fopen(path, "r");
if (pfr == NULL)
{
return -1;
}
else
{
char str[1024] = { 0 };
while (fgets(str, 255, pfr))
{
int length = strlen(str);
if (num < length)
num = length;
}
}
return num;
}
void getmem(char *path)
{
//初始化
printf("init start...\n");
g_bh = malloc(sizeof(char *)*NUM); //分配内存
//初始化时这儿不小心把 '\0' 写成了 "\0",结果造成了意想不到的程序崩溃...
//memset(g_bh, "\0", sizeof(char *)*NUM);
memset(g_bh, '\0', sizeof(char *)*NUM); //初始化
FILE *pfr = fopen(path, "r");
if (pfr == NULL)
{
return;
}
else
{
for (int i = 0; i < NUM; i++)
{
char str[1024] = { 0 };
fgets(str,1024, pfr);
int length = strlen(str);
if (length >=1)
{
g_bh[i] = malloc(sizeof(char)*length+1);
memset(g_bh[i], '\0', length+1); //初始化
if (g_bh[i] != NULL) //如果内存分配成功则拷贝数据
{
strcpy(g_bh[i], str);
}
}
}
}
fclose(pfr);
printf("init end\n");
}
void search(char *search)
{
//从读到内存中的数据中查询数据
int num = 0;
for (int i = 0; i < NUM; i++)
{
if (g_bh[i] != NULL) //做大数据一定要严禁,否则出错就讨厌了。
{
if (strstr(g_bh[i], search))
{
printf("\n %d:%s\n", ++num, g_bh[i]);
}
}
}
}
char *path = "E:\\baihe.txt";
void main()
{
//printf("%d\n", getnum(path));d
//printf("%d\n", getmax(path));
//printf("开始读入数据到内存......\n");
Sleep(5000);
getmem(path);
while (1)
{
printf("请输入要查询的名字:");
char name[30];
scanf("%s", name);
search(name);
}
system("pause");
}