Boost Tokenizer:额外 Space?
Boost Tokenizer: Extra Space?
我正在使用 Boost Tokenizer 删除格式化坐标,例如 (x,y)。但是,它在 删除后添加了一个额外的 space 。没有 space,但我不知道如何摆脱它。
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);
}
}
在向量中,结果如下:
[x][y][space]
如果行尾表示为 \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
"I can't figure out how to get rid of this."
从文件中获取一行文本后,但在开始解析标记之前,您可以使用 boost::trim()
从获取的行中删除所有前导和尾随空格:
std::getline(iss, line);
boost::trim(line); // <== added
我正在使用 Boost Tokenizer 删除格式化坐标,例如 (x,y)。但是,它在 删除后添加了一个额外的 space 。没有 space,但我不知道如何摆脱它。
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);
}
}
在向量中,结果如下:
[x][y][space]
如果行尾表示为 \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
"I can't figure out how to get rid of this."
从文件中获取一行文本后,但在开始解析标记之前,您可以使用 boost::trim()
从获取的行中删除所有前导和尾随空格:
std::getline(iss, line);
boost::trim(line); // <== added