Как сравнить 2 файла лексикографически с помощью C - PullRequest
2 голосов
/ 28 сентября 2010

Эй, ребята, я сейчас пытаюсь реализовать функцию, использующую C, которая принимает два имени файла в качестве аргументов командной строки и сравнивает их лексикографически.

Функция вернет -1, если содержимое первого файла меньше содержимого второго файла, 1, если содержимое второго файла меньше содержимого первого файла, и 0, если файлы тождественны.

Пожалуйста, дайте мне совет, как мне начать с этого.

[EDIT]

Привет, ребята, извините, если в этом вопросе есть неясная часть, поэтому я просто опубликую ссылку на вопрос здесь: Оригинальный вопрос . Дело в том, что это уникальное присваивание, поэтому мы должны делать это, используя только базовые свойства C, возможно, включая только stdio.h, stdlib.h и string.h. Извините за беспокойство. Также вот код, который у меня уже есть, теперь моя главная проблема в том, что функция не знает, что file1.txt (см. Ссылку) имеет первую строку длиннее, чем file2.txt, но на самом деле лексикографически меньше:

int filecmp(char firstFile[], char secondFile[])
{
    int similarity = 0;
    FILE *file1 = fopen(firstFile, "r");
    FILE *file2 = fopen(secondFile, "r");
    char line1[BUFSIZ];
    char line2[BUFSIZ];

    while (similarity == 0)
    {
        if (fgets(line1, sizeof line1, file1) != NULL)
        {
            if (fgets(line2, sizeof line2, file2) != NULL)
            {
                int length;

                if (strlen(line1) > strlen(line2))
                {
                    length = strlen(line1);
                }
                else
                {
                    length = strlen(line2);
                }

                for (int i = 0; i < length; i++)
                {
                    if (line1[i] < line2[i]) similarity = -1;
                    if (line1[i] > line2[i]) similarity = 1;
                }
            }
            else
            {
                similarity = 1; //As file2 is empty
            }
        }
        else
        {
            if (fgets(line2, sizeof line2, file2) != NULL)
            {
                similarity = -1; // As file1 is empty
            }
            else break;
        }
    }

    fclose(file1);
    fclose(file2);

    return similarity;
}

[END EDIT]

Большое спасибо,
Джонатан Чуа

Ответы [ 2 ]

2 голосов
/ 28 сентября 2010

Посмотрите исходный код утилиты UNIX cmp, например, здесь . Соответствующий файл regular.c. Если вы не можете использовать mmap, принцип реализации через fgetc() тот же: продолжайте читать по одному символу из каждого из двух файлов, пока они сравниваются одинаково. Когда (если!) Вы найдете разницу, верните результат сравнения. Пограничный случай, когда один файл является правильным префиксом другого (например, «ABC», «ABCCC»), может быть решен путем обработки EOF как бесконечно малого значения. Это уже аккуратно решено в C, поскольку fgetc() гарантирует возврат отрицательного значения ТОЛЬКО на EOF; правильные символы >= 0.

1 голос
/ 28 сентября 2010

Вам разрешено использовать strcmp?

Если это так (не проверено):

int ret = 0;
while (ret == 0)
{ 
    char line1 [ MAX_LINE_LEN ]; 
    char line2 [ MAX_LINE_LEN ]; 
    if (fgets(line1, MAX_LINE_LEN, file1) != NULL )
    {
        if (fgets(line2, MAX_LINE_LEN, file2) != NULL )
        {
            ret = strcmp(line1, line2);
        }
        else
        {
            ret = 1;
        }
    }
    else
    {
        if (fgets(line2, MAX_LINE_LEN, file2) != NULL )
        {
            ret = -1;
        }
        else
        {
            break;
        }
    }
}
return ret;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...