В настоящее время я пытаюсь выполнить слияние двух текстовых файлов CSV (file_a и file_b) в третий файл (file_c). Все файлы отсортированы по минимальному идентификатору. Однако я заметил, что при проверке содержимого file_c последняя запись из file_a повторяется вместо показа последней записи file_b (которая имеет самый высокий идентификатор). Я пытался диагностировать проблему безрезультатно.
status_t merge_sort(FILE * file_a,FILE * file_b,FILE*file_c,size_t line_length,registry_t * registry_a,registry_t * registry_b)
{
char * string_a;
char * string_b;
size_t i;
size_t j;
char del = '|';
size_t fields_a;
size_t fields_b;
size_t length_a;
size_t length_b;
i=0;
j=0;
while((string_a=my_getline(file_a,line_length,i))!=NULL&&(string_b=my_getline(file_b,line_length,j))!=NULL)
{
registry_a=load_data(split(string_a,del,&length_a,&fields_a),registry_a);
registry_b=load_data(split(string_b,del,&length_b,&fields_b),registry_b);
if(registry_a==NULL||registry_b==NULL)
return ERROR_LOADING_DATA;
if(registry_a->id > registry_b->id)
{
fprintf(file_c, "%s\n",string_b);
free(string_b);
j++;
}
if (registry_a->id == registry_b->id)
{
free(string_a);
free(string_b);
return ERROR_INVALID_KEY;
}
if (registry_a->id < registry_b->id)
{
fprintf(file_c, "%s\n",string_a);
>puts(string_b);
Здесь ставит (string_b) правильное содержание.
free(string_b);
i++;
}
}
free(string_a);
free(string_b);
while((my_getline(file_a,line_length,i)!=NULL))
{
fprintf(file_c, "%s\n",string_a);
i++;
free(string_a);
}
while((my_getline(file_b,line_length,j)!=NULL))
{
> puts(string_b);
Здесь выводит (string_b) выходные данные содержимого file_a
fprintf(file_c, "%s\n",string_b);
j++;
free(string_b);
}
return OK;
}
Вот функция my_getline, которая, я думаю, может быть причиной этого.
char * my_getline(FILE * fi,size_t line_length,size_t line_number)
{
size_t i;
char * aux_string;
char * p;
if (fi==NULL)
return NULL;
if (fseek(fi, 0, SEEK_SET) != 0)
return NULL;
if ((aux_string = malloc(line_length*sizeof(char)))==NULL)
return NULL;
i=0;
while(fgets(aux_string,line_length,fi)!=NULL)
{
if (i==line_number)
{
if ((p=strchr(aux_string,'\n'))!=NULL)
{
*p='\0';
}
return aux_string;
}
i++;
}
return NULL;
}
Наконец, мне разрешено использовать только функции ANSI 89/99. Спасибо всем, кто прочитал этот длинный пост!