0

我真的很想得到你对以下问题的帮助。

我需要从两个两个二进制文件中读取N个整数(二进制格式) ,并在O(nlogn)时间内将所有常见整数(再次以二进制格式)写入另一个输出文件。

这是我想要做的草图:

1-我知道我不能使用fscanfwith %d,因为这些不是文本文件,但是因为我知道每个文件中有 N 个数字,所以我想在“for”循环中运行 N 次并且

for (i=0; i<N; i++) {
    fread(&int1, 4, 1, file1);
    fread(&int2, 4, 1, file2);
    arr1[i]=int1;
    arr2[i]=int2;
} 

在哪里arr1arr2每个都是 N 大小的 int 数组,这是正确的吗?如果我知道有 N 个整数,其中每个整数由 4 位表示,我会在文件末尾完成,是吗?

2-我想qsort用步骤对每个数组进行排序nlogn,但是我应该如何在仍然 nlogn 步骤的情况下比较两者?我没有找到任何聪明的方法。

4

1 回答 1

1

您的代码大部分是正确的,但它在到达文件末尾时将无法正常运行。 fread直到您尝试读取结尾才检测到 EOF,因此您应该测试返回值以防它达到 EOF 或发生错误,例如:

if(fread(..., file1) < 1 ||
   fread(..., file2) < 1)
{
    // Error or EOF occurred
    break;
}

您也可以在一次fread调用中直接读取整个数组,而不是循环,因为数据是二进制的:

int arr1[20], arr2[20];
if(fread(arr1, sizeof(arr1[0]), 20, file1) < 20 ||
   fread(arr2, sizeof(arr2[0]), 20, file2) < 20)
{
    // Error or early EOF occurred
}

对于第二个问题,只需将所有整数放入一个平面数组中。您可以通过将它们直接读入单个数组来执行此操作,或者在读入所有数据后将它们复制到一个数组中。然后qsort是组合数组。

于 2012-07-18T19:22:14.713 回答