diff --git a/src/SFML/System/FileInputStream.cpp b/src/SFML/System/FileInputStream.cpp index a6e5694dc..6cec6e7ad 100644 --- a/src/SFML/System/FileInputStream.cpp +++ b/src/SFML/System/FileInputStream.cpp @@ -27,6 +27,7 @@ //////////////////////////////////////////////////////////// #include #include +#include #ifdef SFML_SYSTEM_ANDROID #include #include @@ -78,11 +79,7 @@ bool FileInputStream::open(const std::filesystem::path& filename) return m_androidFile->tell().has_value(); } #endif -#ifdef SFML_SYSTEM_WINDOWS - m_file.reset(_wfopen(filename.c_str(), L"rb")); -#else - m_file.reset(std::fopen(filename.c_str(), "rb")); -#endif + m_file.reset(openFile(filename, "rb")); return m_file != nullptr; } diff --git a/src/SFML/System/Utils.cpp b/src/SFML/System/Utils.cpp index 53acf060f..ee5d0662c 100644 --- a/src/SFML/System/Utils.cpp +++ b/src/SFML/System/Utils.cpp @@ -51,4 +51,14 @@ std::string formatDebugPathInfo(const std::filesystem::path& path) return oss.str(); } +std::FILE* openFile(const std::filesystem::path& filename, std::string_view mode) +{ +#ifdef SFML_SYSTEM_WINDOWS + const std::wstring wmode(mode.begin(), mode.end()); + return _wfopen(filename.c_str(), wmode.data()); +#else + return std::fopen(filename.c_str(), mode.data()); +#endif +} + } // namespace sf diff --git a/src/SFML/System/Utils.hpp b/src/SFML/System/Utils.hpp index 16ce5f3c6..c005afbe4 100644 --- a/src/SFML/System/Utils.hpp +++ b/src/SFML/System/Utils.hpp @@ -31,8 +31,10 @@ #include #include +#include #include +#include namespace sf @@ -51,4 +53,6 @@ template std::size_t index = 0; return ((integer |= static_cast(static_cast(byte) << 8 * index++)), ...); } + +[[nodiscard]] SFML_SYSTEM_API std::FILE* openFile(const std::filesystem::path& filename, std::string_view mode); } // namespace sf