2

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);
    }
}

ベクトルでは、結果は次のようになります。

[x][y][スペース]

4

2 に答える 2

3

「これを取り除く方法がわかりません。」

ファイルからテキスト行を取得したら、トークンの解析を開始する前に、 を使用boost::trim()して、取得した行から先頭と末尾の空白を削除できます。

std::getline(iss, line);
boost::trim(line);  // <== added
于 2015-12-15T00:08:13.483 に答える
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

オンラインで実行

于 2015-12-14T23:40:29.083 に答える