Ваш метод очень неэффективен, но в первую очередь должен работать методом грубой силы. Необходимо исправить несколько деталей:
fscanf()
возвращает EOF
только в конце файла, вам следует проверить, если возвращаемое значение if! = 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)) для создания файлов, которые могут обрабатываться последовательно параллельно.