refactor: throw exception on fopen failure in safe_fopen

This commit is contained in:
엄태용 2025-07-08 02:18:38 +09:00
parent abaf452026
commit 00a1736307

View File

@ -9,6 +9,12 @@
#include <cstdio> #include <cstdio>
#include <locale> #include <locale>
#include <string> #include <string>
#include <stdexcept>
#include <cerrno>
#include <cstring>
#include "fmt/os.h" #include "fmt/os.h"
@ -31,14 +37,24 @@ extern const char* const file_content;
// Opens a buffered file for reading. // Opens a buffered file for reading.
auto open_buffered_file(FILE** fp = nullptr) -> fmt::buffered_file; auto open_buffered_file(FILE** fp = nullptr) -> fmt::buffered_file;
inline auto safe_fopen(const char* filename, const char* mode) -> FILE* { inline FILE* safe_fopen(const char* filename, const char* mode) {
#if defined(_WIN32) && !defined(__MINGW32__) #if defined(_WIN32) && !defined(__MINGW32__)
// Fix MSVC warning about "unsafe" fopen.
FILE* f = nullptr; FILE* f = nullptr;
errno = fopen_s(&f, filename, mode); int err = fopen_s(&f, filename, mode);
if (err != 0 || f == nullptr) {
throw std::runtime_error(
std::string("cannot open file ") + filename + ": " + std::strerror(err)
);
}
return f; return f;
#else #else
return std::fopen(filename, mode); FILE* f = std::fopen(filename, mode);
if (f == nullptr) {
throw std::runtime_error(
std::string("cannot open file ") + filename + ": " + std::strerror(errno)
);
}
return f;
#endif #endif
} }