std::string_view 的使用

This commit is contained in:
2026-06-29 09:40:55 +08:00
parent cd446b7ca8
commit 8daf67aa5d
52 changed files with 1420 additions and 1367 deletions
+27 -25
View File
@@ -2,7 +2,8 @@
#include <codecvt>
#include "../server/Global.h"
#include "Database.h"
Psc::serial::Serial* create_serial(const std::string& serial_name,
#include <string_view>
Psc::serial::Serial* create_serial(std::string_view serial_name,
Baud_Rate_Type baud_rate) {
auto serial = new Psc::serial::Serial;
serial->set_serial_name(serial_name);
@@ -13,7 +14,7 @@ Psc::serial::Serial* create_serial(const std::string& serial_name,
serial->set_flow_control(Psc::serial::FlowControl::HardwareControl);
serial->set_buffer_byte_size(10 * 1024);
if (!serial->open()) {
std::cerr << "createSerial " + serial_name + ":" +
std::cerr << "createSerial " + std::string(serial_name) + ":" +
std::to_string(baud_rate) + " 打开串口失败!\n";
Psc::fail_fast();
return nullptr;
@@ -82,14 +83,15 @@ void File_Data_Source::before_handle_msg(std::shared_ptr<SSR::Mode_Msg>& msg) {
}
}
}
std::vector<std::string> readLines(const std::string& path) {
std::vector<std::string> readLines(std::string_view path) {
std::vector<std::string> lines;
auto path_string = std::string(path);
std::filesystem::path p =
std::filesystem::path((const char8_t*)path.c_str());
std::filesystem::path((const char8_t*)path_string.c_str());
// std::filesystem::path p = std::filesystem::u8path(path);
std::ifstream istream(p);
if (!istream) {
std::cerr << "读取模拟数据源 readLines 无法打开文件:" << path << std::endl;
std::cerr << "读取模拟数据源 readLines 无法打开文件:" << path_string << std::endl;
Psc::fail_fast();
}
// 将整个文件读入一个字符串
@@ -131,23 +133,23 @@ std::vector<std::string> readLines(const std::string& path) {
lines.push_back(line);
}
std::ostringstream oss;
oss << path + " 总行数:" + std::to_string(lines.size()) + " 有效行数:" +
oss << path_string + " 总行数:" + std::to_string(lines.size()) + " 有效行数:" +
std::to_string(lines.size()) + "\n"
<< std::flush;
std::cout << oss.str() << std::flush;
return lines;
}
std::string extractID(const std::string& logLine) {
std::string extractID(std::string_view logLine) {
size_t lastSpacePos = logLine.rfind(" "); // 查找最后一个空格
if (lastSpacePos != std::string::npos) {
return logLine.substr(lastSpacePos + 1); // 从最后一个空格之后提取字符串
return std::string(logLine.substr(lastSpacePos + 1)); // 从最后一个空格之后提取字符串
}
return logLine;
return std::string(logLine);
}
time_t convert_to_timestamp(const std::string& str) {
time_t convert_to_timestamp(std::string_view str) {
// 创建一个结构体 tm 来存储解析后的时间
std::tm timeStruct = {};
std::istringstream ss(str);
std::istringstream ss{std::string(str)};
ss >> std::get_time(&timeStruct, "%Y-%m-%d %H:%M:%S");
if (ss.fail()) {
std::cerr << "Failed to parse time" << std::endl;
@@ -161,18 +163,18 @@ time_t convert_to_timestamp(const std::string& str) {
}
return timestamp;
}
std::tuple<std::string, time_t> extractID2(const std::string& logLine) {
std::tuple<std::string, time_t> extractID2(std::string_view logLine) {
size_t lastSpacePos = logLine.rfind(" "); // 查找最后一个空格
time_t t = convert_to_timestamp(logLine.substr(0, 19));
if (lastSpacePos != std::string::npos) {
return {
logLine.substr(lastSpacePos + 1),
std::string(logLine.substr(lastSpacePos + 1)),
t
}; // 从最后一个空格之后提取字符串
}
return {logLine, t};
return {std::string(logLine), t};
}
std::string bin_format(const std::string& hex, time_t t) {
std::string bin_format(std::string_view hex, time_t t) {
std::tm *currentTime = std::localtime(&t);
auto sec = currentTime->tm_hour * 3600 + currentTime->tm_min * 60 +
currentTime->tm_sec;
@@ -208,11 +210,11 @@ std::optional<std::string> File_Data_Source::get_raw_line(int& ret_index) {
}
// 1A 33 1A 1A F1 FB 87 73 7E 7F a8001d81a87543b0a80000
std::string get_true_from_raw_line(Data_Source *ds, File_Data_Type data_type,
int index, const std::string& log_info) {
int index, std::string_view log_info) {
std::string ret;
// 2025-01-06 07:20:17 [info] dc2541e65001401a3119b2dd1c7af67132201
if (data_type == File_Data_Type::BIN) {
return log_info;
return std::string(log_info);
}
else if (data_type == File_Data_Type::BIN_Text) {
auto info = extractID(log_info);
@@ -226,7 +228,7 @@ std::string get_true_from_raw_line(Data_Source *ds, File_Data_Type data_type,
// 10 01 AA 14 61 7E 5E 02 E6 0F 38 7D 87 08 1A 32 10 01 AD B5 64 F7 63 5D 78
// 0F 9D BA 93 BA
else if (data_type == File_Data_Type::BIN_Blank_Text) {
std::string info = log_info;
std::string info(log_info);
std::string result = ds->last_char;
ds->last_char = "";
for (char c : info) {
@@ -254,25 +256,25 @@ std::string get_true_from_raw_line(Data_Source *ds, File_Data_Type data_type,
ret = hex2mem(result);
}
else if (data_type == File_Data_Type::BIN_Blank_One_Line_With_Escape) {
auto size = log_info.size();
auto size = log_info.size();
if (size % 2 != 0) {
return hex2mem(log_info.substr(0, size - 1));
return hex2mem(std::string(log_info.substr(0, size - 1)));
}
return hex2mem(log_info);
return hex2mem(std::string(log_info));
}
else if (data_type == File_Data_Type::BIN_Blank_One_Line_No_Escape) {
auto size = log_info.size();
std::string data;
if (size % 2 != 0) {
data = log_info.substr(0, size - 1);
data = std::string(log_info.substr(0, size - 1));
}
else {
data = log_info;
data = std::string(log_info);
}
return SSR::packet_to_escape_format(hex2mem(data));
}
else if (data_type == File_Data_Type::SIMPLE_BIN_Blank) {
std::string info = log_info;
std::string info(log_info);
std::string result;
for (char c : info) {
if (c != ' ') {
@@ -334,7 +336,7 @@ asio::awaitable<void> File_Data_Source::_open() {
state = "已加载" + to_string(part_infos.size()) + "长度数据!";
co_return;
}
std::vector<std::string> File_Data_Source::readBinaryFileAsString(const std::string& filepath,
std::vector<std::string> File_Data_Source::readBinaryFileAsString(std::string_view filepath,
size_t part_size) {
// 打开文件(以二进制模式)
std::ifstream file(filepath, std::ios::binary);