ошибка в программе, сравнивающей файлы

Тема в разделе "LANGS.C", создана пользователем TerraIncognita, 26 июн 2008.

  1. TerraIncognita

    TerraIncognita New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2008
    Сообщения:
    22
    Написал программку для сравнения файлов. только не работает нормально почему-то. сверяет только до адресу 0xFFF.

    кому не лень разобраться, скажите, плиз, что не так? вроде ведь все правильно..

    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3.  
    4. #define MAX_FILES 10
    5.  
    6. int main(int argc, char *argv[]) {
    7.     HANDLE file_handles[MAX_FILES];
    8.     HANDLE file_maps[MAX_FILES];
    9.     unsigned char *file_pmems[MAX_FILES];
    10.     unsigned char file_bytes[MAX_FILES];
    11.     unsigned int i, sz_file, err;
    12.     unsigned int pp = 0;
    13.     unsigned char *cur_ptr;
    14.     unsigned char lst;
    15.     if (argc-1 > MAX_FILES) {
    16.         printf("Error: MAX_FILES = 5\n");
    17.         return 1;
    18.     }
    19.     if (argc < 3) {
    20.         printf("Error: argc < 3\n");
    21.         return 1;
    22.     }
    23.     for (i = 0; i < argc-1; i++) {
    24.         file_handles[i] = CreateFile(argv[i+1], GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
    25.         if (file_handles[i] == 0xFFFFFFFF) {
    26.             printf("Error: CreateFile\n");
    27.             return 1;
    28.         }
    29.     }
    30.     for (i = 0; i < argc-1; i++) {
    31.         file_maps[i] = CreateFileMapping(file_handles[i], 0, PAGE_READONLY, 0, 0, 0);
    32.         if (file_maps[i] == 0) {
    33.             printf("Error: CreateFileMapping\n");
    34.             return 1;
    35.         }
    36.     }
    37.     for (i = 0; i < argc-1; i++) {
    38.         file_pmems[i] = MapViewOfFile(file_maps[i], FILE_MAP_READ, 0, 0, 0);
    39.         if (file_pmems[i] == 0) {
    40.             printf("Error: MapViewOfFile\n");
    41.         }
    42.     }
    43.     sz_file = GetFileSize(file_handles[0], 0);
    44.     while (pp < sz_file) {
    45.         for (i = 0; i < argc-1; i++) {
    46.             cur_ptr = file_pmems[i];
    47.             cur_ptr += pp;
    48.             file_bytes[i] = *cur_ptr;
    49.         }
    50.         lst = file_bytes[0];
    51.         err = 0;
    52.         for (i = 1; i < argc-1; i++) {
    53.             if (file_bytes[i] != lst) {
    54.                 err = 1;
    55.                 break;
    56.             }
    57.             lst = file_bytes[i];
    58.         }
    59.         if (err) {
    60.             printf("%X:\t", pp);
    61.             printf("%X", file_bytes[0]);
    62.             for (i = 1; i < argc-1; i++)
    63.                 printf("\t%X", file_bytes[i]);
    64.             putchar('\n');
    65.         }
    66.         ++pp;
    67.     }
    68.     for (i = 0; i < argc-1; i++) {
    69.         UnmapViewOfFile(file_pmems[i]);
    70.         CloseHandle(file_maps[i]);
    71.         CloseHandle(file_handles[i]);
    72.     }
    73.     return 0;
    74. }
     
  2. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Посмотри пример в эташе.
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    TerraIncognita
    Токшо проверил, всё работает правильно, файлы размером 48 мб. Может они у тебя различны?
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    я в шоке культурном - зачем три цикла в начале?
     
  5. doesn

    doesn New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2007
    Сообщения:
    97
    а зачем есть же
    Z:\>fc /?
    Сравнение двух файлов или двух наборов файлов
    и вывод различий между ними.


    FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/u] [/W]
    [/nnnn][диск1:][путь1]имя_файла1 [диск2:][путь2]имя_файла2
    FC /B [диск1:][путь1]имя_файла1 [диск2:][путь2]имя_файла2

    /A Вывод только первой и последней строк для каждой группы различий.
    /B Сравнение двоичных файлов.
    /C Сравнение без учета регистра символов.
    /L Сравнение файлов в формате ASCII.
    /LBn Максимальное число несоответствий
    для заданного числа строк.
    /N Вывод номеров строк при сравнении текстовых файлов ASCII.
    /OFF[LINE] Не пропускать файлы с установленным атрибутом "Автономный".
    /T Символы табуляции не заменяются эквивалентным числом пробелов.
    /U Сравнение файлов в формате UNICODE.
    /W Пропуск пробелов и символов табуляции при сравнении.
    /nnnn Число последовательных совпадающих строк, которое
    должно встретиться после группы несовпадающих.
    [диск1:][путь1]имя_файла1
    Указывает первый файл или набор файлов для сравнения.
    [диск2:][путь2]имя_файла2
    Указывает второй файл или набор файлов для сравнения.