Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <string.h>
- void print_difference(int file1,int file2, long pos);
- char* name1; // имя первого файла
- char* name2; // имя второго файла
- int main(int argc, char **argv) {
- if (argc!=3) { // проверка кол-ва аргументов
- printf ("usage format: %s file1 file2\n", argv[0]); // печатаем текст ошибки
- return 1; // возвращаем код ошибки
- }
- name1 = argv[1]; // сохраняем имя первого файла в глобальной переменной
- name2 = argv[2]; // сохраняем имя второго файла в глобальной переменной
- int file1 = open(name1, O_RDWR); // получаем дескриптор первого файла
- int file2 = open(name2, O_RDWR); // получаем дескриптор второго файла
- if (file1 == -1) { // проверка, что первый файл существует
- printf("file %s doesnt exist\n", name1); // печатаем текст ошибки
- return 1; // возвращаем код ошибки
- }
- if (file2 == -1) { // проверка, что второй файл существует
- printf("file %s doesnt exist\n", name2); // печатаем тескст ошибки
- return 1; // возвращаем код ошибки
- }
- int b1 = 0; // буфер для чтения символа из 1го файла
- int b2 = 0; // буфер для чтения символа из 2го файла
- int has_difference = 0; // флаг наличия разницы между файлами
- for (long pos=0 ;; pos++) { // цикл с увеличением переменной pos
- int r1 = read(file1, &b1, 1); // читаем из первого файла в буфер b1
- int r2 = read(file2, &b2, 1); // чиьаем из второго файла в буфер b2
- if (r1 == 0 && r2 == 0) break; // если оба файла кончились - завершаем цикл
- if (r1 > r2) { // если кончился второй файл
- printf("file %s > %s\n", name1, name2); // печатаем информацию
- return 0; // завершаем программу
- }
- if (r2 > r1) { // если кончился первый файл
- printf("file %s < %s\n", name1, name2); // печатаам информацию
- return 0; // завершаем программу
- }
- if (b1 != b2) { // если на текущей позиции есть изменения
- print_difference(file1, file2, pos); // печатаем изменения
- has_difference = 1; // выставляем флаг, что файлы отличаются
- }
- }
- if (!has_difference) { // если файлы идентичны
- printf("file %s is similar to %s\n", name1, name2);
- } else { // если файлы различаются
- printf("file %s is different to %s\n", name1, name2);
- }
- return 0;
- }
- void print_difference(int file1, int file2, long pos) {
- long start = (pos>10) ? pos-10 : 0; // start - начиная с какого символа нужно читать
- long len = pos+11-start; // len - сколько символов нужно прочитать
- lseek(file1, start, SEEK_SET); // встаем в позицию start в первом файле
- lseek(file2, start, SEEK_SET); // встаем в позицию start во втором файле
- char buf[22]; // создаем буфер чтения на 22 символа
- // выводим результат сравнения
- printf("%d\n",pos); // печатаем номер символа
- for (int i=0; i<22; i++) buf[i]='\0'; // очистка буфера
- read(file1, buf, len); // читаем подстроку из первого файла в буфер
- printf("%s %s\n", name1, buf); // выводим имя первого файла и буфер на экран
- for (int i=0; i<22; i++) buf[i]='\0'; // очистка буфера
- read(file2, buf, len); // читаем подстроку из второго файла с буфер
- printf("%s %s\n", name2, buf); // выводим имя второго файла и буфер на экран
- // возвращаемся в следующую позицию после pos
- lseek(file1, pos+1, SEEK_SET); // для первого файла
- lseek(file2, pos+1, SEEK_SET); // и для второго
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement