Add binary reading and by-line reading to filerd

This commit is contained in:
rexy712 2020-01-18 20:00:32 -08:00
parent 8a4cae1ccf
commit cfe4d67bff
3 changed files with 23 additions and 0 deletions

View File

@ -40,6 +40,8 @@ namespace raii{
constexpr binary_base(void) = default;
constexpr binary_base(char* data, size_t size):
m_data(data), m_cap(size){}
constexpr binary_base(char* data, size_t cap, size_t size):
m_data(data), m_size(size), m_cap(cap){}
template<class Allocator>
binary_base(const binary_base& b):
m_data(Allocator::copy(b.m_data, b.m_cap)),
@ -70,6 +72,8 @@ namespace raii{
constexpr binary_data(void) = default;
binary_data(char* data, size_t size):
binary_base(reinterpret_cast<char*>(Allocator::copy(data, size)), size){}
binary_data(char* data, size_t cap, size_t size):
binary_base(reinterpret_cast<char*>(Allocator::copy(data, size)), cap, size){}
binary_data(size_t size):
binary_base(reinterpret_cast<char*>(Allocator::allocate(size)), size){}
binary_data(const binary_data& b):

View File

@ -23,6 +23,7 @@
#include <cstddef> //size_t
#include "raii/string.hpp"
#include "raii/binary.hpp"
namespace raii{
@ -55,6 +56,8 @@ namespace raii{
size_t read(char* dest, size_t bytes);
raii::string read(size_t bytes);
raii::string readln(size_t max = 0);
raii::binary read_bin(size_t bytes);
size_t write(const char* c, size_t bytes);
size_t write(const raii::string_base&);

View File

@ -85,6 +85,22 @@ namespace raii{
size_t written = read(tmp, bytes);
return raii::string(tmp, written);
}
raii::string filerd::readln(size_t max){
raii::string ret;
char c;
size_t count = 0;
for(c = fgetc(m_fp);c != EOF && c != '\n';c = fgetc(m_fp)){
ret.append(&c, 1);
if(++count == max)
break;
}
return ret;
}
raii::binary filerd::read_bin(size_t bytes){
char* tmp = reinterpret_cast<char*>(raii::binary::allocator_type::allocate(bytes));
size_t written = read(tmp, bytes);
return raii::binary(tmp, written, written);
}
size_t filerd::write(const char* c, size_t bytes){
return fwrite(c, 1, bytes, m_fp);
}