diff --git a/BaseLib/FileTools.h b/BaseLib/FileTools.h index b85c56e9c24abb36fce142971f651ec56896e95b..90864ecb8562aa5fc8eb75354352ff1a4bcf2aed 100644 --- a/BaseLib/FileTools.h +++ b/BaseLib/FileTools.h @@ -17,6 +17,10 @@ #include <fstream> #include <string> +#include <vector> + +// ThirdParty/logog +#include "logog/include/logog.hpp" namespace BaseLib { @@ -66,6 +70,35 @@ T readBinaryValue(std::istream& in) return v; } +template <typename T> +std::vector<T> readBinaryArray(std::string const& filename, std::size_t const n) +{ + std::ifstream in(filename.c_str()); + if (!in) { + ERR("readBinaryArray(): Error while reading from file \"%s\".", filename.c_str()); + ERR("Could not open file \"%s\" for input.", filename.c_str()); + in.close(); + return std::vector<T>(); + } + + std::vector<T> result; + result.reserve(n); + + for (std::size_t p = 0; in && !in.eof() && p < n; ++p) + result.push_back(BaseLib::readBinaryValue<T>(in)); + + if (result.size() == n) + return result; + + ERR("readBinaryArray(): Error while reading from file \"%s\".", filename.c_str()); + ERR("Read different number of values. Expected %d, got %d.", n, result.size()); + + if (!in.eof()) + ERR("EOF reached.\n"); + + return std::vector<T>(); +} + /** * \brief truncate a file *