Boost Tokenizer: дополнительное пространство?

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

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
2

Другие решения

Если конец строки представлен как \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

Бежать онлайн

1