Closed
Description
This code worked in 8.1.1, and works if I uncomment the lines to use ostream op<<() instead, but with trunk the fmt::print() gets an assert fail inside the CRT:
template<typename Container>
inline bool saveStatsToCSV(std::filesystem::path const& filename, std::string_view header, Container&& samples)
{
std::ofstream of(filename);
if (!of)
{
SPDLOG_ERROR("Couldn't open file '{}' for writing", filename);
return false;
}
else
{
fmt::print(of, "{}\n", header);
//of << header << "\n";
for (auto const& sample : samples)
{
fmt::print(of, "{}\n", sample);
//of << sample << "\n";
}
}
return true;
}
Call stack:
ucrtbased.dll!_fileno(_iobuf * public_stream) Line 17
at minkernel\crts\ucrt\src\appcrt\stdio\fileno.cpp(17)
MdpCpp.exe!fmt::v8::detail::print(_iobuf * f, fmt::v8::basic_string_view<char> text) Line 1502
at C:\Temp\cpm-source-cache\fmt\a27d11503e3ed8119b8700c55ac8a5449cdb5537\include\fmt\format-inl.h(1502)
MdpCpp.exe!fmt::v8::detail::write(std::basic_filebuf<char,std::char_traits<char>> & buf, fmt::v8::basic_string_view<char> data) Line 86
at C:\Temp\cpm-source-cache\fmt\a27d11503e3ed8119b8700c55ac8a5449cdb5537\include\fmt\ostream.h(86)
MdpCpp.exe!fmt::v8::detail::write_buffer<char>(std::basic_ostream<char,std::char_traits<char>> & os, fmt::v8::detail::buffer<char> & buf) Line 98
at C:\Temp\cpm-source-cache\fmt\a27d11503e3ed8119b8700c55ac8a5449cdb5537\include\fmt\ostream.h(98)
MdpCpp.exe!fmt::v8::vprint<char>(std::basic_ostream<char,std::char_traits<char>> & os, fmt::v8::basic_string_view<char> format_str, fmt::v8::basic_format_args<fmt::v8::basic_format_context<fmt::v8::appender,char>> args) Line 158
at C:\Temp\cpm-source-cache\fmt\a27d11503e3ed8119b8700c55ac8a5449cdb5537\include\fmt\ostream.h(158)
MdpCpp.exe!fmt::v8::print<std::basic_string_view<char,std::char_traits<char>> &>(std::basic_ostream<char,std::char_traits<char>> & os, fmt::v8::basic_format_string<char,std::basic_string_view<char,std::char_traits<char>> &> fmt, std::basic_string_view<char,std::char_traits<char>> & args) Line 174
at C:\Temp\cpm-source-cache\fmt\a27d11503e3ed8119b8700c55ac8a5449cdb5537\include\fmt\ostream.h(174)
_fileno() asserts in format-inl.h because f==nullptr:
namespace detail {
FMT_FUNC void print(std::FILE* f, string_view text) {
#ifdef _WIN32
auto fd = _fileno(f);
Any ideas? Clearly there's an easy workaround in this particular case, but would rather know why it's failing.
Metadata
Metadata
Assignees
Labels
No labels