diff --git a/include/Netra.hpp b/include/Netra.hpp index 0515464..d662435 100644 --- a/include/Netra.hpp +++ b/include/Netra.hpp @@ -260,6 +260,14 @@ namespace QCL */ size_t GetBytesBefore(const std::string &marker, bool includeMarker = false); + /** + * @brief 从指定位置读取指定字节数,默认读取到文件末尾 + * @param pos 起始位置(字节偏移) + * @param count 要读取的字节数,默认为0表示读取到文件末尾 + * @return 读取到的字节数据 + */ + std::vector ReadBytesFrom(size_t pos, size_t count = 0); + /** * @brief 检查文件是否存在 */ @@ -284,4 +292,14 @@ namespace QCL // 屏蔽所有信号 void blockAllSignals(); + + // 去除字符串的左空格 + std::string Ltrim(const std::string &s); + + // 去除字符串右侧的空格 + std::string Rtrim(const std::string &s); + + // 去除字符串左右两侧的空格 + std::string LRtrim(const std::string &s); + } diff --git a/src/Netra.cpp b/src/Netra.cpp index 3d09b43..ffd5f11 100644 --- a/src/Netra.cpp +++ b/src/Netra.cpp @@ -466,15 +466,42 @@ namespace QCL return 0; } - bool ReadFile::FileExists() const + std::vector ReadFile::ReadBytesFrom(size_t pos, size_t count) { std::lock_guard lock(mtx_); + + if (!file_.is_open() && !Open()) + return {}; + + size_t filesize = GetFileSize(); + if (pos >= filesize) + return {}; // 起始位置超出文件大小 + + file_.clear(); // 清除 EOF 和错误状态 + file_.seekg(pos, std::ios::beg); + if (!file_) + return {}; + + size_t bytes_to_read = count; + if (count == 0 || pos + count > filesize) + bytes_to_read = filesize - pos; // 读取到文件末尾 + + std::vector buffer(bytes_to_read); + file_.read(buffer.data(), bytes_to_read); + + // 实际读取的字节数可能少于请求的数量 + buffer.resize(file_.gcount()); + + return buffer; + } + + bool ReadFile::FileExists() const + { return std::filesystem::exists(filename_); } size_t ReadFile::GetFileSize() const { - std::lock_guard lock(mtx_); if (!FileExists()) return 0; return std::filesystem::file_size(filename_); @@ -498,5 +525,33 @@ namespace QCL for (int ii = 1; ii <= 64; ii++) signal(ii, SIG_IGN); } + + std::string Ltrim(const std::string &s) + { + size_t start = 0; + while (start < s.size() && std::isspace(static_cast(s[start]))) + { + ++start; + } + return s.substr(start); + } + + std::string Rtrim(const std::string &s) + { + if (s.empty()) + return s; + + size_t end = s.size(); + while (end > 0 && std::isspace(static_cast(s[end - 1]))) + { + --end; + } + return s.substr(0, end); + } + + std::string LRtrim(const std::string &s) + { + return Ltrim(Rtrim(s)); + } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// } \ No newline at end of file