Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #56, ИЮЛЬ 2005 г.

Телефонодобывающий комбайн

Tony (tony@MadTanks.com)

Спецвыпуск: Хакер, номер #056, стр. 056-060-4


//Этот код никогда не откомпилируется со стандартным STL MSVC++ 6.0

ifstream file( string(pathName+"\\"+findData.cFileName).c_str() );

istreambuf_iterator<char> dataBegin(file);

istreambuf_iterator<char> dataEnd;

fileData.clear();

fileData.insert( fileData.begin(), dataBegin, dataEnd );

Для разбиения строки с номером телефона на токены я использую контейнер Tokenizer из библиотеки Boost (www.boost.org). Чтобы исходные коды программы откомпилировались, необходимо установить у себя эту библиотеку и настроить на нее свой компилятор - указать соответствующие пути для заголовочных и экспортных файлов. Boost - весьма мощная библиотека контейнеров, которые Комитет по стандартизации не решился включить в список стандартных контейнеров по тем или иным причинам, когда принимал стандарт STL. Поэтому их и объединили в отдельную библиотеку.

UNICODE

Те два фильтра, которые сейчас используются в CellFinder, работают как с текстовыми, так и с бинарными файлами. Главное - чтобы номер телефона был записан в текстовом формате (кодами символов). Эта программа обнаруживает номера телефонов в любых html-файлах. Также с ее помощью я находил номера в файлах, создаваемых The Bat и Outlook. Фильтры работают с любой MBCS-кодировкой (multibyte-chacter), поскольку коды символов цифр и разделителей меньше 128 (0x80). Если твои файлы сохранены в UNCIODE, необходимо учесть это в фильтре. Еще посоветую использовать wstring вместо string и преобразовывать входное для фильтра содержимое файла из vector<char> в vector<short>. Не забывай перед кавычками в строках ставить символ "L".

//MBCS

string context("Содержимое файла");

char_separator<char> separators("-;|() .:<>/\\,");

vector<char> fileData;

//UNICODE

wstring context(L"Содержимое файла");

char_separator<short> separators(L"-;|() .:<>/\\,");

vector<short> fileData;

Портирование программы

Код CellFinder кросс-платформенный, за одним небольшим исключением: итерации по файлам и подкаталогам указанного каталога реализуются с использованием функций Win32 API. Если ты хочешь портировать программу в Linux или любую другую не M$-ось, то, конечно, придется переписать код поиска файлов.

searchContext = FindFirstFile(string(pathName+"\\*").c_str(), &findData);

while( FindNextFile( searchContext, &findData ) )

{

}

"Поиск ключевых символов"

Назад на стр. 056-060-3  Содержание  Вперед на стр. 056-060-5