0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 16
1

Сравнить содержимое файлов между собой, и если оно совпадает, то вывести на экран имена этих файлов

17.09.2014, 18:28. Показов 3407. Ответов 15
Метки нет (Все метки)

Прошу помощи у знающих людей.
Существует 2 массива, содержащих названия файлов.Требуется сравнить содержимое файлов между собой, и если оно совпадает,то вывести на экран имена этих файлов.
Понимаю,что я чайник. Сжальтесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2014, 18:28
Ответы с готовыми решениями:

Сравнить содержимое этих файлов и записать в файл H все совподающие компоненты файлов F G
Помогите срочно. Даны текстовые файлы F и G. Сравнить содержимое этих файлов и записать в файл H...

Ввести с клавиатуры расширение файлов; если они существуют, вывести атрибуты этих файлов иначе соотв. сообщение
ввести с клавиатуры расширение файлов; если они существуют, вывести красным цветом на экране...

Переименование PDF-файлов в имена, берущиеся из содержимого этих файлов
Всем доброго времени суток!:) Подскажите, пожалуйста, как переименовать файл с расширением pdf,...

В определенной директории, прочитать все имена файлов и создать папки, с названиями этих файлов
В общем Моя задача, в определенной директории, прочитать все имена файлов и создать папки, с...

15
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.09.2014, 18:35 2
1. открываем оба файла на чтение
2. читаем некоторый блок фиксированного размера из каждого файла
3. сравниваем блоки каким-нибудь memcmp()
4. если блоки разные, то выходим. Если одинаковые, то проверяем, что ещё есть данные и переходим к п.2 сместив позицию чтения.
5. если данных больше нет в одном из файлов, то они разные.

0. Можно сразу выкинуть из сравнения файлы с разными размерами.

Начинайте писать программу. Что не ясно - спрашивайте.
0
5494 / 4889 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.09.2014, 22:06 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
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{ 
    char name_f1[] = "file1.txt";
    char name_f2[] = "file2.txt";
    
    ifstream file1(name_f1, ios::binary); 
    ifstream file2(name_f2, ios::binary);
    if (!file1 || !file2)
        cout << "Error!" << endl;
    else
    {
        char ch1, ch2;
        bool flag = true;
        while (true)
        {
            file1.get(ch1);
            file2.get(ch2);
            if (ch1 != ch2)
            {
               flag = false;
               break;
            }
            if (file1.eof())
               break; 
        }
        if (flag)
            cout << name_f1 << " equal " << name_f2 << endl;
        else
            cout << "Unequal!" << endl;
        
        file1.close();
        file2.close();
    }
    
    system("pause");
    return 0;
}
0
Tulosba
17.09.2014, 22:24
  #4

Не по теме:

alsav22, посимвольное чтение о-о-о-очень не эффективно.

0
alsav22
17.09.2014, 22:39
  #5

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
alsav22, посимвольное чтение о-о-о-очень не эффективно.
В чём неэффективность?

0
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 16
18.09.2014, 02:02  [ТС] 6
В каждом массиве по 3-4 файла
0
5494 / 4889 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.09.2014, 03:09 7
Цитата Сообщение от Pilyla19 Посмотреть сообщение
В каждом массиве по 3-4 файла
Перебирайте массивы, сравнивайте. Сравнивать всё равно два будете.

Добавлено через 1 час 4 минуты
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
65
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{ 
    const int N = 3;
    const int M = 2;
    char* name_f1[N] = {"1.txt", "2.txt", "3.txt"};
    char* name_f2[M] = {"4.txt", "5.txt"};
    
    for (int i = 0; i < N; ++i)
    {
        ifstream file1(name_f1[i], ios::binary);
        if (!file1)
        {
            cout << "Error opening file!" << endl;
            system("pause");
            return 0;
        }
        for (int j = 0; j < M; ++j)
        {
            ifstream file2(name_f2[j], ios::binary);
            if (!file2)
            {
                cout << "Error opening file!" << endl;
                system("pause");
                return 0;
            }
            
            char ch1, ch2;
            bool flag = true;
            while (true)
            {
                file1.get(ch1);
                file2.get(ch2);
                if (ch1 != ch2)
                {
                    flag = false;
                    if (file1.eof())
                    {
                        file1.clear();
                        file1.seekg(0);
                    }
                    break;
                }
                if (file1.eof())
                {
                    file1.clear();
                    file1.seekg(0);
                    break; 
                }
            }
            if (flag)
            {
                cout << name_f1[i] << " equal " << name_f2[j] << endl;
            }
            file2.close();
        }
        file1.close();
    }
    
    system("pause");
    return 0;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.09.2014, 08:32 8
alsav22, неэффективность в скорости разумеется. Насколько я в курсе, самое быстрое чтение будет блоками с размер сектора.
0
5494 / 4889 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.09.2014, 08:34 9

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Насколько я в курсе, самое быстрое чтение будет блоками с размер сектора.
Сектор - это сколько? Когда-то сравнивал скорость разных методов и способов чтения из файла (в том числе и блоками). Помню, что самое быстрое получилось чтение Си-функциями, release, в бинарном режиме, строками (fgets()).
Но, насколько помню, размер блока под сектор не подгонял. Можно проверить.



Добавлено через 14 часов 28 минут

Не по теме:

Посмотрел код, которым я раньше сравнивал скорости. Там несколько другое было: чтение из одного файла и запись в другой, и блок выделялся под размер всего файла. Получалось, что через использование построчных функций, немного быстрее работало. Попробовал блоками - намного быстрее, а вот то, что наибольшую скорость даёт размер блока, равный сектору (512 байт), не подтвердилось. Файл 47мгб, блоками по 50кб и больше, получается быстрее обработать, чем более мелкими блоками (в том числе и по 512 байт).



Добавлено через 14 часов 52 минуты
Тогда так (работает довольно быстро):
Кликните здесь для просмотра всего текста
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <cstdio>
#include <cstdlib>
#include <cstring>
 
inline bool check_open(FILE* file)
{
    if (!file) 
    {
        printf("Error opening file!\n");
        getchar();
        return false;
    }
    return true;
}
 
inline bool check_memory_alloc(char* buffer)
{
    if (!buffer) 
    {
        printf("The memory allocation error!\n");
        getchar();
        return false;
    }
    return true;
}
 
int main()
{ 
    const int N = 3;
    const int M = 2;
    const char* name_f1[N] = {"file1.txt", "file2.txt", "file3.txt"};
    const char* name_f2[M] = {"file4.txt", "file5.txt"};
    
    for (int i = 0; i < N; ++i)
    {
        FILE *file1 = fopen(name_f1[i], "rb"); 
        if (!check_open(file1))
            return 0;
        
        fseek(file1, 0, SEEK_END); 
        int size_f1 = ftell(file1);
        rewind(file1);
        
        char* buffer1 = NULL;
        for (int j = 0; j < M; ++j)
        {
            FILE* file2 = fopen(name_f2[j], "rb");
            if (!check_open(file2))
                return 0;
             
            fseek(file2, 0, SEEK_END); 
            int size_f2 = ftell(file2);
            
            if (size_f1 != size_f2)
            {
                fclose(file2);
                continue;
            }
            
            if (!buffer1)
            {
                buffer1 = (char*) malloc(size_f1);
                if (!check_memory_alloc(buffer1))
                    return 0;
                
                fread(buffer1, 1, size_f1, file1);
            }
            
            char* buffer2 = (char*) malloc(size_f2);
            if (!check_memory_alloc(buffer2))
                    return 0;
            
            rewind(file2);
            fread(buffer2, 1, size_f2, file2);
            
            if (memcmp(buffer1, buffer2, size_f1) != 0)
            {
                free(buffer2);
                fclose(file2);
                continue;
            }
            
            printf("%s%s%s\n", name_f1[i], " equal ", name_f2[j]);
            
            free(buffer2);
            fclose(file2);
        }
        free(buffer1);
        fclose(file1);
    }
    
    printf("Done! Press any key...");
    getchar();
    return 0;
}


Добавлено через 1 час 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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <cstdio>
#include <cstdlib>
#include <cstring>
 
inline bool check_open(FILE* file)
{
    if (!file) 
    {
        printf("Error opening file!\n");
        getchar();
        return false;
    }
    return true;
}
 
inline bool check_memory_alloc(char* buffer)
{
    if (!buffer) 
    {
        printf("The memory allocation error!\n");
        getchar();
        return false;
    }
    return true;
}
 
int main()
{ 
    const int N = 3;
    const int M = 2;
    const char* name_f1[N] = {"file1.txt", "file2.txt", "file3.txt"};
    const char* name_f2[M] = {"file4.txt", "file5.txt"};
   
    int block;
    
    for (int i = 0; i < N; ++i)
    {
        FILE *file1 = fopen(name_f1[i], "rb"); 
        if (!check_open(file1))
            return 0;
        
        fseek(file1, 0, SEEK_END); 
        int size_f1 = ftell(file1);
        rewind(file1);
        
        char* buffer1 = NULL;
        for (int j = 0; j < M; ++j)
        {
            FILE* file2 = fopen(name_f2[j], "rb");
            if (!check_open(file2))
                return 0;
             
            fseek(file2, 0, SEEK_END); 
            int size_f2 = ftell(file2);
            
            if (size_f1 != size_f2)
            {
                fclose(file2);
                continue;
            }
            rewind(file2);
 
            block = size_f1 / 1000;
            if (block < 50)
                block = size_f1;
           
            buffer1 = (char*) malloc(block);
            if (!check_memory_alloc(buffer1))
                return 0;
                
            char* buffer2 = (char*) malloc(block);
            if (!check_memory_alloc(buffer2))
                    return 0;
            
            bool flag = true;
            while (fread(buffer1, block, 1, file1))
            {
                fread(buffer2, block, 1, file2);
                
                if (memcmp(buffer1, buffer2, block) != 0)
                {
                    free(buffer2);
                    free(buffer1);
                    fclose(file2);
                    rewind(file1);
                    flag = false;
                    break;
                }
            }
            if (!flag)
                continue;
 
            printf("%s%s%s\n", name_f1[i], " equal ", name_f2[j]);
            
            free(buffer2);
            fclose(file2);
            free(buffer1);
            rewind(file1);
        }
        fclose(file1);
    }
    
    printf("Done! Press any key...");
    getchar();
    return 0;
}
1
Scrooge McDuck
20.09.2014, 08:46
  #10

Не по теме:

Цитата Сообщение от Pilyla19 Посмотреть сообщение
вывести на экран
Меня всегда смешили подобный фразы студентов - халявщиков. Такие фразы были актуальны лет 25 назад, когда вывести что - то на экран было действительно проблемой. Хотя, тот, кто им даёт такое задание - наверное и сам из тех же лет :)

0
Модератор
Эксперт по электронике
8782 / 6568 / 891
Регистрация: 14.02.2011
Сообщений: 23,069
20.09.2014, 09:17 11
Цитата Сообщение от alsav22 Посмотреть сообщение
Попробовал блоками - намного быстрее, а вот то, что наибольшую скорость даёт размер блока, равный сектору (512 байт), не подтвердилось.
а там нужен размер не сектора а клястера, зависит от ФС,как кстати и сектор,в клястере могут быть несколько секторов

Добавлено через 7 минут
я как то делал поиск дубль файлов
не закончил, неинтересно стало
так что насчет эффективности не скажу
делал так
1 сравнивал размеры, если не равны выходим, хотя тут есть засада, текстовый файл с пробелом в конце, или с переводом строки,с точки зрения машины разные файлы, с точки зрения человека одинаковые
2 считывал 4 байта(инт) и сравнивал, сигнатура файла обычно лежит сначала, если не равны выходим
3 проецировал в память оба файла и сравнивал memcmp
1
5494 / 4889 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.09.2014, 09:17 12
Цитата Сообщение от ValeryS Посмотреть сообщение
а там нужен размер не сектора а клястера, зависит от ФС,как кстати и сектор,в клястере могут быть несколько секторов
Пробовал кластерами(4096 байтов, 8 секторов). Всё равно медленнее, чем более крупными блоками.
0
Эксперт С++
3220 / 1747 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
20.09.2014, 09:59 13
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/////////////////////////////////////////////////////////////////////////////////////////
//Существует 2 массива, содержащих названия файлов.Требуется сравнить содержимое файлов 
//между собой, и если оно совпадает,то вывести на экран имена этих файлов.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <fstream>
#include <functional>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string             T_str;
typedef std::vector < T_str >   T_strings;
/////////////////////////////////////////////////////////////////////////////////////////
bool    files_are_equal
    (
        T_str   const   &   filename_A,
        T_str   const   &   filename_B
    )
{
    std::ifstream   file_A( filename_A );
    std::ifstream   file_B( filename_B );
 
    bool    bool_res    =   file_A  &&  file_B;
 
    if( bool_res )
    {
        std::ostringstream  sout_A;
        sout_A  <<  file_A.rdbuf();
 
        std::ostringstream  sout_B;
        sout_B  <<  file_B.rdbuf();
 
        bool_res    =   sout_A.str() == sout_B.str();
    }//if
 
    return  bool_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
void    in_file_with_name_load_symbol_an_amount
    (
        T_str   const   &   filename,
        char                symb,
        int                 symb_count
    )
{
    std::ofstream( filename )   <<  T_str( symb_count, symb );
}
/////////////////////////////////////////////////////////////////////////////////////////
void    compare_arrays_of_files_and_print_names_of_equal
    (
        T_strings   const   &   A,
        T_strings   const   &   B
    )
{
    std::for_each
        (
            A.begin     (),
            A.end       (),
 
            [=]         ( T_str     const   &   filename_A )
            {
                auto    it  =   std::find_if
                                    (
                                        B.begin     (),
                                        B.end       (),
 
                                        std::bind
                                            (
                                                files_are_equal,
                                                std::placeholders::_1,
                                                filename_A
                                            )
                                    );
 
                if  (
                        it  !=  B.end()
                    )
                {
                    std::cout   <<  "Файлы \""
                                <<  filename_A
                                <<  "\" и \""
                                <<  *it
                                <<  "\" равны."
                                <<  std::endl;
                }//if
            }//lambda
        );//for_each
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
 
    const   T_str   filename_A  =   "a.txt";
    const   T_str   filename_B  =   "b.txt";
    const   T_str   filename_C  =   "c.txt";
 
    const   T_str   filename_D  =   "d.txt";
    const   T_str   filename_E  =   "e.txt";
    const   T_str   filename_F  =   "f.txt";
 
    in_file_with_name_load_symbol_an_amount( filename_A,    'a',    1000000 );
    in_file_with_name_load_symbol_an_amount( filename_B,    'a',    2000000 );
 
    in_file_with_name_load_symbol_an_amount( filename_D,    'a',    2000000 );
    in_file_with_name_load_symbol_an_amount( filename_E,    'a',    3000000 );
 
    T_strings   ABC;
    ABC.push_back( filename_A );
    ABC.push_back( filename_B );
    ABC.push_back( filename_C );
 
    T_strings   DEF;
    DEF.push_back( filename_D );
    DEF.push_back( filename_E );
    DEF.push_back( filename_F );
 
    compare_arrays_of_files_and_print_names_of_equal( ABC, DEF );
 
    system("pause");
}
0
5494 / 4889 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.09.2014, 22:44 14
Про скорость молчу. Если сделать все файлы в массивах одинаковыми?
C++
1
2
3
4
5
6
in_file_with_name_load_symbol_an_amount( filename_A,    'a',    2000000 );
in_file_with_name_load_symbol_an_amount( filename_B,    'a',    2000000 );
in_file_with_name_load_symbol_an_amount( filename_C,    'a',    2000000 );
in_file_with_name_load_symbol_an_amount( filename_D,    'a',    2000000 );
in_file_with_name_load_symbol_an_amount( filename_E,    'a',    2000000 );
in_file_with_name_load_symbol_an_amount( filename_F,    'a',    2000000 );
Выдаст три равенства, а должен девять.

Добавлено через 1 час 25 минут
Во втором коде, в 9 посте, неправильно деление на блоки написал. И перенести, задание размера блока, в первый цикл. У меня, наибольшая скорость (при файлах в 47мгб), получается при размере блока в 128кб.
Кликните здесь для просмотра всего текста
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <cstdio>
#include <cstdlib>
#include <cstring>
 
#include <ctime>
 
inline bool check_open(FILE* file)
{
    if (!file) 
    {
        printf("Error opening file!\n");
        getchar();
        return false;
    }
    return true;
}
 
inline bool check_memory_alloc(char* buffer)
{
    if (!buffer) 
    {
        printf("The memory allocation error!\n");
        getchar();
        return false;
    }
    return true;
}
 
int main()
{ 
    const int N = 3;
    const int M = 3;
    const char* name_f1[N] = {"file1.txt", "file1.txt", "file3.txt"};
    const char* name_f2[M] = {"file4.txt", "file5.txt", "file4.txt"};
    
    const int SIZE_BLOCK = 1024 * 128;
    int block;// = 1024 * 128;
 
clock_t t1 = clock();
    
for (int i = 0; i < N; ++i)
    {
        FILE *file1 = fopen(name_f1[i], "rb"); 
        if (!check_open(file1))
            return 0;
        
        fseek(file1, 0, SEEK_END); 
        int size_f1 = ftell(file1);
        rewind(file1);
        
        if (size_f1 < SIZE_BLOCK) // задание размера блока
            block = size_f1;
        else
            block = SIZE_BLOCK;
        
        char* buffer1 = NULL;
        for (int j = 0; j < M; ++j)
        {
            FILE* file2 = fopen(name_f2[j], "rb");
            if (!check_open(file2))
                return 0;
             
            fseek(file2, 0, SEEK_END); 
            int size_f2 = ftell(file2);
            
            if (size_f1 != size_f2)
            {
                fclose(file2);
                continue;
            }
            rewind(file2);
            
            buffer1 = (char*) malloc(block);
            if (!check_memory_alloc(buffer1))
                return 0;
                
            char* buffer2 = (char*) malloc(block);
            if (!check_memory_alloc(buffer2))
                    return 0;
            
            bool flag = true;
            while (fread(buffer1, block, 1, file1))
            {
                fread(buffer2, block, 1, file2);
                
                if (memcmp(buffer1, buffer2, block) != 0)
                {
                    free(buffer2);
                    free(buffer1);
                    fclose(file2);
                    rewind(file1);
                    flag = false;
                    break;
                }
            }
            if (!flag)
                continue;
 
            printf("%s%s%s\n", name_f1[i], " equal ", name_f2[j]);
            
            free(buffer2);
            fclose(file2);
            free(buffer1);
            rewind(file1);
        }
        fclose(file1);
    }
 
clock_t t2 = clock();
printf("%f\n", (t2 - t1 + .0) / CLOCKS_PER_SEC); // время отработки
    
    printf("Done! Press any key...");
    getchar();
    return 0;
}


Добавлено через 8 минут
Полное сравнение шести файлов (3 х 3), размером по 47 888 896 байт, за 0.42сек (release, оптимизация - максимальная скорость).
0
Эксперт С++
3220 / 1747 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
21.09.2014, 00:22 15
Цитата Сообщение от alsav22 Посмотреть сообщение
Если сделать все файлы в массивах одинаковыми?
Цитата Сообщение от alsav22 Посмотреть сообщение
Выдаст три равенства, а должен девять.
Ну, если двойников возможно несколько, то вот так:
Кликните здесь для просмотра всего текста
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/////////////////////////////////////////////////////////////////////////////////////////
//Существует 2 массива, содержащих названия файлов.Требуется сравнить содержимое файлов 
//между собой, и если оно совпадает,то вывести на экран имена этих файлов.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <fstream>
#include <functional>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string             T_str;
typedef std::vector < T_str >   T_strings;
/////////////////////////////////////////////////////////////////////////////////////////
bool    files_are_equal
    (
        T_str   const   &   filename_A,
        T_str   const   &   filename_B
    )
{
    std::ifstream   file_A( filename_A );
    std::ifstream   file_B( filename_B );
 
    bool    bool_res    =   file_A  &&  file_B;
 
    if( bool_res )
    {
        std::ostringstream  sout_A;
        sout_A  <<  file_A.rdbuf();
 
        std::ostringstream  sout_B;
        sout_B  <<  file_B.rdbuf();
 
        bool_res    =   sout_A.str() == sout_B.str();
    }//if
 
    return  bool_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
void    in_file_with_name_load_symbol_an_amount
    (
        T_str   const   &   filename,
        char                symb,
        unsigned            symb_count
    )
{
    std::ofstream( filename )   <<  T_str( symb_count, symb );
}
/////////////////////////////////////////////////////////////////////////////////////////
void    compare_arrays_of_files_and_print_names_of_equal
    (
        T_strings   const   &   A,
        T_strings   const   &   B
    )
{
    std::for_each
        (
            A.begin     (),
            A.end       (),
 
            [=]         ( T_str     const   &   filename_A )
            {
                std::for_each
                    (
                        B.begin     (),
                        B.end       (),
 
                        [=]         ( T_str     const   &   filename_B )
                        {
                            if  (
                                    files_are_equal
                                        (
                                            filename_A,
                                            filename_B
                                        )
                                )
                            {
                                std::cout   <<  "Файлы \""
                                            <<  filename_A
                                            <<  "\" и \""
                                            <<  filename_B
                                            <<  "\" равны."
                                            <<  std::endl;
                            }
                        }//lambda
                    );//for_each
            }//lambda
        );//for_each
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
 
    const   T_str   filename_A  =   "a.txt";
    const   T_str   filename_B  =   "b.txt";
    const   T_str   filename_C  =   "c.txt";
 
    const   T_str   filename_D  =   "d.txt";
    const   T_str   filename_E  =   "e.txt";
    const   T_str   filename_F  =   "f.txt";
 
    int     symb_count  =   10000000;
 
    in_file_with_name_load_symbol_an_amount( filename_A,    'a',    symb_count );
    in_file_with_name_load_symbol_an_amount( filename_B,    'a',    symb_count );
 
    in_file_with_name_load_symbol_an_amount( filename_D,    'a',    symb_count );
    in_file_with_name_load_symbol_an_amount( filename_E,    'a',    symb_count );
 
    T_strings   ABC;
    ABC.push_back( filename_A );
    ABC.push_back( filename_B );
    ABC.push_back( filename_C );
 
    T_strings   DEF;
    DEF.push_back( filename_D );
    DEF.push_back( filename_E );
    DEF.push_back( filename_F );
 
    compare_arrays_of_files_and_print_names_of_equal( ABC, DEF );
    system("pause");
}


Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Про скорость молчу.
Да я, признаться, за ней и не гнался. Но файлы размером в десятки мегабайт шустренько обрабатывает.

Добавлено через 2 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
У меня
Так це ж на Си!
0
5494 / 4889 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2014, 05:18 16
Цитата Сообщение от Mr.X Посмотреть сообщение
Да я, признаться, за ней и не гнался. Но файлы размером в десятки мегабайт шустренько обрабатывает.
Тут же разговор об эффективности зашёл.
Цитата Сообщение от alsav22 Посмотреть сообщение
Полное сравнение шести файлов (3 х 3), размером по 47 888 896 байт, за 0.42сек (release, оптимизация - максимальная скорость).
Те же файлы (без создания в коде), с вашим кодом - 18.6 сек.

Добавлено через 54 секунды
Цитата Сообщение от Mr.X Посмотреть сообщение
Так це ж на Си!
Так це ж специально!

Добавлено через 4 часа 13 минут
С мапированием - 0.26сек.:
Кликните здесь для просмотра всего текста
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <Windows.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
 
#include <ctime>
 
int main()
{ 
    const int N = 3;
    const int M = 3;
    const char* name_f1[N] = {"file1.txt", "file1.txt", "file3.txt"};
    const char* name_f2[M] = {"file4.txt", "file5.txt", "file4.txt"};
    
clock_t t1 = clock();
    
    for (int i = 0; i < N; ++i)
    {
        HANDLE file1 = CreateFile(name_f1[i], GENERIC_READ, 0, NULL, 
                                  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (file1 == INVALID_HANDLE_VALUE)
        {
            printf("%s%i\n", "CreateFile() Error code = ", GetLastError());
            getchar();
            return 0;
        }
        
        unsigned long size_f1 = GetFileSize(file1, NULL);
        if (size_f1 == INVALID_FILE_SIZE)
        {
            printf("%s%i\n", "GetFileSize() Error code = ", GetLastError());
            CloseHandle(file1);
            getchar();
            return 0;
        }
            
        HANDLE Map_f1  = NULL;
        char *pvSrc_f1 = NULL;
        for (int j = 0; j < M; ++j)
        {
            HANDLE file2 = CreateFile(name_f2[j], GENERIC_READ, 0, NULL, 
                                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
            
            if (file2 == INVALID_HANDLE_VALUE)
            {
                printf("%s%i\n", "CreateFile()! Error code = ", GetLastError());
                getchar();
                return 0;
            }
        
            unsigned long size_f2 = GetFileSize(file2, NULL);
            if (size_f2 == INVALID_FILE_SIZE)
            {
                printf("%s%i\n", "GetFileSize()! Error code = ", GetLastError());
                CloseHandle(file2);
                getchar();
                return 0;
            }
 
            if (size_f1 != size_f2)
            {
                CloseHandle(file2);
                continue;
            }
 
            if (Map_f1 == NULL)
            {
                Map_f1 = CreateFileMapping(file1, NULL, PAGE_READONLY, 0, 0, NULL);
                if (Map_f1 == NULL)
                {
                    printf("%s%i\n", "CreateFileMapping()! Error code = ", GetLastError());
                    CloseHandle(file1);
                    getchar();
                    return 0;
                }
                
                pvSrc_f1 = (char*)MapViewOfFile(Map_f1, FILE_MAP_READ, 0, 0, size_f1);
                if (pvSrc_f1 == NULL)
                {
                    printf("%s%i\n", "MapViewOfFile()! Error code = ", GetLastError());
                    CloseHandle(file1);
                    CloseHandle(Map_f1);
                    getchar();
                    return 0;
                }
                CloseHandle(Map_f1);
            }
 
            HANDLE Map_f2 =  CreateFileMapping(file2, NULL, PAGE_READONLY, 0, 0, NULL);
            if (Map_f2 == NULL)
            {
                printf("%s%i\n", "CreateFileMapping()! Error code = ", GetLastError());
                CloseHandle(file2);
                getchar();
                return 0;
            }
            CloseHandle(file2);
            
            char* pvSrc_f2 = (char*)MapViewOfFile(Map_f2, FILE_MAP_READ, 0, 0, size_f2);
            if (pvSrc_f2 == NULL)
            {
                printf("%s%i\n", "MapViewOfFile()! Error code = ", GetLastError());
                CloseHandle(file2);
                CloseHandle(Map_f2);
                getchar();
                return 0;
            }
            CloseHandle(Map_f2);
            
            if (memcmp(pvSrc_f1, pvSrc_f2, size_f1) != 0)
            {
                UnmapViewOfFile(pvSrc_f2);
                continue;
            }
 
            printf("%s%s%s\n", name_f1[i], " equal ", name_f2[j]);
            
            UnmapViewOfFile(pvSrc_f2);
        } // for()
        CloseHandle(file1);
        
        if (pvSrc_f1 != NULL)
        UnmapViewOfFile(pvSrc_f1);
    } // for()
 
clock_t t2 = clock();
printf("%f\n", (t2 - t1 + .0) / CLOCKS_PER_SEC); // время отработки
    
    printf("Done! Press any key...");
    getchar();
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2014, 05:18
Помогаю со студенческими работами здесь

Найти среднее значение массивов и сравнить их между собой. Вывести на экран большее из них
Найти среднее значение массивов А, B и сравнить их между собой. Вывести на экран большие из них ...

Найти среднее значение массивов А[1..5], B[1..5] и сравнить их между собой. Вывести на экран большие из них
при составлении программы использовать подпрограммы :wall:

Найти среднее значение массивов А[1..5], B[1..5] и сравнить их между собой. Вывести на экран большие из них
В программе использивать подпрограмму-функцию)

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru