Template
Initial commit
This commit is contained in:
commit
d1890b6e18
16 files changed
+702
No files matched your search
@@ -0,0 +1,69 @@
|
||||
#include "file-stream.h"
|
||||
|
||||
#include "core-library/io/io-helper.h"
|
||||
|
||||
#include <system_error>
|
||||
|
||||
core::file_stream::~file_stream()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
core::file_stream::file_stream(file_stream&& other) noexcept
|
||||
: m_file_handle(std::exchange(other.m_file_handle, nullptr))
|
||||
{
|
||||
}
|
||||
|
||||
core::file_stream& core::file_stream::operator=(file_stream&& other)
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
core::close_file(m_file_handle);
|
||||
m_file_handle = std::exchange(other.m_file_handle, nullptr);
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
core::file_stream core::file_stream::open_for_reading(const std::filesystem::path& file_path)
|
||||
{
|
||||
file_stream stream{};
|
||||
stream.m_file_handle = core::open_file(file_path.string().c_str(), "rb");
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
std::string core::file_stream::file_contents_as_string(const std::filesystem::path& file_path)
|
||||
{
|
||||
file_stream stream = open_for_reading(file_path);
|
||||
return stream.read_all_as_string();
|
||||
}
|
||||
|
||||
std::string core::file_stream::read_all_as_string()
|
||||
{
|
||||
if (!m_file_handle)
|
||||
return {};
|
||||
|
||||
core::seek_file_to_end(m_file_handle);
|
||||
const std::size_t file_size = static_cast<std::size_t>(core::get_file_offset(m_file_handle));
|
||||
core::seek_file_to_beginning(m_file_handle);
|
||||
|
||||
if (file_size == 0)
|
||||
return {};
|
||||
|
||||
std::string result(file_size, '\0');
|
||||
core::read_from_file(&result[0], 1, file_size, m_file_handle);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void core::file_stream::close()
|
||||
{
|
||||
if (m_file_handle)
|
||||
{
|
||||
if (int result = std::fclose(m_file_handle); result != 0)
|
||||
throw std::system_error(std::error_code{result, std::system_category()});
|
||||
|
||||
m_file_handle = nullptr;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
#pragma once
|
||||
#include <concepts>
|
||||
#include <cstdio>
|
||||
#include <filesystem>
|
||||
#include <string>
|
||||
#include <type_traits>
|
||||
|
||||
namespace core {
|
||||
|
||||
class file_stream
|
||||
{
|
||||
public:
|
||||
file_stream(const file_stream&) = delete;
|
||||
file_stream& operator=(const file_stream&) = delete;
|
||||
file_stream(file_stream&&) noexcept;
|
||||
file_stream& operator=(file_stream&&);
|
||||
~file_stream();
|
||||
|
||||
static file_stream open_for_reading(const std::filesystem::path& file_path);
|
||||
static std::string file_contents_as_string(const std::filesystem::path& file_path);
|
||||
|
||||
std::string read_all_as_string();
|
||||
void close();
|
||||
|
||||
private:
|
||||
file_stream() = default;
|
||||
|
||||
FILE* m_file_handle{};
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
#include "io-helper.h"
|
||||
|
||||
#include <system_error>
|
||||
|
||||
std::FILE* core::open_file(const char* file_path, const char* mode)
|
||||
{
|
||||
std::FILE* file = std::fopen(file_path, mode);
|
||||
if (!file)
|
||||
throw std::system_error(errno, std::system_category());
|
||||
|
||||
return file;
|
||||
}
|
||||
|
||||
void core::seek_file_to_beginning(std::FILE* file, long offset)
|
||||
{
|
||||
const int result = std::fseek(file, offset, SEEK_SET);
|
||||
if (result != 0)
|
||||
throw std::system_error(errno, std::system_category());
|
||||
}
|
||||
|
||||
void core::seek_file_relatively(std::FILE* file, long offset)
|
||||
{
|
||||
const int result = std::fseek(file, offset, SEEK_CUR);
|
||||
if (result != 0)
|
||||
throw std::system_error(errno, std::system_category());
|
||||
}
|
||||
|
||||
void core::seek_file_to_end(std::FILE* file, long offset)
|
||||
{
|
||||
const int result = std::fseek(file, offset, SEEK_END);
|
||||
if (result != 0)
|
||||
throw std::system_error(errno, std::system_category());
|
||||
}
|
||||
|
||||
long core::get_file_offset(std::FILE* file)
|
||||
{
|
||||
const long offset = std::ftell(file);
|
||||
if (offset < 0)
|
||||
throw std::system_error(errno, std::system_category());
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
std::size_t core::read_from_file(void* buffer, std::size_t size, std::size_t count, std::FILE* file)
|
||||
{
|
||||
const std::size_t objects_read = std::fread(buffer, size, count, file);
|
||||
if (objects_read < count)
|
||||
{
|
||||
if (std::feof(file))
|
||||
throw std::runtime_error("Failed to read from file: End-of-file reached.");
|
||||
else
|
||||
throw std::runtime_error("Failed to read from file: Unknown error.");
|
||||
}
|
||||
|
||||
return objects_read;
|
||||
}
|
||||
|
||||
std::size_t core::write_to_file(const void* buffer, std::size_t size, std::size_t count, std::FILE* file)
|
||||
{
|
||||
const std::size_t objects_written = std::fwrite(buffer, size, count, file);
|
||||
if (objects_written < count)
|
||||
throw std::runtime_error("Failed to write to file.");
|
||||
|
||||
return objects_written;
|
||||
}
|
||||
|
||||
void core::close_file(std::FILE* file)
|
||||
{
|
||||
int result = std::fclose(file);
|
||||
if (result != 0)
|
||||
throw std::runtime_error("Failed to close file.");
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
#pragma once
|
||||
#include <cstdio>
|
||||
#include <string_view>
|
||||
|
||||
namespace core {
|
||||
|
||||
extern std::FILE* open_file(const char* file_path, const char* mode);
|
||||
extern void seek_file_to_beginning(std::FILE* file, long offset = 0);
|
||||
extern void seek_file_relatively(std::FILE* file, long offset);
|
||||
extern void seek_file_to_end(std::FILE* file, long offset = 0);
|
||||
extern long get_file_offset(std::FILE* file);
|
||||
extern std::size_t read_from_file(void* buffer, std::size_t size, std::size_t count, std::FILE* file);
|
||||
extern std::size_t write_to_file(const void* buffer, std::size_t size, std::size_t count, std::FILE* file);
|
||||
extern void close_file(std::FILE* file);
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user