比较两个文件的公共数字和单个数字

时间:2018-06-24 19:20:41

标签: c file file-io

我想比较两个未知大小的文件(a.txt,b.txt),以查找其中的公共数字和单个数字,然后将它们写入其他公共文件(commons.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);

}

1 个答案:

答案 0 :(得分:1)

您的方法效率很低,但是应该作为蛮力优先方法使用。有一些细节需要解决:

  • fscanf()仅在文件末尾返回EOF,应该测试返回值是否等于!= 1,以避免在无效输入的情况下出现无限循环和不确定行为。
  • b中读取每个数字后,您必须倒退a

这是修改后的版本:

#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)),以生成可以并行并行处理的文件。