Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/16: Рейтинг темы: голосов - 16, средняя оценка - 4.56
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526

Сравнение двух файлов по содержанию

03.03.2012, 11:34. Показов 3101. Ответов 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
36
37
38
39
40
41
42
#include <stdio.h>
#include <limits.h>
#include <fcntl.h>
 
void cmp(const char *path1, const char *path2)
{
    int f1, f2;
    char b1, b2;
    int f;
    int ret1, ret2;
    
    f1 = open(path1, O_RDONLY); 
    f2 = open(path2, O_RDONLY);
                
    f = 1;
    while ( (ret1 = read (f1, &b1, 1)) == 1 
           && (ret2 = read(f2, &b2, 1)) == 1 )
        if ( b1 != b2 )
        {
            f = 0;
            break;
        }
    
        if ( !ret1 && !ret2 && f )
            printf("= \n");
        else
            printf("!= \n");
    close(f1);
    close(f2);
}
 
int main(int argc, char* argv[])
{
    if(argc != 3)
    {
        fprintf(stderr, "Wrong arg \n");
        return 1;
    }
    
    cmp(argv[1], argv[2]);
    return 0;
}
но результат не верный. Где моя ошибка?
Bash
1
2
3
4
5
6
7
8
andrey@andrey-VirtualBox:~$ ./cmp_file ./lab.txt ./mydev/project/lab1.txt
!= 
andrey@andrey-VirtualBox:~$ cat ./lab.txt
/home/andrey/mydev
488829 48
andrey@andrey-VirtualBox:~$ cat ./mydev/project/lab1.txt
/home/andrey/mydev
488829 48
Добавлено через 48 секунд
Файлы созданы при помощи копирования.

Добавлено через 2 минуты
Еще вопросы по сравнению: может не по 1 байту сравнивать, а блоками?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.03.2012, 11:34
Ответы с готовыми решениями:

Сравнение двух файлов
Здравствуйте требуется написать программу сравнения двух заданных пользователем файлов необходимо сравнить их и то, чего не хватает в одном...

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

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

7
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.03.2012, 18:10
Вот по-быстрому набросал сравнение файлов блоками по BUFSIZ байтов, вроде работает (писал на скорую руку, так что возможны баги):
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
 
/* 1 - равны, 0 - не равны, -1 - ошибка */
int compare_files(const char* path1, const char* path2)
{
    int ret = 1;
    int fd1, fd2;
    char buf1[BUFSIZ], buf2[BUFSIZ];
    ssize_t rd1, rd2;
 
    fd1 = open(path1, O_RDONLY);
    if(fd1 < 0)
    {
    perror(path1);
    ret = -1;
    goto ex;
    }
 
    fd2 = open(path2, O_RDONLY);
    if(fd2 < 0)
    {
    perror(path2);
    ret = -1;
    goto ex;
    }
 
    while(1)
    {
    rd1 = read(fd1, buf1, BUFSIZ);
    rd2 = read(fd2, buf2, BUFSIZ);
 
    if(rd1 < 0)
    {
        perror(path1);
        ret = -1;
        goto cls;
    }
    if(rd2 < 0)
    {
        perror(path2);
        ret = -1;
        goto cls;
    }
 
    if(rd1 != rd2)
    {
        ret = 0;
        goto cls;
    }
 
    if(rd1 == 0)
        goto cls;
    
    if(strncmp(buf1, buf2, rd1) != 0)
    {
        ret = 0;
        goto cls;
    }
    }
 
 cls:
    close(fd1);
    close(fd2);
    
 ex:
    return ret;
}
 
 
int main(int argc, char* argv[])
{
    int ret = 0;
        
    if(argc != 3)
    {
    fprintf(stderr, "Usage: %s FILE1 FILE2\n", argv[0]);
    ret = 1;
    }
    else
    {
    int result = compare_files(argv[1], argv[2]);
 
    if(result == -1)
    {
        fputs("Can't continue due to error(s)\n", stderr);
        ret = 1;
    }
    else
        printf("`%s' == `%s': %s\n", argv[1], argv[2],
           (result ? "true" : "false"));
    }
            
    exit(ret);
}
1
 Аватар для dr.curse
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
03.03.2012, 18:17
вот моя реализация, пока что не подводила
C
1
2
3
4
5
6
7
8
9
int equal(const char *f1,const char *f2)
{
    FILE *F1=fopen(f1,"r"),*F2=fopen(f2,"r");
    while (!feof(F1) && !feof(F2))
        if (fgetc(F1)!=fgetc(F2)) {fclose(F1); fclose(F2); return 0;}
    fclose(F1);
    fclose(F2);
    return 1;
}
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.03.2012, 18:22  [ТС]
aram_gyumri, так это для текстовых

Добавлено через 35 секунд
Nameless One, а где у меня ошибка не заметили?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.03.2012, 18:29
go, я особо и не смотрел, но что сразу бросилось в глаза, так это то, что не проверяется успешность операций открытия и чтения файла. Конечно, вряд ли именно это приводит к ошибке, но все равно стоит удостовериться. Я бы в на твоем месте просмотрел программу в отладчике на небольших (5-6 символов) файлах, ну или добавил бы отладочную печать. Тогда все станет ясно.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
03.03.2012, 18:30
C
1
while ( (ret1 = read (f1, &b1, 1)) == 1 && (ret2 = read(f2, &b2, 1)) == 1 )
проблема из-за того, что когда файл f1 закончился ret1 == 0, а ret2 не изменится
2
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.03.2012, 18:31
retmas, точно
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
03.03.2012, 19:39
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
#include <iostream>
#include <iterator>
#include <algorithm>
#include <fstream>
 
enum {
  err_no_error = 0,
  err_bad_cmd_line = 1,
  err_open_file = 2,
  err_different_sizes = 3,
  err_different_bytes = 4
};
 
int main(int argc, char* argv[])
{
    if (argc != 3)
    {
    std::cerr << "cmp_file file1 file2" << std::endl;
    return -err_bad_cmd_line;
    }
    
    std::ifstream f1(argv[1], std::ios_base::binary), f2(argv[2], std::ios_base::binary);
    if (!f1 || !f2)
    {
    std::cerr << "error opening file" << std::endl;
    return -err_open_file;
    }
    
    f1.seekg (0, std::ios::end);
    f2.seekg (0, std::ios::end);
    
    if (f1.tellg() != f2.tellg()) 
    {   
    std::cerr << "files has different sizes" << std::endl;
    return -err_different_sizes;
    }
    
    f1.seekg (0, std::ios::beg);
    f2.seekg (0, std::ios::beg);
    
    if (!std::equal (std::istreambuf_iterator<char, std::char_traits<char> >(f1.rdbuf()),
             std::istreambuf_iterator<char, std::char_traits<char> >(),
                     std::istreambuf_iterator<char, std::char_traits<char> >(f2.rdbuf())))
    {
    std::cerr << "files differs" << std::endl;
    return -err_different_bytes;
    }
    
    std::cout << "files are equal" << std::endl;
    return err_no_error;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.03.2012, 19:39
Помогаю со студенческими работами здесь

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

Сравнение двух файлов
Есть два лог-файла. Один вчерашний, другой сегодняшний. Необходимо в третий файл вывести новые записи из первого по сравнению со вторым, а...

Сравнение двух файлов
Добрый день, уважаемые форумчане! Нужно сделать программку, которая сравнивает два файла 1.txt и 2.txt, где 1.txt это произвольный текст,...

Сравнение двух файлов.
Привет всем. В БАТ тольуо учусь, сильно не пинайте. В общем, задача такая: 1 текстовый файл имеет кучу строк (от 10 и больше) ...

Сравнение двух файлов по содержимому
string Ver1; string Ver2; StreamReader reader = new StreamReader(Environment.CurrentDirectory +...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru