Проблемы разделения данных при слиянии - PullRequest
1 голос
/ 29 мая 2019

В настоящее время я пытаюсь выполнить слияние двух текстовых файлов 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. Спасибо всем, кто прочитал этот длинный пост!

...