内存数据查询

来源:互联网 发布:mac 右键菜单 编辑:程序博客网 时间:2024/05/05 15:46

海量数据查询:

由于要查询的数据较多,如果在磁盘上进行查询则速度较慢,这时可以把要查询的相关数据读到内存中,然后再进行查询。

这儿是使用的把数据按行读入到内存中,然后在内存中进行查询。

这儿需要注意的几个问题是开辟内存时的初始化工作,

比如初始化 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");}


0 0
原创粉丝点击