Сравните два файла для общего и одного номера - PullRequest
0 голосов
/ 24 июня 2018

Я хочу сравнить два файла (a.txt, b.txt) с неизвестным размером, чтобы найти общие и единичные числа, которые находятся внутри них, а затем записать их в один и объединить другие файлы (commons.txt, single). текст). Я думаю, что логика для нижеследующего кода правильная, но по каким-то причинам и 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 голосов
/ 24 июня 2018

Ваш метод очень неэффективен, но в первую очередь должен работать методом грубой силы. Необходимо исправить несколько деталей:

  • 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)) для создания файлов, которые могут обрабатываться последовательно параллельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...