使用指定的分隔符逐行解析文本文件

时间:2014-02-06 16:32:20

标签: c++ parsing boost text-files

我需要使用boost:

从文本文件的每一行获取数字
d$+$B$ 0.0   000 000 000    1.0   255 255 255

类似的东西:

0.0   000 000 000    1.0   255 255 255

在Qt中,它是那样的:

 QString data = input->readLine();
 o_name = data.section('$', 0, 2);
 QStringList dataLst = data.section('$', 3, 3).split(' ', QString::SkipEmptyParts);
while(!dataLst.isEmpty() )
//process

提升中的等效算法是什么?

到目前为止,我只有这个:

boost::iostreams::basic_file<float>( filename,  std::ios_base::in  );

2 个答案:

答案 0 :(得分:2)

这是一个使用boost正则表达式的简短代码段。我试图使用c ++ 11进行同样的工作,但似乎gcc 4.8.2尚不支持:GCC GNU

  std::ifstream ifStreamObject("test", std::ifstream::in);
  if (!ifStreamObject.is_open())
  {
    // nothing to do
    return -1;
  }
  std::string line;
  boost::regex e("\\s+"); // split on whitespaces
  boost::sregex_token_iterator j;
  while (std::getline(ifStreamObject, line))  
  {
    boost::sregex_token_iterator i(line.begin(), line.end(), e, -1);

    while(i!=j)
    {
      // display the tokens for now.. process the data here
      cout << *i++ << endl;
    }
  }

输出:

d$+$B$
0.0
000
000
000
1.0
255
255
255

答案 1 :(得分:0)

你可以使用提升精神:

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/qi_match.hpp>
#include <fstream>
using namespace boost::spirit::qi;

int main()
{
    std::string oname;
    std::vector<double> numbers;

    if (std::ifstream("input.txt") >> std::noskipws 
            >> match(*~char_('$') > '$')
            >> match(*~char_('$') > '$')
            >> match(*~char_('$') > '$', oname)
            >> phrase_match(*double_, blank, numbers))
    {
        std::cout << oname << ": parsed " << numbers.size() << " numbers: ";
        for(auto d : numbers) 
            std::cout << d << " ";
    }
}

打印

B: parsed 8 numbers: 0 0 0 0 1 255 255 255 

为您的样品系列。见 Live On Coliru

  

更新我刚注意到您想要将整个“d $ + $ B $”解析为oname:

        >> match(raw [ repeat(3) [ *~char_('$') > '$' ] ], oname)
     

或者只是

        >> match(*~char_('$') > char_('$'), oname)
        >> match(*~char_('$') > char_('$'), oname)
        >> match(*~char_('$') > char_('$'), oname)
     

将连接到oname