diff --git a/include/rexy/filerd.hpp b/include/rexy/filerd.hpp index 533d050..23e1f12 100644 --- a/include/rexy/filerd.hpp +++ b/include/rexy/filerd.hpp @@ -39,6 +39,7 @@ namespace rexy{ { private: std::FILE* m_fp = nullptr; + bool m_finished = false; public: constexpr filerd(void)noexcept = default; @@ -65,6 +66,8 @@ namespace rexy{ const std::FILE* get(void)const noexcept; operator bool(void)const noexcept; + bool eof(void)const; + std::size_t read(char* dest, std::size_t bytes)noexcept; rexy::string read(std::size_t bytes)noexcept; rexy::string readln(std::size_t max = 0)noexcept; diff --git a/src/filerd.cpp b/src/filerd.cpp index 49e7023..f9fd04b 100644 --- a/src/filerd.cpp +++ b/src/filerd.cpp @@ -78,8 +78,16 @@ namespace rexy{ return m_fp; } + bool filerd::eof(void)const{ + return m_finished; + } + std::size_t filerd::read(char* dest, std::size_t bytes)noexcept{ - return std::fread(dest, 1, bytes, m_fp); + const auto rdcnt = std::fread(dest, 1, bytes, m_fp); + if(rdcnt < bytes){ + m_finished = true; + } + return rdcnt; } rexy::string filerd::read(std::size_t bytes)noexcept{ rexy::string ret; @@ -98,13 +106,16 @@ namespace rexy{ if(++count == max) break; } + if(c == EOF){ + m_finished = true; + } return ret; } rexy::buffer filerd::read_bin(std::size_t bytes) noexcept(std::is_nothrow_constructible, char*, std::size_t>::value) { rexy::buffer ret{bytes}; - std::size_t written = read(ret.data(), bytes); + const auto written = read(ret.data(), bytes); ret.set_size(written); return ret; }