Телефонодобывающий комбайн 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 ) ) { … } "Поиск ключевых символов" |