我如何使用 Divide et impera 处理一组文档

问题描述 投票:0回答:0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int lungime(FILE *f, int *nr_linii)
{
    int lung = 0;
    int maxim =-1;
    int c;
    (*nr_linii)=0;
    while((c=fgetc(f))!=EOF)
    {
        if(c == '\n')
        {
            (*nr_linii)++;
            if(lung > maxim)
                maxim = lung;
            lung = 0;
        }
        else
        {
            lung++;
        }
    }
    if(lung > 0)
    {
        (*nr_linii)++;
        if(lung > maxim)
            maxim = lung;

    }
    return maxim;
}


void gasit(char cautat[],char *nume_fis)
{
    FILE *fis = fopen(nume_fis,"r");
    if(fis == NULL)
    {
        exit(1);
    }
    FILE *g = fopen("index.out", "a");
    if(g == NULL)
    {
        exit(1);
    }
    char cuv[31];
    while(fgets(cuv, 31, fis)!=NULL)
    {
        int len = strlen(cuv);
        if(cuv[len-1]=='\n')
        {
            cuv[len-1]='\0';
        }
        if(strcmp(cuv,cautat)==0)
            fprintf(g,"%s\n",nume_fis);
    }
    fclose(fis);
    fclose(g);
}

void divide_et_impera(char **a, int st, int dr, char *termen)
{
    if(st==dr)
    {
        gasit(termen,a[st]);
    }
    else
    {
        int mij=(st+dr)/2;
        divide_et_impera(a,st,mij,termen);
        divide_et_impera(a,mij+1,dr,termen);
  
    }

}





int main()
{
    FILE *f;
    f = fopen("documente.txt", "r");
    if(f == NULL)
    {
        printf("Error\n");
        return 1;
    }
    char termen[31];
    printf("Termenul de cautat:");
    fgets(termen, 31, stdin);
    if(termen[strlen(termen)-1] == '\n')
        {
            termen[strlen(termen)-1] = '\0';
        }
    int n;
    int lung_max = lungime(f, &n);
    char **calea = (char**)malloc(n * sizeof(char*));
    if(calea == NULL)
    {
        return 1;
    }
    for(int i=0;i<n;i++)
    {
        calea[i]=(char *)malloc(lung_max+2);
    }
    fseek(f,0,SEEK_SET);
    int i=0;
    while(fgets(calea[i], lung_max+2, f)!=NULL)
    {
        int len=strlen(calea[i]);
        if(calea[i][len-1]=='\n')
            calea[i][len-1]='\0';
        i++;
    }
    divide_et_impera(calea, 0, n-1, termen);
    for(i=0;i<n;i++)
        free(calea[i]);
    free(calea);
    fclose(f);


    return 0;
}

***> 我需要找到所有包含特定术语的文件

键盘。文件包含最多 31 个字符的术语 在每一行上,文件的路径在 documente.txt 中给出 文件。我需要使用 divide et impera 方法。我目前在 这个阶段但我卡住了***

c divide-and-conquer
© www.soinside.com 2019 - 2024. All rights reserved.