Add some functionality to make filerd more usable

This commit is contained in:
rexy712 2022-07-19 16:42:47 -07:00
parent e636ba47fe
commit 43dc4b6654
2 changed files with 16 additions and 2 deletions

View File

@ -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;

View File

@ -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<char> filerd::read_bin(std::size_t bytes)
noexcept(std::is_nothrow_constructible<rexy::buffer<char>, char*, std::size_t>::value)
{
rexy::buffer<char> ret{bytes};
std::size_t written = read(ret.data(), bytes);
const auto written = read(ret.data(), bytes);
ret.set_size(written);
return ret;
}