Нередко в практике программистов встречаются задачи, когда нужно разобрать строку (как еще иногда говорят - распарсить). Решений этой задачи - множество. Это и простейший поиск очередного символа-разделителя, и регулярные выражения, и специальные алгоритмы (например, из коллекции boost::string_algo). Но иногда логика разбиения строки на части (т. е. логика разбора) может быть ну совсем уж специфичная. Или регулярное выражение получается очень уж навороченное. Или по каким-то причинам библиотека регулярных выражений (тот же boost::regex) неприменима. Тогда на помощь может придти boost::tokenizer.
Вот пример его использования:
#include <iostream>
#include <string>
#include <list>
#include <boost/tokenizer.hpp>
#include <boost/iostreams/device/file.hpp> // file_source
#include <boost/iostreams/stream.hpp> // stream
int _tmain(int argc, _TCHAR* argv[])
{
try
{
// определяем длиннючие типы
typedef boost::iostreams::file_source file_device_type;
typedef boost::iostreams::stream<file_device_type> stream_type;
typedef boost::char_separator<char> token_func_type;
typedef boost::tokenizer<token_func_type> tokenizer_type;
typedef std::list<std::string> token_list_type;
// открываем файл
stream_type strm ( file_device_type("C:\\temp.txt", BOOST_IOS::out|BOOST_IOS::binary) );
strm >> std::noskipws;
// читаем его содержимое в буфер
std::string buffer;
std::copy (
std::istream_iterator<char>(strm),
std::istream_iterator<char>(),
std::back_inserter<std::string>(buffer) );
// разбиваем буфер на токены-слова
// и помещаем их в список строк
//boost::tokenizer<> tok(buffer);
token_func_type sep(" \t\n");
tokenizer_type tok(buffer, sep);
token_list_type tokens_list;
std::copy (
tok.begin(),
tok.end(),
std::back_inserter<token_list_type>(tokens_list) );
// выводим список на печать
std::copy (
tokens_list.begin(),
tokens_list.end(),
std::ostream_iterator<std::string>(std::cout, "\n") );
}
catch ( std::exception & exc )
{
std::cerr << "Exception: " << exc.what() << std::endl;
}
return 0;
}
Комментариев нет:
Отправить комментарий