【发布时间】: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