Объединить два двоичных файла в новый файл - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть вопрос об этом алгоритме, который объединяет 2 отсортированных входных двоичных файла в 1, новый двоичный файл.Структура представляет собой целое число:

typedef struct intero_s
{
    int dato;
} intero_t;

Чтение, запись и сортировка 2 входных файлов не проблема, вместо этого иногда объединение файлов не работает.

void fusioneNaturale(const char *input1, const char *input2, const char *output)
{
    FILE *finput1 = fopen(input1, "rb");
    if(finput1 == NULL) {
        printf("Impossibile aprire il file!\n");
        exit(1);
    }
    FILE *finput2 = fopen(input2, "rb");
    if(finput2 == NULL) {
        printf("Impossibile aprire il file!\n");
        exit(1);
    }
    FILE *foutput = fopen(output, "wb");
    intero_t recordTemp1, recordTemp2;
    bool prosegui = true;
    while(prosegui) {
        fread(&recordTemp1, sizeof(recordTemp1), 1, finput1);
        fread(&recordTemp2, sizeof(recordTemp2), 1, finput2);
        if(recordTemp1.dato < recordTemp2.dato) {
            fwrite(&recordTemp1, sizeof(recordTemp1), 1, foutput);
            fseek(finput2, sizeof(recordTemp2) * (-1), SEEK_CUR);
        }
        else {
            fwrite(&recordTemp2, sizeof(recordTemp2), 1, foutput);
            fseek(finput1, sizeof(recordTemp1) * (-1), SEEK_CUR);
        }
        if(feof(finput1)) {
            fseek(finput2, sizeof(recordTemp2), SEEK_CUR);
            while(fread(&recordTemp2, sizeof(recordTemp2), 1, finput2)) {
                fwrite(&recordTemp2, sizeof(recordTemp2), 1, foutput);
            }
            prosegui = false;
        }
        if(feof(finput2)) {
            fseek(finput1, sizeof(recordTemp1), SEEK_CUR);
            while(fread(&recordTemp1, sizeof(recordTemp1), 1, finput1)) {
                fwrite(&recordTemp1, sizeof(recordTemp1), 1, foutput);
            }
            prosegui = false;
        }
    }
    fclose(finput1);
    fclose(finput2);
    fclose(foutput);
}

Параметры - это имя первого файла, имя второго файла и имя третьего файла.Например, если 2 входных файла содержат соответственно {1;3;4;7;9} и {2;4;5;6;9;9} выходной файл является правильным, вместо этого, если 2 входных файла содержат соответственно {3;6} и {0;2;4;6;7;9} выходной файл неверен.

1 Ответ

0 голосов
/ 03 февраля 2019

Вы безоговорочно читаете новые recordTemp1 и recordTemp1 на каждой итерации, но учтите, что если одна из них меньше другой, и вы написали это, следующая, которую вы читаете из этого ввода, также может быть меньше другой,Поэтому после написания одного вы должны прочитать другой из этого ввода, т. Е. Вы «потребили» этот, но еще не другой.

Вы должны проверить возвращаемое значение fread, чтобы определить, если вынаходятся в конце файла.Если вы находитесь в конце одного файла, вы все равно должны прочитать и записать ввод для повторного анализа из другого файла.

...