qq_41821823
qq_41821823
2019-03-18 23:17

c语言 大量数据在写入文件时会崩溃 急求问题所在和解决办法

20
  • c语言
  • 搜索引擎

想实现的功能是建立一堆文本文件的索引,但是现在已经成功创建了一个索引表,但把索引表存入文件的时候就会进行到一半然后崩溃
需要在目录下创建一个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;
}

很急,求大佬解答

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

2条回答