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

Проверить одинаковы ли файлы - C++

Восстановить пароль Регистрация
 
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
17.06.2011, 14:33     Проверить одинаковы ли файлы #1
Вот мой код
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
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main()
{
    fstream f1("file1.txt",ios::in|ios::binary);
    fstream f2("file2.txt",ios::in|ios::binary);
    char *block1=new char(16*sizeof(char)),*block2=new char(16*sizeof(char));
    memset(block1,0,sizeof(block1));
    memset(block2,0,sizeof(block2));
    unsigned long long f1size,f2size;
    f1.seekg(0,ios::end);
    f1size=f1.tellg();
    f2.seekg(0,ios::end);
    f2size=f2.tellg();
    if (f1size!=f2size) {cout << "not equal"; return 0;}
    unsigned long long readbytes=0;
    while (readbytes<f1size)
    {
        memset(block1,0,sizeof(block1));
        memset(block2,0,sizeof(block2));
        f1.get(block1,16);
        f2.get(block2,16);
        if (strcmp(block1,block2)) {cout << "not equal"; return 0;}
        readbytes+=sizeof(block1);
    }
    cout << "equal";
    return 0;
}
в file1.txt пишу abc, а в file2.txt cba. Выдает equal, почему?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
17.06.2011, 14:56     Проверить одинаковы ли файлы #2
Вообще-то, раз уж файлы открываются как бинарные, то для чтения логичнее использовать функцию read, а для сравнения memcmp.
Ну а проблема в том, что для определения размеров файлов указатель перемещается в конец, а на начало его никто не возвращает.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
17.06.2011, 15:13  [ТС]     Проверить одинаковы ли файлы #3
Может кто нибудь написать работающий кот, ато никак не получается.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
17.06.2011, 15:29     Проверить одинаковы ли файлы #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
#include <iostream>
#include <fstream>
#include <cstring>
 
int const BLOCK_SIZE = 16;
 
using namespace std;
int main()
{
    fstream f1("file1.txt",ios::in|ios::binary);
    if (!f1)
        { cerr << "Can't open first file" << endl; return -1; }
    fstream f2("file2.txt",ios::in|ios::binary);
    if (!f2)
        { cerr << "Can't open second file" << endl; return -1; }
    char *block1=new char[BLOCK_SIZE], *block2=new char[BLOCK_SIZE];
    unsigned long long f1size,f2size;
    f1.seekg(0,ios::end);
    f1size=f1.tellg();
    f1.seekg(0,ios::beg);
    f2.seekg(0,ios::end);
    f2size=f2.tellg();
    f2.seekg(0,ios::beg);
    if (f1size!=f2size) {cout << "not equal" << endl; return 0;}
    unsigned long long readbytes=0;
    while (readbytes<f1size)
    {
        f1.read(block1, BLOCK_SIZE);
        f2.read(block2, BLOCK_SIZE);
        if (memcmp(block1,block2, f1.gcount())) {cout << "not equal" << endl; return 0;}
        readbytes += f1.gcount();
    }
    cout << "equal" << endl;
    return 0;
}
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
17.06.2011, 15:59     Проверить одинаковы ли файлы #5
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
    FILE *f1,*f2;
    f1 = fopen("1.txt","r");
    f2 = fopen("2.txt","r");
    char f1_c,f2_c;
    if(!f1 || !f2)
    {
        printf("One of the files was not opened.\n");
        getchar();
        return 1;
    }
    f1_c = fgetc(f1);
    f2_c = fgetc(f2);
 
    while( f1!=EOF && f2!=EOF )
    {
        if(f1_c != f2_c)
            break;
        else
        {
            f1_c = fgetc(f1);
            f2_c = fgetc(f2);
        }
    }
    if(f1_c == f2_c)
        printf("Files are identical.\n");
    else
        printf("Files are not identical.\n");
    getchar();
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
17.06.2011, 16:04     Проверить одинаковы ли файлы #6
через md5 легче проще и приятней будет
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
17.06.2011, 16:27     Проверить одинаковы ли файлы #7
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
#include <iostream>
#include <algorithm>
#include <fstream>
#include <conio.h>
#include <stdlib.h>
#include <string>
#include <iterator>
#include <list>
 
using namespace std;
 
bool equalFile(const string& fileName1, const string& fileName2)
{
    list<char> v1, v2;
    copy(istreambuf_iterator<char>(ifstream(fileName1.c_str())), istreambuf_iterator<char>(), back_inserter(v1));
    copy(istreambuf_iterator<char>(ifstream(fileName2.c_str())), istreambuf_iterator<char>(), back_inserter(v2));
    return equal(v1.begin(), v1.end(), v2.begin());
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    string fileName1, fileName2;
    cout << "Введите имя первого файла" << endl;
    cin >> fileName1;
 
    cout << "Введите имя второго файла" << endl;
    cin >> fileName2;
 
    cout << (equalFile(fileName1, fileName2) ? "Одинаковы" : "Разные") << endl;
 
    _getch();
    return EXIT_SUCCESS;
}
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
17.06.2011, 16:33  [ТС]     Проверить одинаковы ли файлы #8
Всем огромное спасибо.
Цитата Сообщение от oxotnik Посмотреть сообщение
через md5 легче проще и приятней будет
а это как?
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
17.06.2011, 16:35     Проверить одинаковы ли файлы #9
Цитата Сообщение от aram_gyumri Посмотреть сообщение
а это как?
скачать сорцы md5
посчитать сумму для одного файла и для 2-го. сравнить суммы, у одинаковых файлов они будут одинаковые.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
17.06.2011, 16:41  [ТС]     Проверить одинаковы ли файлы #10
Спасибо
Xtir
11 / 11 / 0
Регистрация: 10.07.2010
Сообщений: 130
17.06.2011, 16:46     Проверить одинаковы ли файлы #11
выше приведённые коды, работают только с текстовыми файлами, или абсолютно со всеми?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2011, 16:49     Проверить одинаковы ли файлы
Еще ссылки по теме:

Файлы и строки: проверить каждую строку на сходство друг с другом C++
C++ Файлы: проверить, сколько раз в файле встречается заданный символ
C++ Адреса двух разных переменных одинаковы

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
17.06.2011, 16:49     Проверить одинаковы ли файлы #12
Тот, который я исправлял, со всеми, но там не решена проблема сравнения очень больших файлов, если файловый поток поддерживает только 32-битные значения позиции в файле. В принципе и это решается.
Про остальные не знаю
Yandex
Объявления
17.06.2011, 16:49     Проверить одинаковы ли файлы
Ответ Создать тему
Опции темы

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