#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 方法。我目前在 这个阶段但我卡住了***