將大資料載入記憶體中檢索字串
阿新 • • 發佈:2019-01-01
<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"); }