Форум программистов, компьютерный форум CyberForum.ru

Сравнение содержимого файлов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
kuroiryuu
 Аватар для kuroiryuu
311 / 295 / 23
Регистрация: 05.11.2009
Сообщений: 698
Завершенные тесты: 2
03.03.2010, 09:50     Сравнение содержимого файлов #1
Мини-задача состоит в следующем необходимо найти в одном (А) файле содержимое второго (В).
Так вот хотелось бы получить совет как реализовать сие процесс?

Если содержимое файла В находится в начале файла А, то это реализовать не сложно, а вот если в середине, то начинаются небольшие затруднения
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2010, 09:50     Сравнение содержимого файлов
Посмотрите здесь:

Сравнение содержимого указателей C++
C++ Сравнение файлов
Быстрая сортировка содержимого больших файлов C++
C++ сравнение 2 файлов .txt
C++ сравнение файлов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sekt
 Аватар для Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
03.03.2010, 10:29     Сравнение содержимого файлов #2
C
1
2
3
4
5
6
do {
fgets(str1[i],F1);
fgets(str[j],F2);
if(str1[i]==str2[j])std::cout<<"sovpadaet";
i++;j++;
}while(F2 != eof) // или как там ;)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.03.2010, 10:46     Сравнение содержимого файлов #3
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define A_NAME "a.txt"
#define B_NAME "b.txt"
 
int main(void){
    long a_size, b_size;
    char *a_buf, *b_buf;
    FILE *a, *b;
    
    if ( ( a = fopen(A_NAME, "rb") ) == NULL ){
        fprintf(stderr, "Can't open file: %s\n", A_NAME);
        exit(1);
    }
    fseek(a, 0, SEEK_END);
    a_size = ftell(a);
    if ( !a_size ){
        fprintf(stderr, "File %s is empty!\n", A_NAME);
        exit(1);
    }
    rewind(a);
    
    if ( ( a_buf = (char*)malloc(a_size + 1) ) == NULL ){
        fprintf(stderr, "Memory error!\n");
        exit(1);
    }
    if ( fread(a_buf, sizeof(char), a_size, a) != a_size ){
        fprintf(stderr, "Can't read file: %s\n", A_NAME);
        exit(1);
    }
    a_buf[a_size] = 0;
    fclose(a);
    
    if ( ( b = fopen(B_NAME, "rb") ) == NULL ){
        fprintf(stderr, "Can't open file: %s\n", B_NAME);
        exit(1);
    }
    fseek(b, 0, SEEK_END);
    b_size = ftell(b);
    if ( !b_size ){
        fprintf(stderr, "File %s is empty!\n", B_NAME);
        exit(1);
    }
    rewind(b);
    
    if ( ( b_buf = (char*)malloc(b_size + 1) ) == NULL ){
        fprintf(stderr, "Memory error!\n");
        exit(1);
    }
    if ( fread(b_buf, sizeof(char), b_size, b) != b_size ){
        fprintf(stderr, "Can't read file: %s\n", B_NAME);
        exit(1);
    }
    b_buf[b_size] = 0;
    fclose(b);
    
    printf("File %s %scontain file %s\n", A_NAME, ( strstr(a_buf, b_buf) ) ? "" : "don't ", B_NAME);
    
    free(a_buf);
    free(b_buf);
    exit(0);
}
kuroiryuu
 Аватар для kuroiryuu
311 / 295 / 23
Регистрация: 05.11.2009
Сообщений: 698
Завершенные тесты: 2
03.03.2010, 10:48  [ТС]     Сравнение содержимого файлов #4
Цитата Сообщение от Sekt Посмотреть сообщение
C
1
2
3
4
5
6
do {
fgets(str1[i],F1);
fgets(str[j],F2);
if(str1[i]==str2[j])std::cout<<"sovpadaet";
i++;j++;
}while(F2 != eof) // или как там ;)
а если F2 по размеру меньше, чем F1?
str2 и str1 это массивы указателей на char... и какого они размера?
вся загвоздка в том, что в начале не известно размеров файлов, файлы могут быть любого размера, и кол-во строк содержащихся в них тоже не известно.

to easybudda:
хороший код, но два файла запихиваются в память... это есть не хорошо. всё равно идея хорошая.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.03.2010, 11:32     Сравнение содержимого файлов #5
Цитата Сообщение от kuroiryuu Посмотреть сообщение
но два файла запихиваются в память... это есть не хорошо.
Учитывая отношение размера среднего текстового файла к объёму памяти более-менее современного компьютера это, наверное, не существенно... Но в любом случае второй файл целиком считать прийдётся. После чего установить указатель на начало буфера со вторым файлом, читать по символу из первого файла, пока символы совпадают с символами в буфере, продвигать указатель по буферу. Если буфер закончился - второй файл нашёлся в первом, если очередной считанный символ не совпал с очередным символом в буфере - установить указатель на начало буфера, сравнивать/читать дальше... Можно, конечно, и из второго файла по символу читать, а не сразу все, но как-то мрачно получится... В том плане, что работать будет медленно...
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
03.03.2010, 13:30     Сравнение содержимого файлов #6
Для начала можно сравнить размеры файлов.
Если совпали, то читать кусками в два буфера определенного размера, например, килобайт по 16, и сравнивать их ...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    
    // sz_a, sz_b - размеры файлов
    // szBuffer   - размер буфера
    
    // Сравнение содержимого
    size_t amount = sz_a / szBuffer, bmount = sz_a % szBuffer; 
    UCHAR abuf[szBuffer], bbuf[szBuffer];   // буферы
    for(size_t i = 0; i < amount; i++)
    {
        fread(abuf, sizeof(UCHAR), szBuffer, file_a);
        fread(bbuf, sizeof(UCHAR), szBuffer, file_b);
        if(memcpy(abuf, bbuf, sizeof(UCHAR) * szBuffer) != 0)
        {
            cout << "Файлы не равны" << endl;
            return 0;
        }
    }
    if(bmount != 0)
    {
        fread(abuf, sizeof(UCHAR), bmount, file_a);
        fread(bbuf, sizeof(UCHAR), bmount, file_b);
        if(memcpy(abuf, bbuf, sizeof(UCHAR) * bmount) != 0)
        {
            cout << "Файлы не равны" << endl;
        }
    }
$eRg@
0 / 0 / 0
Регистрация: 18.06.2009
Сообщений: 23
03.03.2010, 13:46     Сравнение содержимого файлов #7
а если в лоб как сроки нам же надо полное включение.=> создаем таблицу символов для включаемого файла закрываем проверяем второй и выводим номер символа с которого начинается в клячение. название метода поиска не помну а подруге делал у нее описание в лекциях было код только малость длинный получился. исходника нет но если идея понравилась могу написать заного.

Добавлено через 1 минуту
посмотри алгоритмы сравнения сток за первый 1 курс
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2010, 16:12     Сравнение содержимого файлов
Еще ссылки по теме:

C++ Сравнение бинарных файлов
C++ Сравнение содержимого файлов на сервере и ПК
Сравнение содержимого каталогов C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kuroiryuu
 Аватар для kuroiryuu
311 / 295 / 23
Регистрация: 05.11.2009
Сообщений: 698
Завершенные тесты: 2
03.03.2010, 16:12  [ТС]     Сравнение содержимого файлов #8
Всем спасибо!
Но всё у меня свелось к занесению файла В в память в виде 2D массива.
Потом происходило построчное чтение из файла А и если массив находится в файле, то хорошо, если же нет - ещё лучше.
При каждом совпадении строки файла и массива увеличивался счётчик, и если счётчик становится равный количеству строк - УРА! - значит такой кусок есть в файле.
Yandex
Объявления
03.03.2010, 16:12     Сравнение содержимого файлов
Ответ Создать тему
Опции темы

Текущее время: 09:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru