我正在尝试解析一个gcode,并且只想从每行中提取G1的x和y坐标
GCODE示例G1 X123.456 Y125.425 Z34.321
我尝试了基本的getline()
函数,但它打印了整行,不明白如何添加过滤器到getline()
,以只提取x和y数值,并只为行与G1的开始。
#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>
#include <fstream>
using std::cout; using std::cerr;
using std::endl; using std::string;
using std::ifstream; using std::vector;
int main()
{
string filename("test1.gcode");
vector<string> lines;
string line;
ifstream input_file(filename);
if (!input_file.is_open()) {
cerr << "Could not open the file - '"
<< filename << "'" << endl;
return EXIT_FAILURE;
}
while (getline(input_file, line)){
lines.push_back(line);
}
for (const auto &i : lines)
cout << i << endl;
input_file.close();
return EXIT_SUCCESS;
}
2条答案
按热度按时间tez616oj1#
不能向
getline()
添加过滤器。它总是返回输入中完整的下一行。您可以自己解析这一行,并提取所需的值。
这可以通过多种方式来实现,其中之一如下所示。
我使用
std::string::find
来获取标记x/y坐标的字符'X '/' Y'的偏移量。然后我使用
std::atof
将行的相关部分转换为double
值。我还使用
std::string::find
检查该行是否以该命令所需的前缀开头。输出:
jdgnovmf2#
处理结构化数据的常用方法是...使用struct。
通常一个人不能
istream >> 'G'
,所以我有一个助手。http://coliru.stacked-crooked.com/a/6af1f3c881cc9e6e
然后使用普通的
istream>>line_item
读入这些项,这样就得到了结构化数据,可以对这些数据做任何想做的事情,比如创建一个只存储您关心的项的辅助结构体。