| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Поиск в бинарном файле |
| Автор: TheDestroyer 25.7.2009, 16:56 | ||||
| Здравствуйте, необходимо искать в бинарном файле заданную последовательность байт и запоминать позицию (адрес) для последующей записи в найденное место. Есть пример из MSDN:
Но fseek ставит указатель на заданный адрес, а мне надо найти последовательность байт. Неужели надо использовать fread() в цикле, чтобы пройти по всему файлу? Может есть специальная функция для этого?
Использовать getline() для поиска байтов тут вроде неправильно, т.к. она для текста. Подскажите пожалуйста как правильно найти последовательность байт в бинарном файле и запомнить адрес для последующей записи? |
| Автор: jonie 25.7.2009, 18:21 | ||
вы использете текстовый режим (он по умолчанию) открытия файла:
|
| Автор: TheDestroyer 25.7.2009, 19:15 |
| Спасибо за подсказку, но вопрос остается - как лучше искать заданную последовательность байт в бинарном файле чтобы запомнить адрес для последующей записи? |
| Автор: GoldFinch 25.7.2009, 19:48 |
| TheDestroyer, если файл размеров в единицы-десятки мегобайт, считай его в память, и ищи в памяти |
| Автор: andrew_121 25.7.2009, 20:31 |
| TheDestroyer, Что именно нужно найти в файле? Опишите... |
| Автор: TheDestroyer 25.7.2009, 22:19 | ||
| Описываю: Есть exe фаилы. Необходимо найти в каждом заданную последовательность байт (метку), прочитать начиная с адреса этой метки заданное число байт и прочитав, записать на это место другие заданные байты. Пока никак не могу понять - как искать именно последовательность байт, может так:
Проблемы: 1. Как читать с условием, что еще не конец файла? (аргумент while()) 2. Поиск должен быть непростым поиском совпадения в считанном массиве, т.к. искомая комбинация байт может быть 0x01 0x02 0x03, а считываение может попасть только на часть этой последовательности, в итоге ничего найдено не будет. Наверняка есть стандартный способ для этой задачи. |
| Автор: vnsk 26.7.2009, 13:30 | ||
Вариант на С:
P.S. Предполагается, что в файле нет нулевых символов. В противном случае необходимо написать собственную функцию - аналог strstr() - нахождения построки УЖЕ не в строке, а в массиве данных. Модератор: Не забываем пользоваться кнопочкой "Код" |
| Автор: andrew_121 26.7.2009, 14:37 | ||||
После этой строки нужно добавить:
Судя по этому: искать нужно не строку. |
| Автор: vnsk 26.7.2009, 17:05 | ||
| > После этой строки нужно добавить: > fseek(stream, 0L, SEEK_SET); Да. Обязательною > Судя по этому: > unsigned char Data[] = {0xe9, 0xf2, 0x01, 0x00, 0x00}; > искать нужно не строку. А что больше смущает? - Написание конретной требуемой функции или сенарий "что делать"? Вариант на "С":
Модератор: Не забываем пользоваться кнопочкой "Код" |
| Автор: zim22 26.7.2009, 17:16 | ||||
| vnsk, я вас прошу, во-первых, комментируйте с помощью тегов QUOTE, а не во-вторых, исходники оформляйте с помощью тега CODE *** strlen до нулевого символа считает. она не подходит здесь, т.к. элементы массива могут иметь любые значения.
размер массива определяется так:
|
| Автор: andrew_121 26.7.2009, 19:01 |
| vnsk, Пожалуй....Зим22 все сказал. |
| Автор: jonie 27.7.2009, 09:04 | ||
|
| Автор: ЗапаснойЛеопольд 27.7.2009, 11:19 | ||||||
Это было бы справедливо если sizeof применять к массиву, а не к указателю на char, как у него. int DataInMem( char *data, char *mem, int n_max ) Надо бы вычислять длинну вне функции, и передавать её отдельным аргументом. |