Во-первых, если я понимаю ваше значение в подразделе «Как я могу эффективно искать», вы не можете просто пропустить несколько мегабайт данных в поиске, если целевая строка может быть в этих первых нескольких мегабайтах.
Что касается загрузки файла в память, если вы это сделаете, не забудьте убедиться, что у вас достаточно места в памяти для всего файла.Вы будете разочарованы, если зайдете в утилиту и обнаружите, что файл объемом 2 ГБ, на котором вы хотите ее использовать, не помещается в 1,5 ГБ памяти, которую вы оставили.
Я предполагаю, что вызагрузите его в память или карту памяти для следующего.
Вы специально сказали, что это двоичный файл, так что это означает, что вы не можете использовать обычный поиск / сопоставление строк C ++ в качестве нулевых символов в данных файлабудет путать его (закончить преждевременно без спички).Вместо этого вы можете использовать memchr для поиска первого вхождения первого байта в вашей цели и memcmp для сравнения следующих нескольких байтов с байтами в цели;продолжайте использовать пары memchr / memcmp для сканирования всего объекта, пока не найдете.Это не самый эффективный способ, так как существуют более эффективные алгоритмы сопоставления с образцом, но я полагаю, что это своего рода эффективный способ.
Чтобы "удалить" n байтов, вы должны фактически переместить данные после этихn байтов, копируя всю вещь в новое место.
Если вы на самом деле копируете данные с диска в память, тогда было бы быстрее манипулировать ими и записывать в новый файл.В противном случае, как только вы найдете место на диске, с которого хотите начать удаление, вы можете открыть новый файл для записи, прочитать байты X из первого файла, где X - позиция указателя файла в первом файле, и записать их.прямо во второй файл, затем перейдите в первый файл к X + n и сделайте то же самое оттуда к файлу file1, добавив его к тому, что вы уже поместили в file2.