我目前正在尝试实现一个函数,以便解析来自 Arduino 电路板的数字数据(来自通过 USB 连接连接到我的 PC 的电位计的浮点数),但由于某种原因,出现了字母和随机字符。我这么说的意思是数据“应该”只是浮点数和逗号,但这些字符时不时会出现:
ébèrÆébébébéréébébébéj
在那里):
Donnees recues :
Iébébéréébébébéj
1,-3.80,1.20,0,0.00,0,0,0
1,-3.80,1.20,0,0.00,0,0,0
1,-3.80,1.20,0,0.00,0,0,0
1,-3.80,1.20,0,0.00,0,0,0
1,-3.80,1.20,0,0.00,0,0,0
1,-3.80,1.20,0,0.00,0,0,0
1,-3.80,1.20,0,0.00,0,0,0
1,-3.80,1.20,0,0.00,0,0,0
1,-3.80,1.20,0,0.00,0,0
这些字母并不总是出现在第一行,但它们确实在某些时候出现,导致我的功能崩溃。
为此我正在尝试实现这个功能:
std::vector<float> vectorNumbers(const std::string& serialData)
{
std::stringstream ss(serialData);
std::string tmp;
std::vector<float> data;
while (getline(ss, tmp, ',' ))
{
//std::cout << "tmp = " << tmp << std::endl;
tmp.erase(0, tmp.find_last_not_of("\n") + 1);
tmp.erase(0, tmp.find_last_not_of("\r") + 1);
std::cout << "tmp = " << tmp << std::endl;
data.push_back(stof(tmp));
}
return (data);
}
我清除了“ ”和“ “在我应该解析的每行数据的末尾
但是有些字母不断随机弹出。
问题是对
stof
的调用崩溃,因为尝试将字母转换为浮点数是不可能的。 我如何确保我的函数
忽略或彻底删除那些不是逗号或数值的字符(知道我也想删除每行末尾的
\n
和\r
) 你可以来这里:https://godbolt.org/z/qad1j3fd4
tmp.erase
stof
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
std::vector<float> vectorNumbers(const std::string& serialData)
{
std::stringstream ss(serialData);
std::string tmp;
std::vector<float> data;
while (getline(ss, tmp, ','))
{
std::cout << "tmp = " << tmp << std::endl;
try
{
data.push_back(stof(tmp));
}
catch (...)
{ // stof failed, so we get here and the faulty line will be ignored
std::cout << "Filed to convert : " << tmp << std::endl;
}
}
return (data);
}
int main() {
std::string data[] =
{
{ "1.2 , 2.2, x, 3.3 ,4.5 ,5.5 \r\n" },
{"Iébébéréébébébéj"},
{ "2.32 , 42.2, x, 43.3 ,4.65 , 15.5 \r\n" }
};
for (const auto line : data)
{
auto v = vectorNumbers(line);
std::cout << "Vector content: " << std::endl;
for (auto number : v)
{
std::cout << number << std::endl;
}
}
}