Advertisement
DPOH-VAR

belkov finddif

Dec 6th, 2013
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.81 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4. #include <string.h>
  5.  
  6. void print_difference(int file1,int file2, long pos);
  7.  
  8. char* name1; // имя первого файла
  9. char* name2; // имя второго файла
  10.  
  11. int main(int argc, char **argv) {  
  12.     if (argc!=3) { // проверка кол-ва аргументов
  13.         printf ("usage format: %s file1 file2\n", argv[0]); // печатаем текст ошибки
  14.         return 1; // возвращаем код ошибки
  15.     }
  16.    
  17.     name1 = argv[1]; // сохраняем имя первого файла в глобальной переменной
  18.     name2 = argv[2]; // сохраняем имя второго файла в глобальной переменной
  19.    
  20.     int file1 = open(name1, O_RDWR); // получаем дескриптор первого файла
  21.     int file2 = open(name2, O_RDWR); // получаем дескриптор второго файла
  22.    
  23.     if (file1 == -1) { // проверка, что первый файл существует
  24.         printf("file %s doesnt exist\n", name1); // печатаем текст ошибки
  25.         return 1; // возвращаем код ошибки
  26.     }
  27.    
  28.     if (file2 == -1) { // проверка, что второй файл существует
  29.         printf("file %s doesnt exist\n", name2); // печатаем тескст ошибки
  30.         return 1; // возвращаем код ошибки
  31.     }
  32.    
  33.     int b1 = 0; // буфер для чтения символа из 1го файла
  34.     int b2 = 0; // буфер для чтения символа из 2го файла
  35.     int has_difference = 0; // флаг наличия разницы между файлами
  36.    
  37.     for (long pos=0 ;; pos++) {  // цикл с увеличением переменной pos
  38.         int r1 = read(file1, &b1, 1); // читаем из первого файла в буфер b1
  39.         int r2 = read(file2, &b2, 1); // чиьаем из второго файла в буфер b2
  40.        
  41.         if (r1 == 0 && r2 == 0) break; // если оба файла кончились - завершаем цикл
  42.        
  43.         if (r1 > r2) { // если кончился второй файл
  44.             printf("file %s > %s\n", name1, name2); // печатаем информацию
  45.             return 0; // завершаем программу
  46.         }
  47.        
  48.         if (r2 > r1) { // если кончился первый файл
  49.             printf("file %s < %s\n", name1, name2); // печатаам информацию
  50.             return 0; // завершаем программу
  51.         }
  52.        
  53.         if (b1 != b2) { // если на текущей позиции есть изменения
  54.             print_difference(file1, file2, pos); // печатаем изменения
  55.             has_difference = 1; // выставляем флаг, что файлы отличаются
  56.         }
  57.     }
  58.    
  59.     if (!has_difference) { // если файлы идентичны
  60.         printf("file %s is similar to %s\n", name1, name2);    
  61.     } else { // если файлы различаются
  62.         printf("file %s is different to %s\n", name1, name2);
  63.     }
  64.    
  65.     return 0;  
  66. }
  67.  
  68. void print_difference(int file1, int file2, long pos) {
  69.     long start = (pos>10) ? pos-10 : 0; // start - начиная с какого символа нужно читать
  70.     long len = pos+11-start; // len - сколько символов нужно прочитать
  71.    
  72.     lseek(file1, start, SEEK_SET); // встаем в позицию start в первом файле
  73.     lseek(file2, start, SEEK_SET); // встаем в позицию start во втором файле
  74.    
  75.     char buf[22]; // создаем буфер чтения на 22 символа
  76.    
  77.     // выводим результат сравнения
  78.     printf("%d\n",pos); // печатаем номер символа
  79.     for (int i=0; i<22; i++) buf[i]='\0'; // очистка буфера
  80.     read(file1, buf, len); // читаем подстроку из первого файла в буфер
  81.     printf("%s %s\n", name1, buf); // выводим имя первого файла и буфер на экран
  82.     for (int i=0; i<22; i++) buf[i]='\0'; // очистка буфера
  83.     read(file2, buf, len); // читаем подстроку из второго файла с буфер
  84.     printf("%s %s\n", name2, buf); // выводим имя второго файла и буфер на экран
  85.    
  86.     // возвращаемся в следующую позицию после pos
  87.     lseek(file1, pos+1, SEEK_SET); // для первого файла
  88.     lseek(file2, pos+1, SEEK_SET); // и для второго
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement