получаю через Qt QFileDialog::getOpenFileNames. Подскажите, какой подход принят чтобы можно было кроссплатформенно передавать как ascii так и unicode строки-пути в fopen? Обязательно ли писать макросы для винды типа defined(_WIN32) для _wfopen?
Подход сейчас примерно такой: получаю QStringList -> их преобразовываю в вектор std::string с помощью toStdString() и храню в поле класса -> далее не очень понятно, видимо нужно при чтении проверять ОС винда ли сейчас и если винда преобразовывать char* в wchar* и вызывать _wfopen.
Может кто-то поделиться где посмотреть пример аналогичного подхода?
я просто использую toLocal8Bit().data()
В imgui сделано так https://github.com/ocornut/imgui/blob/master/imgui.cpp#L1767 и тоже через макросы #if defined(_WIN32)
когда ожидаем определенную локаль, то будет работать. но попробуй прочитать файл по пути например, D:\\страна-Ås\\input.txt
как-нибудь попробую. Но вы тоже попробуйте и расскажите, что вышло, потому-что моё когда-нибудь может не скоро наступить. Но вообще этот подход использован мной на многих проектах на разных платформах и ни разу не подвёл, хотя, конечно, пример, что вы привели довольно уникальный
я попробовал, файл по такой строке fopen не открывает, платформа windows QString path = "D:\\страна-Ås\\input.txt"; auto *f = fopen(path.toLocal8Bit().data(), "rb"); // f is null У пользователя папки/пути, вообще говоря, могут быть не привязаны к локали. а быть в unicode. Поэтому toLocal8Bit может не всегда верно срабатывать
auto * Указатель на указатель? Или я уже туплю
Нет тут auto это FILE https://en.cppreference.com/w/cpp/io/c/fopen
https://docs.microsoft.com/ru-ru/cpp/c-runtime-library/reference/fopen-wfopen?view=msvc-170 Мб не ту доку смотрю?
По твоей ссылке If successful, returns a pointer to the object Обычно же auto будет как FILE*, а если auto*, то получается FILE** . Сори если что-то не так, вторые сутки просто не спал
fopen возвращает указатель на FILE, то есть auto* ~ FILE*
Да, загуглил, нету разницы. Не думал о таком
а toUtf8().data() не пробовали?
по идее примерно так и нужно, то есть сначала получить utf8 строку, а потом для винды эту строку преобразовать из utf8 в widestring utf16
а зачем в utf16 то?
в доке так написано, что fopen на винде принимает только ascii ansi строку
ansi обычно они обозначают местную локаль (например, Windows-1251)
верно, именно поэтому для винды нужно использовать не fopen, а _wfopen (если ожидаются unicode символы в пути к файлу)
Обсуждают сегодня