我对此算法有疑问,该算法将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}输出文件不正确。
答案 0 :(得分:0)
您在每次迭代中无条件地读取了一个新的recordTemp1
和recordTemp1
,但是请注意,如果一个小于另一个,并且您写道,则从该输入中读取的下一个也可以是比其他少。因此,在写完一个之后,您必须从该输入中读取另一个,即您已经“消耗”了一个,但还没有另一个。
您必须检查fread
的返回值以检测您是否位于文件末尾。如果您位于一个文件的末尾,则仍必须读写另一文件的重新输入。