想实现的功能是建立一堆文本文件的索引,但是现在已经成功创建了一个索引表,但把索引表存入文件的时候就会进行到一半然后崩溃
需要在目录下创建一个book文件夹储存信息
现在的问题
信息太多时候写入最后save_index 崩溃
释放内存好像不行
代码如下
头文件
#ifndef Searchengine_H
#define Searchengine_H
#include <stdio.h>
#include <windows.h>
#include<stdlib.h>
struct word_place //保存单词的地址
{
int book_id;
char book_name[30];
long int location;
};
typedef struct word_place place;
typedef struct key* key_node;
struct key //为每个关键词创造一个节点
{
int id;
char key[20];
int find_number;
place *places;
};
key_node key_information[1000000];
struct file_inf //搜索文件的序号
{
int number;
char name[100];
}file_information[10000];
void find(char * lpPath);
int find_word(char* word);
void add_key(char* word,int num,long int place) ;
int is_letter(char c) ;
void index_a_book(int num) ;
void kuaipai(int left,int right,key_node a[]) ;
void save_index(int x);
#endif
遍历文件夹获取文件信息的文件
#include"search_engine.h"
void find(char * lpPath) //读取一个文件夹的文件名
{
int i=0;
char szFind[MAX_PATH],szFile[MAX_PATH];
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
strcpy(szFind,lpPath);
strcat(szFind,"\\*.*");
hFind = FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind)
return;
while(TRUE)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(FindFileData.cFileName[0]!='.')
{
strcpy(szFile,lpPath);
strcat(szFile,"\\");
strcat(szFile,FindFileData.cFileName);
find(szFile);
}
}
else
{
// printf("%s\n",FindFileData.cFileName);
file_information[i].number=i;
strcpy(file_information[i].name,FindFileData.cFileName);
i++;
}
if(!FindNextFile(hFind,&FindFileData))
{
file_information[i].name[0]='\0';
break;
}
}
}
void save_filenum()//储存文件序列
{
int i=0;
FILE *fp;
if((fp=fopen("book index.txt","r+"))==NULL)
{printf("open error\n");
exit(0);
}
char* is_write="0";
fscanf(fp,"%s",&is_write);
printf("%c\n",is_write);
if (is_write=='0')
fclose(fp);
else
{
is_write="1";
fseek(fp,0,0);
fprintf(fp,"%s\n",is_write);
}
for(i=0;file_information[i].name[0];i++)
{
fprintf(fp,"%d ",file_information[i].number);
fprintf(fp,"%s\n",file_information[i].name);
}
fclose(fp);
}
创建和储存索引的函数
#include"search_engine.h"
int find_word(char* word) //判断是否为已有的关键词
{
int i;
for(i=0;key_information[i];i++)
{
if(strcmp(key_information[i]->key,word)==0)
break;
}
return i;
}//少一个储存查找的算法
void add_key(char* word,int num,long int place) //把关键词添加到索引中
{
int i=find_word(word);
if(!key_information[i])
{
key_information[i]=(key_node)malloc(sizeof(struct key));
strcpy(key_information[i]->key,word);
key_information[i]->find_number=1;
key_information[i]->places=(struct word_place*)malloc(100*sizeof(struct word_place)) ;
}
else
key_information[i]->find_number++;
int temp=key_information[i]->find_number-1;
if(temp%98==0)
key_information[i]->places=(struct word_place*)realloc(key_information[i]->places,(temp+100)*sizeof(struct word_place));
strcpy(key_information[i]->places[temp].book_name,file_information[num].name);
key_information[i]->places[temp].book_id=num;
key_information[i]->places[temp].location=place;
}
int is_letter(char c) //判断一个字符是否是特殊字符
{
if(c >='0' && c<='9')
return 1;
else if(c >='a' && c<='z' || c >='A' && c<='Z')
return 2;
else return 0;
}
void index_a_book(int num) //为一本书中的单词建立索引
{
FILE *fp;
char* name=file_information[num].name;
char way[100]="book\\";
strcat(way,name);
printf("%s\n",way);
if((fp=fopen(way,"r+"))==NULL)
{printf("open error\n");
exit(0);
}
char* read;
read=(char*)malloc(sizeof(char)*100);
long int place=0;
fseek(fp,0L,SEEK_SET);
while(!feof(fp))
{
fscanf(fp,"%s",read);
if(is_letter(read[strlen(read)-1])==0)
read[strlen(read)-1]=0;
if(is_letter(read[0])==2)//首为必须为字母
{
printf("%s\n",read);
add_key(read,num,place);
place++;
}
}
fclose(fp);
}
void kuaipai(int left,int right,key_node a[]) //对列表快速排序
{
int i,j;
char* middle;
key_node temp;
i=left;
j=right;
middle=a[(i+j)/2]->key;
do{
while(strcmp(a[i]->key,middle)<0&&i<right)
i++;
while(strcmp(a[j]->key,middle)>0&&j>left)
j--;
if(i<=j)
{
temp=a[i],a[i]=a[j],a[j]=temp;
j--;
i++;
}
}while(i<=j);
if(left<j)
kuaipai(left,j,a);
if(right>i)
kuaipai(i,right,a);
}
void save_index(int x)//储存索引
{
FILE *fp;
if((fp=fopen("word index.txt","w+"))==NULL)
{printf("open error\n");
exit(0);
}
printf("open success\n");
printf("%d",x);
int i,j;
fprintf(fp,"%d\n",x);
i=0;
printf("%d %s %d \n",i,key_information[i]->key,key_information[i]->find_number);
printf("%c %d",key_information[i]->key[0],is_letter(key_information[i]->key[0]));
fprintf(fp,"%d %s %d ",i,key_information[i]->key,key_information[i]->find_number);
/* for(i=0;i<100;i++)
{
fprintf(fp,"%d %s %d ",i,key_information[i]->key,key_information[i]->find_number);
for(j=0;j<key_information[i]->find_number;j++)
{
fprintf(fp,"%d %d ",key_information[i]->places[j].book_id,key_information[i]->places[j].location);
}
fprintf(fp,"ok\n");
}*/
fclose(fp);
}
主函数
#include"search_engine.h"
//void add index()
int main()
{
char filepath[MAX_PATH]="book"; //可自己输入文件夹绝对路径
find(filepath);
int i=0;
/* for(i=0;file_information[i].name[0];i++)
{
printf("%d %s\n",file_information[i].number,file_information[i].name);
}*/
save_filenum();
for(i=0;file_information[i].name[0];i++)
{
index_a_book(i);
}
/*for(i=0;key_information[i];i++)
{
printf("%s\n",key_information[i]->key);
}
printf("%s\n",key_information[1]->places[0].book_name);*/
int word_num;
for(i=0;key_information[i];i++)
;
word_num=i-1;
kuaipai(0,word_num,key_information);
printf("ok\n");
save_index(word_num);
system("PAUSE");
for(i=0;key_information[i];i++)
{
free(key_information[i]);
}
return 0;
}
很急,求大佬解答