diff --git a/include/Netra.hpp b/include/Netra.hpp index 63c5708..142e263 100644 --- a/include/Netra.hpp +++ b/include/Netra.hpp @@ -182,13 +182,107 @@ namespace QCL */ bool writeBinary(const std::vector &data, std::ios::openmode mode); }; - - // 读文件操作 + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * @brief ReadFile 类 - 读文件操作工具类 + * + * 功能: + * 1. 读取全文(文本 / 二进制) + * 2. 按行读取 + * 3. 按字节数读取 + * 4. 获取指定字节序列前的字节数(包含该字节序列) + * 5. 检查文件是否存在 + * 6. 获取文件大小 + * + * 设计: + * - 与 WriteFile 类风格保持一致 + * - 支持文本文件与二进制文件 + * - 自动关闭文件(析构时) + */ class ReadFile { - }; + public: + /** + * @brief 构造函数 + * @param filename 文件路径 + */ + explicit ReadFile(const std::string &filename); + /** + * @brief 析构函数,自动关闭文件 + */ + ~ReadFile(); + + /** + * @brief 打开文件(以二进制方式) + * @return true 打开成功 + * @return false 打开失败 + */ + bool Open(); + + /** + * @brief 关闭文件 + */ + void Close(); + + /** + * @brief 文件是否已经打开 + */ + bool IsOpen() const; + + /** + * @brief 读取全文(文本模式) + * @return 文件内容字符串 + */ + std::string ReadAllText(); + + /** + * @brief 读取全文(二进制模式) + * @return 文件内容字节数组 + */ + std::vector ReadAllBinary(); + + /** + * @brief 按行读取文本 + * @return 每行作为一个字符串的 vector + */ + std::vector ReadLines(); + + /** + * @brief 读取指定字节数 + * @param count 要读取的字节数 + * @return 实际读取到的字节数据 + */ + std::vector ReadBytes(size_t count); + + /** + * @brief 获取指定字节序列前的字节数(包含该字节序列) + * @param marker 要查找的字节序列(可能不止一个字节) + * @return 如果找到,返回前面部分字节数;找不到返回全文字节数 + */ + size_t GetBytesBefore(const std::string &marker); + + /** + * @brief 检查文件是否存在 + */ + bool FileExists() const; + + /** + * @brief 获取文件大小(字节数) + */ + size_t GetFileSize() const; + + /** + * @brief 重置读取位置到文件开头 + */ + void Reset(); + + private: + std::string filename_; // 文件路径 + std::ifstream file_; // 文件流对象 + }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // 屏蔽所有信号 void blockAllSignals(); } diff --git a/src/Netra.cpp b/src/Netra.cpp index 70aaa2e..e6c299f 100644 --- a/src/Netra.cpp +++ b/src/Netra.cpp @@ -340,6 +340,111 @@ namespace QCL } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ReadFile::ReadFile(const std::string &filename) : filename_(filename) {} + + ReadFile::~ReadFile() + { + Close(); + } + + bool ReadFile::Open() + { + file_.open(filename_, std::ios::in | std::ios::binary); + return file_.is_open(); + } + + void ReadFile::Close() + { + if (file_.is_open()) + file_.close(); + } + + bool ReadFile::IsOpen() const + { + return file_.is_open(); + } + + std::string ReadFile::ReadAllText() + { + if (!file_.is_open() && !Open()) + return ""; + + std::ostringstream ss; + ss << file_.rdbuf(); + return ss.str(); + } + + std::vector ReadFile::ReadAllBinary() + { + if (!file_.is_open() && !Open()) + return {}; + + return ReadBytes(GetFileSize()); + } + + std::vector ReadFile::ReadLines() + { + if (!file_.is_open() && !Open()) + return {}; + + std::vector lines; + std::string line; + while (std::getline(file_, line)) + { + lines.push_back(line); + } + return lines; + } + + std::vector ReadFile::ReadBytes(size_t count) + { + if (!file_.is_open() && !Open()) + return {}; + + std::vector buffer(count); + file_.read(buffer.data(), count); + buffer.resize(file_.gcount()); // 实际读取的字节数 + return buffer; + } + + size_t ReadFile::GetBytesBefore(const std::string &marker) + { + if (!file_.is_open() && !Open()) + return 0; + + std::ostringstream ss; + ss << file_.rdbuf(); + std::string content = ss.str(); + + size_t pos = content.find(marker); + if (pos != std::string::npos) + return pos + marker.size(); + else + return content.size(); + } + + bool ReadFile::FileExists() const + { + return std::filesystem::exists(filename_); + } + + size_t ReadFile::GetFileSize() const + { + if (!FileExists()) + return 0; + return std::filesystem::file_size(filename_); + } + + void ReadFile::Reset() + { + if (file_.is_open()) + { + file_.clear(); // 清除 EOF 标志 + file_.seekg(0, std::ios::beg); + } + } + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // 屏蔽所有信号 void blockAllSignals() {