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

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

Войти
Регистрация
Восстановить пароль
 
dr.curse
388 / 344 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
#1

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

17.06.2011, 14:33. Просмотров 917. Ответов 11
Метки нет (Все метки)

Вот мой код
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, почему?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2011, 14:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверить одинаковы ли файлы (C++):

Проверить, верно ли, что целая и дробная части заданного вещественного числа одинаковы - C++
Задача: Вывести true если высказывание верно, false в противном случае . Целая и дробная части заданного вещественного числа одинаковы....

Проверить файлы с заранее неизвестными именами - C++
Хочу реализовать вот такое чудо. К примеру есть папка, изначально она пустая. При каждом запуске программы пользователь должен...

не могли бы вы проверить задачу про двоичные файлы? - C++
Всем здравствуйте. наверно немного странная просьба: проверьте на правильность задачку &quot;вывод числа из двоичного файла&quot;, просто сомневаюсь...

Файлы: проверить, сколько раз в файле встречается заданный символ - C++
программа считывает из файла 100 символов и проверяет сколько раз в файле встречается определенный символ(пользователь вводит) не знаю с...

Файлы и строки: проверить каждую строку на сходство друг с другом - C++
У меня такой вопрос, допустим у нас есть текстовый файл, там ОЧЕНЬ много символов, мне нужно проверить каждую строку на сходство друг с...

Типы векторов не одинаковы? - C++
Как добавить исключение если при вводе массива векторов тип оказались не одинаковые то ест я создал template &lt;class T&gt; Но при вводе...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
17.06.2011, 14:56 #2
Вообще-то, раз уж файлы открываются как бинарные, то для чтения логичнее использовать функцию read, а для сравнения memcmp.
Ну а проблема в том, что для определения размеров файлов указатель перемещается в конец, а на начало его никто не возвращает.
1
dr.curse
388 / 344 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
17.06.2011, 15:13  [ТС] #3
Может кто нибудь написать работающий кот, ато никак не получается.
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
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;
}
1
Aneron
158 / 157 / 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();
1
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
17.06.2011, 16:04 #6
через md5 легче проще и приятней будет
1
sandye51
программист С++
684 / 586 / 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;
}
1
dr.curse
388 / 344 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
17.06.2011, 16:33  [ТС] #8
Всем огромное спасибо.
Цитата Сообщение от oxotnik Посмотреть сообщение
через md5 легче проще и приятней будет
а это как?
0
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
17.06.2011, 16:35 #9
Цитата Сообщение от aram_gyumri Посмотреть сообщение
а это как?
скачать сорцы md5
посчитать сумму для одного файла и для 2-го. сравнить суммы, у одинаковых файлов они будут одинаковые.
1
dr.curse
388 / 344 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
17.06.2011, 16:41  [ТС] #10
Спасибо
0
Xtir
11 / 11 / 0
Регистрация: 10.07.2010
Сообщений: 130
17.06.2011, 16:46 #11
выше приведённые коды, работают только с текстовыми файлами, или абсолютно со всеми?
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
17.06.2011, 16:49 #12
Тот, который я исправлял, со всеми, но там не решена проблема сравнения очень больших файлов, если файловый поток поддерживает только 32-битные значения позиции в файле. В принципе и это решается.
Про остальные не знаю
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2011, 16:49
Привет! Вот еще темы с ответами:

Адреса двух разных переменных одинаковы - C++
Добрый день! Пытаюсь вывести в Memo1 адреса переменных: int a=5555; int b=6156; Memo1-&gt;Lines-&gt;Add(IntToStr(&amp;a)); ...

Одинаковы ли оптимизации класса шаблон/константа? - C++
Пусть у меня есть класс: class MyClass{ const long Flag; public: MyClass(const long Flag_V): Flag(Flag_V) {} void...

Найти номера столбцов элементы в каждом из которых одинаковы. - C++
Дано квадратную матрицу А размера n x n целых чисел. Найти номера столбцов, в которых элементы одинаковые. ...

Одинаковы ли символьные коды для всех систем/компиляторов? - C++
То есть будут ли операции типа: char c = 'A'; c += 1; cout &lt;&lt; int(c); Всегда давать одинаковый результат?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.06.2011, 16:49
Ответ Создать тему
Опции темы

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