Я хотел бы использовать STL (C ++ 0x в vs2010), чтобы открыть файл и выполнить двоичный поиск по нему, а затем заменить при обнаружении совпадения.
Я могу использовать fstream, чтобы открытьфайл, но я немного запутался в том, как искать файл.
Чтение одного байта за раз не очень хорошо, поэтому он должен прочитать блок в буфер, а затем мы ищем в буфере, но этофункциональность уже в STL?
Я хочу, чтобы часть буферизации была автоматической, когда поиск достигнет конца буфера, он должен автоматически прочитать следующий блок из файла, как если бы он читал его напрямую (используясмещения файлов и т. д.1011 * MapViewOfFile но я хочу использовать STL, чтобы сделать мой код переносимым, а также с помощью STL, также более гибким.Используя эти функции Windows, вы можете прочитать файл, не беспокоясь о буферизации и т. Д., Они даже обновят файл при изменении данных.Это функциональность, которую я использую после использования STL.
Обновление : я изменил «бинарный поиск» на «сырой поиск байтов», чтобы устранить путаницу, извините за это.
Пример функции поиска необработанных байтов (, если вам лучше, сообщите )
// NOTE: This function doesn't support big files > 4 gb
DWORD_PTR RawByteSearch( PBYTE pBaseAddress, DWORD dwLowSize, PBYTE pSignature, DWORD sigSize )
{
PBYTE pBasePtr = pBaseAddress;
PBYTE pEndPtr = pBaseAddress + dwLowSize;
DWORD_PTR i;
while ( pBasePtr < pEndPtr )
{
for (i = 0; i < sigSize; ++i)
{
if ( pSignature[i] != pBasePtr[i] )
break;
}
if ( i == sigSize ) // Found a match
{
return pBasePtr - pBaseAddress;
}
++pBasePtr; // Next byte
}
return 0;
}