【问题标题】:Merge two binary files in a new file将两个二进制文件合并到一个新文件中
【发布时间】:2019-06-27 10:20:04
【问题描述】:

我对这种算法有疑问,该算法将 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} 输出文件不正确。

【问题讨论】:

  • 首先,您永远不会检查您的返回值以确保您的任何fread() 调用确实有效。其次,您可能误用了feof(),因为文件结束指示直到您尝试读取文件末尾之后才为真。

标签: c file sorting binaryfiles


【解决方案1】:

您在每次迭代时无条件地读取一个新的 recordTemp1recordTemp1,但请注意,如果一个小于另一个,并且您写了这个,那么您从该输入读取的下一个也可能小于另一个.所以在写完一个之后,你必须从那个输入中读取另一个,也就是说,你已经“消费”了那个,但还没有另一个。

您必须检查fread 的返回值以检测您是否在文件末尾。如果您在一个文件的末尾,您仍然必须从另一个文件读取和写入 reaming 输入。

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    相关资源
    最近更新 更多