Как открыть файл с названием на русском языке?
Насколько я знаю их никак не открыть, потому что fopen() принимает тип const char*, однако должен же быть какой то выход. Мне нужно считывать посимвольно и поэтому я столкнулась с этим
MinGW
Ответы (1 шт):
Тоже с этим столкнулся.
Вариант 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.