以带有保护措施的字符串流形式解析数字数据?

问题描述 投票:0回答:1

我目前正在尝试实现一个函数,以便解析来自 Arduino 电路板的数字数据(来自通过 USB 连接连接到我的 PC 的电位计的浮点数),但由于某种原因,出现了字母和随机字符。我这么说的意思是数据“应该”只是浮点数和逗号,但这些字符时不时会出现: ébèrÆébébébéréébébébéj

这是输入数据的示例(请记住“Donnees recues”下方的第一行,这意味着“收到的数据”

不应该

在那里): 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

c++ string parsing vector stringstream
1个回答
0
投票

    tmp.erase
  • 是不需要的,而且是错误的,你不需要清理每个扫描的元素,最多清理整行,但即使这样也没有必要。
  • stof
  • 位于try catch块中,因此,当失败时,程序不会崩溃,但该行会被简单地忽略。
    
    
  • #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; } } }
	
© www.soinside.com 2019 - 2024. All rights reserved.