Как открыть файл с названием на русском языке?

Насколько я знаю их никак не открыть, потому что fopen() принимает тип const char*, однако должен же быть какой то выход. Мне нужно считывать посимвольно и поэтому я столкнулась с этим

MinGW


Ответы (1 шт):

Автор решения: HolyBlackCat

Тоже с этим столкнулся.

Вариант 1, мой любимый: Конвертировать путь в UTF-16 и использовать _wfopen.

Вот пример обертки над fopen/_wfopen, которая сама это делает:

#include <cstdio>
#include <filesystem>

// Like regular fopen, but can handle unicode paths on MinGW.
[[nodiscard]] inline FILE *better_fopen(const char *name, const char *mode)
{
    #ifndef __MINGW32__
    return std::fopen(name, mode);
    #else
    constexpr int max_mode_len = 3;
    wchar_t wide_mode[max_mode_len + 1]{};
    for (int i = 0; i < max_mode_len; i++)
    {
        wide_mode[i] = mode[i];
        if (mode[i] == '\0')
            break;
    }
    return _wfopen(std::filesystem::u8path(name).c_str(), wide_mode); // In C++20 `u8path` will be deprecated in favor of a new constructor.
    #endif
}

Вариант 2: В MSYS2 есть новый (экспериментальный?) вариант MinGW, они называют его UCRT64. Он использует в качестве стандартой библиотеки C ucrtbase.dll вместо древней msvcrt.dll, и, насколько я слышал, поддерживает юникодные пути из коробки.

Минус - собранные им программы не работают из коробки на Windows 7, если руками не поставить эту самую ucrtbase.dll.

Вариант 3: Перелезть на std::ifstream, и передавать ему путь в виде std::filesystem::path.

→ Ссылка