Сравните два файла и создайте новый с отличиями - PullRequest
0 голосов
/ 31 мая 2019

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

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

Редактировать: файл может содержать более 1 строки данных, обычно, например, 30.

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

Это для домашней работы и инструкции: «Прочитайте файл хоста и проверьте, присутствует ли какая-либо строка в файле ip url, и, если их нет, необходимо записать их во временный файл».

#include <stdio.h>
void main() 
{
FILE *f1, *f2;
int a, b;

f1 = fopen("D:\\product3\\test.txt","r");
f2 = fopen("D:\\product3\\test2.txt", "r");

if(f1 == NULL || f2 == NULL)
{
    printf("Cannot read the files");
}
else
{
    a = getc(f1);
    b = getc(f2);

    while (a != EOF && b != EOF) 
    {
        a = getc(f1);
        b = getc(f2);

        if(a != b)
        {
            printf("");
        }
    }
    if (a == b) 
    {
        printf("\n The files are equal \n");
    }
    else if (a!=b) 
    {
        printf("\n The files aren't equal \n");
    }
    else 
    {
        printf("\n Error \n");
    }
}

fclose(f1);
fclose(f2);
}

Содержимое файлов:

>Test.txt
AAA
aaa
bbb
BBB
111

>Test2.txt
AAA
aaa
bbb
BBB
111
333
444
555
6666
777
CCC

поэтому вывод должен быть:

>333
444
555
6666
777
CCC

Ответы [ 3 ]

1 голос
/ 31 мая 2019

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

function line_exists(l, la)
    for line in la
        if line == l
            return true
    return false

line_array = array()

for line in file1
    line_array.add(line)

for line in file2
    if not line_exists(line, line_array)
        print(line)
1 голос
/ 31 мая 2019

Давайте добавим немного больше кода в тело цикла while, чтобы показать разницу:

while (a != EOF && b != EOF) 
{
    a = getc(f1);
    b = getc(f2);

    if(a != b)
    {
        /* print info about this difference */
    }
}

И после этого добавим информацию о разнице длины файла:

if (a == EOF || b == EOF) 
{
    /* print other characters of the longer file */
}

Пожалуйста, добавьте комментарии здесь, если вы видите какие-либо проблемы в этих маленьких шагах.

И последний шаг будет простым: сохраните разницу в файле (но перед выполнением обоих первых шагов я бы порекомендовал вам использовать printf для печати всего).

0 голосов
/ 31 мая 2019

Это код, который я наконец-то использовал.

void CheckContent(char dir[100])
{

FILE *f1, *f2,*f3;
int a, b;
char dir2[100];
char temporal[100];

strcpy (temporal,"D:\\producto3\\temporal.txt");

printf("\nIntroduce la ruta del archivo donde estan los pares a leer.\n");
scanf("%s", &dir2); 


f1 = fopen(dir, "r");
f2 = fopen(dir2, "r");
f3 = fopen(temporal, "w");


if (f1 == NULL || f2 == NULL)
{
    printf("No se puede leer alguno de los ficheros");
}

else 
{
    char pairLine[256];
    f2 = fopen("D:\\producto3\\pares.txt", "r");

    while (fgets(pairLine, sizeof(pairLine), f2))
    {
        char hostLine[256];
        f1 = fopen("D:\\producto3\\hosts", "r");
        int counter = 0; 
        while (fgets(hostLine, sizeof(hostLine), f1))
        {
            if (hostLine[0] != '#')
            {
                if (strcmp(pairLine, hostLine) == 0)
                {                                   
                    counter++;                      
                }
            }
        }
        fclose(f1);
        if (counter == 0)
        {
            fputs(pairLine,f3);
        }
    }
    fclose(f3);
    fclose(f2);
}
FilePares(dir,temporal);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...