【问题标题】:Compare two files for common and single Numbers比较两个文件的常见和单个数字
【发布时间】:2018-06-24 19:20:41
【问题描述】:

我想比较两个未知大小的文件(a.txt,b.txt),找出其中的共同和单一数字,然后将它们写入单一和共同的其他文件(commons.txt,single.txt)。文本文件)。我认为下面代码的逻辑是正确的,但由于某种原因,common.txt 和 single.txt 都没有正确的值。

 while (fscanf(a, "%d", &num1) != EOF)
{
    int found = 0;
    while (fscanf(b, "%d", &num2) != EOF)
    {
        if (num1 == num2)
        {
            fprintf(commons, "%d\n", num1);
            found = 1;
            break;
        }

    }
    if (found == 0)
        fprintf(single, "%d\n", num1);

}

【问题讨论】:

  • 您的条件存在缺陷...如果the fscanf function 无法解析来自文件的输入会怎样?这不是导致它返回EOF 的错误。
  • 您确定带有 I/O 的 O(n^2) 算法是一种合理的方法吗?
  • @user3121023 谢谢它的工作,如果你想把它作为答案发布
  • @Someprogrammerdude 我在前面的几行中有 ;)

标签: c file file-io


【解决方案1】:

您的方法效率很低,但应该作为蛮力优先的方法。有几个细节需要修复:

  • fscanf() 仅在文件末尾返回 EOF,您应测试 if != 1 是否返回值,以避免在输入无效时出现无限循环和未定义行为。
  • a 读取每个数字后,您必须回退b

这是修改后的版本:

#include <stdio.h>

int main() {
    FILE *a = fopen("a.txt", "r");
    FILE *b = fopen("a.txt", "r");
    FILE *commons = fopen("commons.txt", "w");
    FILE *single = fopen("single.txt", "w");
    int num1, num2;

    if (a && b && commons && single) {
        while (fscanf(a, "%d", &num1) == 1) {
            int found = 0;
            rewind(b);
            while (fscanf(b, "%d", &num2) == 1) {
                if (num1 == num2) {
                    fprintf(commons, "%d\n", num1);
                    found = 1;
                    break;
                }
            }
            if (found == 0)
                fprintf(single, "%d\n", num1);
        }
        fclose(a);
        fclose(b);
        fclose(commons);
        fclose(single);
    }
    return 0;
}

但请注意,a.txt 中多次出现的数字将在 commons.txt 中重复出现,而仅在 b.txt 中出现的数字在 single.txt 中根本不会出现。这可能不是预期的行为。完整的问题描述会更准确地指定行为,甚至可能暗示应该对输出文件进行排序。

上述实现的时间复杂度为O(Na * Nb)。如果文件b.txt 很大,它会很慢。如果可以预期数据可以放入内存,则可以使用哈希表将复杂性降低到 O(Na + Nb),否则可以使用外部排序,代价为 O(Na * Log(Na)) + O(Nb * Log(Nb)) 生成可以并行顺序处理的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-12
    • 2011-09-16
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    相关资源
    最近更新 更多