From 48d4ed9bc0179792d24621572a9fe40fe9080ebe Mon Sep 17 00:00:00 2001 From: gabime Date: Sun, 27 Sep 2020 18:27:41 +0300 Subject: [PATCH] Fix #1675 --- include/spdlog/sinks/stdout_sinks-inl.h | 30 ++++++++++++++++++++++--- include/spdlog/sinks/stdout_sinks.h | 4 ++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/include/spdlog/sinks/stdout_sinks-inl.h b/include/spdlog/sinks/stdout_sinks-inl.h index 20f2114f..e5aacd5b 100644 --- a/include/spdlog/sinks/stdout_sinks-inl.h +++ b/include/spdlog/sinks/stdout_sinks-inl.h @@ -11,6 +11,15 @@ #include #include +#ifdef _WIN32 +// under windows using fwrite to non-binary stream results in \r\r\n (see issue #1675) +// so instead we use ::FileWrite +#include +#include // WriteFile (..) +#include // _get_osfhandle(..) +#include // _fileno(..) +#endif // WIN32 + namespace spdlog { namespace sinks { @@ -20,7 +29,16 @@ SPDLOG_INLINE stdout_sink_base::stdout_sink_base(FILE *file) : mutex_(ConsoleMutex::mutex()) , file_(file) , formatter_(details::make_unique()) -{} +{ +#ifdef _WIN32 + // get windows handle from the FILE* object + handle_ = (HANDLE)::_get_osfhandle(::_fileno(file_)); + if (handle_ == INVALID_HANDLE_VALUE) + { + throw_spdlog_ex("spdlog::stdout_sink_base: _get_osfhandle() failed", errno); + } +#endif // WIN32 +} template SPDLOG_INLINE void stdout_sink_base::log(const details::log_msg &msg) @@ -28,8 +46,14 @@ SPDLOG_INLINE void stdout_sink_base::log(const details::log_msg &m std::lock_guard lock(mutex_); memory_buf_t formatted; formatter_->format(msg, formatted); - fwrite(formatted.data(), sizeof(char), formatted.size(), file_); - fflush(file_); // flush every line to terminal +#ifdef _WIN32 + auto size = static_cast(formatted.size()); + DWORD bytes_written = 0; + ::WriteFile(handle_, formatted.data(), size, &bytes_written, nullptr); +#else + ::fwrite(formatted.data(), sizeof(char), formatted.size(), file_); + ::fflush(file_); // flush every line to terminal +#endif // WIN32 } template diff --git a/include/spdlog/sinks/stdout_sinks.h b/include/spdlog/sinks/stdout_sinks.h index b962e1e2..e42c307b 100644 --- a/include/spdlog/sinks/stdout_sinks.h +++ b/include/spdlog/sinks/stdout_sinks.h @@ -7,6 +7,7 @@ #include #include #include +#include namespace spdlog { @@ -36,6 +37,9 @@ protected: mutex_t &mutex_; FILE *file_; std::unique_ptr formatter_; +#ifdef _WIN32 + HANDLE handle_; +#endif // WIN32 }; template