From 6f2af82434b63615688724ce0cf7efb3976bea26 Mon Sep 17 00:00:00 2001 From: Dev-Sams1012 Date: Sun, 26 Jul 2026 21:45:53 -0300 Subject: [PATCH] feat(core): implement BinaryFileReader for safe and efficient binary I/O - Add `BinaryFileReader` class to manage binary files using RAII (`std::ifstream`). - Enforce `std::ios::binary` flag to prevent silent data corruption during ROM parsing. - Implement `read_at()` for targeted offset reading. - Implement `read_next_chunk()` for block-based reading to process large files without exhausting RAM. - Utilize `std::filesystem::file_size` for total size tracking. - Throw `std::runtime_error` on file open failure to guarantee fail-safe operations. --- .../retroforge/io/BinaryFileReader.hpp | 25 +++++++++++ core/src/dummy.cpp | 1 - core/src/io/BinaryFileReader.cpp | 43 +++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 core/include/retroforge/io/BinaryFileReader.hpp delete mode 100644 core/src/dummy.cpp create mode 100644 core/src/io/BinaryFileReader.cpp diff --git a/core/include/retroforge/io/BinaryFileReader.hpp b/core/include/retroforge/io/BinaryFileReader.hpp new file mode 100644 index 0000000..0248c54 --- /dev/null +++ b/core/include/retroforge/io/BinaryFileReader.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include +#include + +namespace retroforge ::io { + +class BinaryFileReader { + public: + explicit BinaryFileReader(const std ::string &caminho); + + std::vector read_at(std ::streamoff offset, size_t quantidade); + + std::vector read_next_chunk(size_t tamanho_maximo); + + bool eof() const; + std ::uintmax_t tamanho_total() const { return tamanho_total_; } + + private: + std::ifstream arquivo_; + std::uintmax_t tamanho_total_; +}; +} // namespace retroforge::io \ No newline at end of file diff --git a/core/src/dummy.cpp b/core/src/dummy.cpp deleted file mode 100644 index 41b6611..0000000 --- a/core/src/dummy.cpp +++ /dev/null @@ -1 +0,0 @@ -// Placeholder file for CMake initialization diff --git a/core/src/io/BinaryFileReader.cpp b/core/src/io/BinaryFileReader.cpp new file mode 100644 index 0000000..b9dc63b --- /dev/null +++ b/core/src/io/BinaryFileReader.cpp @@ -0,0 +1,43 @@ +#include "retroforge/io/BinaryFileReader.hpp" + +#include +#include + +namespace retroforge::io { + +BinaryFileReader::BinaryFileReader(const std::string &caminho) + : arquivo_(caminho, std::ios::in | std::ios::binary), tamanho_total_(0) { + + if (!arquivo_.is_open()) { + throw std::runtime_error(" Nao foi possivel abrir : " + caminho); + } + + tamanho_total_ = std::filesystem::file_size(caminho); +} + +std::vector BinaryFileReader::read_at(std::streamoff offset, size_t quantidade) { + arquivo_.clear(); + arquivo_.seekg(offset, std::ios::beg); + + std::vector buffer(quantidade); + + arquivo_.read(reinterpret_cast(buffer.data()), + static_cast(quantidade)); + buffer.resize(static_cast(arquivo_.gcount())); + + return buffer; +} + +std::vector BinaryFileReader::read_next_chunk(size_t tamanho_maximo) { + std::vector buffer(tamanho_maximo); + + arquivo_.read(reinterpret_cast(buffer.data()), + static_cast(tamanho_maximo)); + buffer.resize(static_cast(arquivo_.gcount())); + + return buffer; +} + +bool BinaryFileReader::eof() const { return arquivo_.eof(); } + +} // namespace retroforge::io \ No newline at end of file