1. 程式人生 > >將大資料載入記憶體中檢索字串

將大資料載入記憶體中檢索字串

<pre name="code" class="cpp"><pre name="code" class="cpp">#define _CRT_SECURE_NO_WARNINGS

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

char **pp = NULL;  // 儲存指標陣列的地址

void initDataToMemory(char *path)
{
	pp = (char **)malloc(sizeof(char *)* 13180807);
	FILE *pf = fopen(path, "r");
	if (pf == NULL)
	{
		printf("Fail!\n");
	}
	else
	{
		for (int i = 0; i < 13180807; 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("載入記憶體成功!\n");
}

int getLine(char *path)
{
	FILE *pf;
	pf = fopen(path, "r");  //讀取
	if (pf == NULL)
	{
		return -1;  //獲取失敗
	}
	else
	{
		int i = 0;
		while (!feof(pf)) //是否到檔案末尾
			//返回值為0,表示沒有到檔案末尾
		{
			char str[275];
			fgets(str, 275, pf); //讀取一行
			i++;  //統計行數
		}
		fclose(pf);

		return i;
	}
}
//共 13180807 行 *4/1024/1024  50M
//申請指標,每一個指標指向一行

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;
	}
}  

char *findStr(char *searchStr)
{
	for (int i = 0; i < 13180807; i++)
	{
		char *pTemp = strstr(pp[i], searchStr);
		//遍歷所有的指標陣列的地址,字串查詢
		if (pTemp != NULL)
		{
			printf("\n%s", pp[i]); //列印字串
		}
	}
}

void main()
{
	/*char *path = "E:\\dangdangwang.txt";
	int num = getFileSize(path);
	printf("%d位元組, %f K, %f M,%f G", num, num / 1024.0,
		num / 1024.0 / 1024.0, num / 1024.0 / 1024.0 / 1024.0);
<span style="white-space:pre">	</span>*/
	char *path = "E:\\dangdangwang.txt";

	//printf("\n\n有%d行\n", getLine(path));
	initDataToMemory(path);  //將檔案資料載入記憶體

	while (1)  //在記憶體中檢索
	{
		char searchStr[100] = { 0 };
		scanf("%s", searchStr);
		findStr(searchStr);
	}
	
	system("pause");
}