将两个二进制文件合并到一个新文件中

时间:2019-02-03 13:10:34

标签: c file sorting binaryfiles

我对此算法有疑问,该算法将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 :(得分:0)

您在每次迭代中无条件地读取了一个新的recordTemp1recordTemp1,但是请注意,如果一个小于另一个,并且您写道,则从该输入中读取的下一个也可以是比其他少。因此,在写完一个之后,您必须从该输入中读取另一个,即您已经“消耗”了一个,但还没有另一个。

您必须检查fread的返回值以检测您是否位于文件末尾。如果您位于一个文件的末尾,则仍必须读写另一文件的重新输入。