2015-12-13 5 views
1

Я использую Boost Tokenizer для удаления форматированных координат, например (x, y). Однако после удаление дополнительного места . Нет пробелов, но я не могу понять, как избавиться от этого.Boost Tokenizer: дополнительное пространство?

while (std::getline(input, line)) { 
    boost::char_separator<char> sep("(),"); 
    typedef boost::tokenizer<boost::char_separator<char> > tokenizer; 
    tokenizer tok(line, sep); 
    for (auto &i : tok) { 
     _edges.push_back(i); 
    } 
} 

В векторе, результат состоит в следующем:

[х] [у] [пробел]

ответ

1

«Я не могу понять, как избавиться от этого».

После того, как вы приволок строку текста из файла, но перед началом разбора лексем, вы можете использовать boost::trim(), чтобы удалить начальные и конечные пробелы из извлеченной строки:

std::getline(iss, line); 
boost::trim(line); // <== added 
+0

совершенна и лаконичной решения , Это, похоже, зависит от системы, но это хороший ресурс, который можно найти в сумке. – badfilms

1

Если конец линии представлен в виде \r\n (например, на Windows-машина), вы будете иметь описанное вами поведение. getline в качестве разделителя по умолчанию использует \n.

#include <iostream> 
#include <vector> 
#include <sstream> 
#include <boost/tokenizer.hpp> 

int main() { 

    std::string line;; 
    std::istringstream iss("(1,2)\r\n"); 

    std::getline(iss, line); 
    std::cout << "length: " << line.length() << std::endl; // 6, includes '\r' 

    boost::char_separator<char> sep("(),"); 
    typedef boost::tokenizer<boost::char_separator<char> > tokenizer; 
    tokenizer tok(line, sep); 
    for (auto &i : tok) { 
    std::cout << "ith tok: " << i << std::endl; 
    } 

    return 0; 
} 

Печать:

length: 6 
ith tok: 1 
ith tok: 2 
ith tok: 

Чтобы решить эту проблему, вы можете изменить разделитель или написать метод, который разбирает координату из потока, как это:

#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <sstream> 
#include <iterator> 

template <typename CharT, typename CharTraits, typename T> 
std::basic_istream<CharT, CharTraits>& operator >>(std::basic_istream<CharT, CharTraits>& is, std::vector<T>& v) 
{ 
    typedef typename std::vector<T> vector_type; 
    typedef typename vector_type::size_type size_type; 

    CharT ch; 
    const size_type size = 2; 

    vector_type s{0,0}; 
    if(is >> ch && ch != '(') 
    { 
    is.putback(ch); 
    is.setstate(std::ios_base::failbit); 
    } 
    else if(!is.fail()) 
    { 
    for(size_type i = 0; i != size; ++i) 
    { 
     if(is >> std::ws >> s[i] >> ch && ch != ',') 
     { 
     is.putback(ch); 
     if(i < size - 1) 
      is.setstate(std::ios_base::failbit); 
     break; 
     } 
    } 

    if(is >> ch && ch != ')') 
    { 
     is.putback(ch); 
     is.setstate(std::ios_base::failbit); 
    } 
    } 

    if(!is.fail()) 
    v.swap(s); 

    return is; 
} 

int main() { 

    std::vector<int> v; 
    std::istringstream is("(1, 2)\r\n"); 
    is >> v; 

    std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << std::endl; 

    return 0; 
} 

распечаток

1 2 

Пробег online

Смежные вопросы