我想比较两个未知大小的文件(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);
}
答案 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)),以生成可以并行并行处理的文件。