【问题标题】:Binary Files in C: Using fread function and an nlogn sorting issueC 中的二进制文件:使用 fread 函数和 nlogn 排序问题
【发布时间】:2012-07-17 22:04:10
【问题描述】:

非常希望您能帮助我解决以下问题。

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

这是我想做的事情的草图:

1-我知道我不能将fscanf%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 步骤的情况下比较两者?我没有找到任何聪明的方法。

【问题讨论】:

  • 第二部分我可以帮你。分别对 2 个数组进行排序,然后使用合并排序中的合并过程在 O(n) 时间内将它们组合成一个排序数组。 qsort(arr1) , qsort(arr2) , 合并(arr1,arr2) 。如果您需要代码方面的帮助,请联系我。

标签: c string binary binaryfiles


【解决方案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组合数组。

【讨论】:

  • 非常感谢您的回答。我没有得到答案的第二部分。我有两个 N 大小的 int 值数组。(某个值可以在某个数组中出现两次)。假设 A1、A2。我想将两个数组中出现的所有数字写入另一个文件,即两个文件。可以在nlogn中对合并后的数组进行排序,然后怎么办?
  • 然后使用fwrite将数据写入新文件。
  • 但是我怎么知道两个数组共有哪些整数呢?
  • 哦,抱歉,我错过了关于只想打印常见数字的部分。在这种情况下,您要做的是对两个单独的数组中的每一个进行排序。创建第三个数组,对两个输入数组进行合并排序,但丢弃不相等的元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 2015-08-22
  • 2020-12-14
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
相关资源
最近更新 更多