用c++编写:使用正则表达式读取一个log文件内的数据并存储到相应容器中,log文件的变量及其数据类型为:pose_x:float , pose_y:float,time_:long int,um:int,opt_x:int,opt_y:int,current:float, ,fream,
时间: 2024-02-09 15:11:48 浏览: 87
好的,这个问题涉及到正则表达式和C++文件操作,需要用到 `<regex>` 和 `<fstream>` 库。下面是代码示例:
```cpp
#include <iostream>
#include <fstream>
#include <regex>
#include <vector>
using namespace std;
struct LogData {
float pose_x;
float pose_y;
long int time_;
int um;
int opt_x;
int opt_y;
float current;
int fream;
};
int main() {
ifstream log_file("log.txt");
if (!log_file.is_open()) {
cerr << "Failed to open log file." << endl;
return -1;
}
string line;
regex pattern("pose_x:(-?\\d+\\.\\d+)\\s*,\\s*pose_y:(-?\\d+\\.\\d+)\\s*,\\s*time_:(-?\\d+)\\s*,\\s*um:(-?\\d+)\\s*,\\s*opt_x:(-?\\d+)\\s*,\\s*opt_y:(-?\\d+)\\s*,\\s*current:(-?\\d+\\.\\d+)\\s*,\\s*fream:(-?\\d+)");
smatch match_results;
vector<LogData> log_data_vec;
while (getline(log_file, line)) {
if (regex_search(line, match_results, pattern)) {
LogData data;
data.pose_x = stof(match_results[1]);
data.pose_y = stof(match_results[2]);
data.time_ = stol(match_results[3]);
data.um = stoi(match_results[4]);
data.opt_x = stoi(match_results[5]);
data.opt_y = stoi(match_results[6]);
data.current = stof(match_results[7]);
data.fream = stoi(match_results[8]);
log_data_vec.push_back(data);
}
}
log_file.close();
// 打印读取结果
for (const auto& data : log_data_vec) {
cout << "pose_x: " << data.pose_x << ", pose_y: " << data.pose_y << ", time_: " << data.time_
<< ", um: " << data.um << ", opt_x: " << data.opt_x << ", opt_y: " << data.opt_y
<< ", current: " << data.current << ", fream: " << data.fream << endl;
}
return 0;
}
```
这里的正则表达式比较复杂,需要解释一下:
```
pose_x:(-?\d+\.\d+)\s*,\s*pose_y:(-?\d+\.\d+)\s*,\s*time_:(-?\d+)\s*,\s*um:(-?\d+)\s*,\s*opt_x:(-?\d+)\s*,\s*opt_y:(-?\d+)\s*,\s*current:(-?\d+\.\d+)\s*,\s*fream:(-?\d+)
```
- `pose_x:` 匹配变量名 "pose_x" 。
- `(-?\d+\.\d+)` 匹配变量值,包括可选的负号、数字和小数点。
- `\s*,\s*` 匹配逗号,并允许前后存在任意数量的空格。
- `time_:` 匹配变量名 "time_" 。
- `(-?\d+)` 匹配变量值,包括可选的负号和数字。
- 其他变量类似。
读取到每一行数据后,我们用 `regex_search` 函数来匹配正则表达式,并将匹配结果存储到 `match_results` 中。然后我们将匹配结果中的字符串转换成相应的数据类型,并存储到 `LogData` 结构体中,最后将结构体存储到 `log_data_vec` 容器中。最后,我们可以遍历容器并打印出读取结果。
阅读全文