Boost Qi::p hrase_parse 只读取第一个元素
boost qi::phrase_parse reads only first element
我已经使用boost::spirit
实现了简单的ascii解析器。目标 ASCII 文件如下所示
n
0 23 45 10.0 0.5
.....
n-1 x y .....
但它只返回 measure_list 1 个元素
例如,如果我尝试将 ASCII 读取为一个简单的vector<double>
而不是结构化 - 它工作正常。怎么了?
struct measure
{
int id;
double x, y, size_, angle;
}
BOOST_FUSION_ADAPT_STRUCT(measure, (int, id)(double, x)(double, y)(double, size_)(double, angel))
typedef std::vector<measure> data_t;
void RelativeMeasure(string filename)
{
clear();
if(!filesystem::exists(filename)) return;
file_name = filename;
ifstream calibration_file(filename);
if(calibration_file.is_open())
{
int key_count;
calibration_file >> key_count;
istreambuf_iterator<char> eos;
istreambuf_iterator<char> it(calibration_file);
std::string strver(it, eos);
std::vector<measure> measure_list;
measure_list.reserve(100000);
qi::phrase_parse(strver.begin(), strver.end(), (qi::int_ > qi::double_ > qi::double_ > qi::double_ > qi::double_) % qi::eol, qi::blank, measure_list);
for each(auto measure in measure_list) key_list.push_back(KeyPoint(measure.x, measure.y, measure.size_, measure.angel));
}
我看到的最有可能的罪魁祸首是你在n
之后不吃换行符。也许也可以使用+qi::eol
作为分隔符。
但这并不能解释你会读到第一个条目。
您可以通过使用流式处理 API(在后台使用boost::spirit::istream_iterator
多通道适配器)来简化操作:
住在科里鲁
void RelativeMeasure(std::string filename)
{
std::ifstream calfile(filename, std::ios::binary);
int key_count;
std::vector<measure> measure_list;
using namespace qi;
if (
calfile >> std::noskipws >> phrase_match(int_, blank, key_count)
&& calfile >> phrase_match(qi::repeat(key_count)[int_ > double_ > double_ > double_ > double_ > +eol], blank, measure_list)
)
{
std::vector<KeyPoint> key_list;
key_list.reserve(measure_list.size());
// using a converting constructor (why not parse into this at once?)
std::copy(measure_list.begin(), measure_list.end(), back_inserter(key_list));
}
}
相关文章:
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 全局变量 多读取器 一个写入器多线程安全?
- 如何使用C++读取另一个程序中的源代码输出
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 而(!inputfile.eof())只读取第一行?
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- OpenGL:第二个VBO破坏了第一个VBO
- ifstream 不读取第一行
- UDP 套接字读取最后一个传入字节
- 为什么第一个Dynamic_cast没有投射到基类?
- 解压缩串联的 zlib 流而不读取下一个字节
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值