diff options
Diffstat (limited to '')
-rw-r--r-- | src/Globals.h | 1 | ||||
-rw-r--r-- | src/OSSupport/File.cpp | 27 | ||||
-rw-r--r-- | src/OSSupport/File.h | 16 |
3 files changed, 43 insertions, 1 deletions
diff --git a/src/Globals.h b/src/Globals.h index c29f3200a..c2f117e23 100644 --- a/src/Globals.h +++ b/src/Globals.h @@ -173,6 +173,7 @@ template class SizeChecker<UInt8, 1>; #include <chrono> #include <condition_variable> #include <deque> +#include <fstream> #include <limits> #include <list> #include <map> diff --git a/src/OSSupport/File.cpp b/src/OSSupport/File.cpp index f860c37ca..113acc3a5 100644 --- a/src/OSSupport/File.cpp +++ b/src/OSSupport/File.cpp @@ -6,7 +6,6 @@ #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "File.h" -#include <fstream> #include <sys/stat.h> #ifdef _WIN32 #include <share.h> // for _SH_DENYWRITE @@ -710,3 +709,29 @@ void cFile::Flush(void) { fflush(m_File); } + + + + + +template <class StreamType> +FileStream<StreamType>::FileStream(const std::string & Path) : + StreamType() +{ + // Except on failbit, which is what open sets on failure: + FileStream::exceptions(FileStream::failbit | FileStream::badbit); + + // Open the file: + FileStream::open(Path); + + // Only subsequently except on serious errors, and not on conditions like EOF or malformed input: + FileStream::exceptions(FileStream::badbit); +} + + + + + +// Instantiate the templated wrapper for input and output: +template class FileStream<std::ifstream>; +template class FileStream<std::ofstream>; diff --git a/src/OSSupport/File.h b/src/OSSupport/File.h index 9987c41c7..b2099e9fd 100644 --- a/src/OSSupport/File.h +++ b/src/OSSupport/File.h @@ -185,3 +185,19 @@ private: + +/** A wrapper for file streams that enables exceptions. */ +template <class StreamType> +class FileStream final : public StreamType +{ +public: + + FileStream(const std::string & Path); +}; + + + + + +using InputFileStream = FileStream<std::ifstream>; +using OutputFileStream = FileStream<std::ofstream>; |