Piszę coś w rodzaju klona programu tar
i aby nie wykorzystywać zbyt dużo pamięci ram wymyśliłem, że plik będę wczytywał w kawałkach. Proszę o code review i wskazówki, bo to mój pierwszy kontakt z plikami binarnym i cywilizowanym wczytywaniem plików.
FileReader.hpp
#include <fstream>
#include <filesystem>
#include <optional>
#include <vector>
class FileReader
{
public:
explicit FileReader(const std::string&);
[[nodiscard]] std::optional<std::vector<std::byte>> readFileChunk();
private:
size_t iterPos{ 0 };
size_t fileSize{ 0 };
std::filesystem::path path;
const size_t megabyte = 1048576;
const size_t maxBufferSize = megabyte * 10;
};
FileReader.cpp
#include "FileReader.hpp"
#include <iostream>
FileReader::FileReader(const std::string& path) : path(path)
{
if (std::filesystem::exists(path))
{
fileSize = std::filesystem::file_size(path);
}
else
{
std::cerr << path << " does not exist!\n";
}
}
[[nodiscard]] std::optional<std::vector<std::byte>> FileReader::readFileChunk()
{
if (iterPos == fileSize)
{
return std::nullopt;
}
const size_t memoryToRead = fileSize - iterPos;
const size_t bufferSize = (memoryToRead < maxBufferSize) ? memoryToRead : maxBufferSize;
std::vector<std::byte> bytes(bufferSize);
std::ifstream ifs(path, std::ios::binary | std::ios::ate);
ifs.seekg(iterPos);
ifs.read(reinterpret_cast<char*>(bytes.data()), bufferSize);// reinterpret_cast czy jest bardziej cywilizowany sposób?
iterPos += bufferSize;
return std::move(bytes);// Nie ma NRVO więc std::move?
}