Поиск и замена байтов в файле.

Тема в разделе "WASM.BEGINNERS", создана пользователем _Juicy, 19 фев 2009.

  1. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Прошу прощения за тупой вопрос.

    В крупном файле нужно найти и заменить небольшую последовательность байт.
    Как это делается не через ж... стандартными методами? Заранее спасибо за подробный алгоритм.
    WinAPI
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    CreateFile, SetFilePointer, WriteFile, CloseHandle
     
  3. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    MSoft
    А где ReadFile?
    А как искать байты :)
     
  4. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Вот именно :)
    И куда ReadFile? Некое шестое чувство мне подсказывает, что здесь должен быть MapViewOfFile, но хоцца узнать мнение опытных товарищей.
     
  5. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Squash
    Если размеры позволяют можно отмапить весь файл в память и искать как в обычном буфере.
    Или в цикле читать блоками в память.
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    мда, слово "найти" я как-то упустил из виду :)
     
  7. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Например, так:
    http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Squash
    Или вот так :)
     
  9. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    А если последовательность окажется на границе блоков?

    gazlan, Mikl___
    Это не совсем то.
    Общие принципы поиска я знаю, проблема с конкретной-применительно-к винапи реализацией.
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    а помему не fopen, fscanf, fseek, fprintf, fclose?))))) окрываешь файл на чтение/запись, начинаешь считывать от начала блоками необходимого тебе размера, перемещая указатель от начала файла по байту за каждую итекация (но заметь, что fscanf тоже передвигает указатель, будь повнимательнее с этим), до значения (длина файла - длина блока)... если байты найдены - меняешь их... я просто не понял, а в чем проблема то?
     
  11. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Rel
    Ты знаешь что такое WinAPI?
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    представь себе... функции то аналогичны по своей сути... алгоритм указан... какими из них решать данную проблему - решать ТС... а в чем проблема поиска байт, я так и не понял...
     
  13. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Rel
    страшная тайна
    не WinAPI
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    пуфффф... я ващет и не утверждаю, что это винапи функции...
     
  15. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Тогда прочитайте еще раз вопрос
     
  16. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    блин... так я и хочу узнать, зачем ему именно винапи?
    вот:
     
  17. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Чтобы не #include <stdio.h> :)

    Всем спасибо, пришлось читать мысыдеэн самостоятельно.
    Файл смаплен в память целиком MapViewOfFile, сравнение байт сделано через дурацкую конструкцию типа
    Код (Text):
    1. if ((pFileMap[i] == 0xXX) &&
    2.     (pFileMap[i+1] == 0xXX) &&
    3.     (pFileMap[i+2] == 0xXX) &&
    4.     (pFileMap[i+3] == 0xXX) && ...
    благо последовательность невелика,

    как это делается по-человечески, я по-прежнему не знаю :dntknw:
     
  18. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    можно сделать типа строку таких байт и сравнивать в цикле по символу... каждый раз смещая входную строку на 1 байт по файлу...