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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
kuroiryuu
316 / 300 / 23
Регистрация: 05.11.2009
Сообщений: 712
Завершенные тесты: 2
#1

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

03.03.2010, 09:50. Просмотров 2154. Ответов 7
Метки нет (Все метки)

Мини-задача состоит в следующем необходимо найти в одном (А) файле содержимое второго (В).
Так вот хотелось бы получить совет как реализовать сие процесс?

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

Сравнение содержимого файлов на сервере и ПК - C++
Ребят имеется код,который читает содержимое файла в интернете x.txt и содержимое файла x.txt на компе, если их содержимое одинаково, то он...

Сравнение содержимого указателей - C++
В строке while ( helpspec -> namespec != temp -> namespec ){…} выражение ( helpspec -> namespec != temp -> namespec ) дает...

Сравнение содержимого каталогов - C++
В задаче сказано: "написать программу для сравнения содержимого каталогов" Подсказали что нужно использовать find first,find next. Так...

Быстрая сортировка содержимого больших файлов - C++
Здравствуйте. Поставлена такая задача - отсортировать содержимое файла. Человек сразу сказал, что файлы могут быть больших размеров....

сравнение файлов - C++
Нужно доделать программу вот по такому заданию Даны символьные файлы f и s . Записать в файл h все начальные совпадающие компоненты...

Сравнение файлов - C++
Привет всем ! Дано два текстовых файла. Сравнить их содержимое и в новый файл записать либо номер первой строки, в которой они...

Написать С++ приложение для просмотра содержимого файлов образов *.iso - C++
Доброго времени суток! Тема моей курсовой: Написать Windows-приложение для просмотра содержимого файлов образов *.iso для ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Эксперт CЭксперт С++
9470 / 5483 / 927
Регистрация: 25.07.2009
Сообщений: 10,505
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
316 / 300 / 23
Регистрация: 05.11.2009
Сообщений: 712
Завершенные тесты: 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
Эксперт CЭксперт С++
9470 / 5483 / 927
Регистрация: 25.07.2009
Сообщений: 10,505
03.03.2010, 11:32     Сравнение содержимого файлов #5
Цитата Сообщение от kuroiryuu Посмотреть сообщение
но два файла запихиваются в память... это есть не хорошо.
Учитывая отношение размера среднего текстового файла к объёму памяти более-менее современного компьютера это, наверное, не существенно... Но в любом случае второй файл целиком считать прийдётся. После чего установить указатель на начало буфера со вторым файлом, читать по символу из первого файла, пока символы совпадают с символами в буфере, продвигать указатель по буферу. Если буфер закончился - второй файл нашёлся в первом, если очередной считанный символ не совпал с очередным символом в буфере - установить указатель на начало буфера, сравнивать/читать дальше... Можно, конечно, и из второго файла по символу читать, а не сразу все, но как-то мрачно получится... В том плане, что работать будет медленно...
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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     Сравнение содержимого файлов
Еще ссылки по теме:

Побайтовое сравнение 2 файлов - C++
Ребят , кто может написать хороший для побайтового сравнения 2 любых файлов ? Хочу посмотреть как это должно выглядеть. Заранее спасибо...

Просмотр содержимого локального диска в 16-м виде по адресам секторов и имени файлов - C++
Как можно реализовать эту программу? Искал на MSDN и ничего не нашел... Подскажите, плиз.

Побайтное сравнение двух файлов - C++
#include &lt;locale.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; int main(int argc, char *args) { setlocale(LC_ALL, &quot;rus&quot;); ...

Сравнение двух текстовых файлов - C++
Объясните, пожалуйста, как работает код #include&lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;locale.h&gt; #include &lt;conio.h&gt; #include...

Сравнение двух дисковых файлов - C++
Здравствуйте, как написать функцию, которая сравнивает содержимое двух дисковых файлов и выдает сообщение, если есть хотя бы одно...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru