Skip to content

Anything changed around fmt::print(ostream&) ? #2936

Closed
@mark-99

Description

@mark-99

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions