Привет. Third-party библиотека читает файлы через fopen. Путь к файлам

получаю через Qt QFileDialog::getOpenFileNames. Подскажите, какой подход принят чтобы можно было кроссплатформенно передавать как ascii так и unicode строки-пути в fopen? Обязательно ли писать макросы для винды типа defined(_WIN32) для _wfopen?

Подход сейчас примерно такой: получаю QStringList -> их преобразовываю в вектор std::string с помощью toStdString() и храню в поле класса -> далее не очень понятно, видимо нужно при чтении проверять ОС винда ли сейчас и если винда преобразовывать char* в wchar* и вызывать _wfopen.

Может кто-то поделиться где посмотреть пример аналогичного подхода?

17 ответов

29 просмотров

я просто использую toLocal8Bit().data()

В imgui сделано так https://github.com/ocornut/imgui/blob/master/imgui.cpp#L1767 и тоже через макросы #if defined(_WIN32)

Sergey eSKon
я просто использую toLocal8Bit().data()

когда ожидаем определенную локаль, то будет работать. но попробуй прочитать файл по пути например, D:\\страна-Ås\\input.txt

Станислав Трухан
когда ожидаем определенную локаль, то будет работа...

как-нибудь попробую. Но вы тоже попробуйте и расскажите, что вышло, потому-что моё когда-нибудь может не скоро наступить. Но вообще этот подход использован мной на многих проектах на разных платформах и ни разу не подвёл, хотя, конечно, пример, что вы привели довольно уникальный

Sergey eSKon
как-нибудь попробую. Но вы тоже попробуйте и расск...

я попробовал, файл по такой строке fopen не открывает, платформа windows QString path = "D:\\страна-Ås\\input.txt"; auto *f = fopen(path.toLocal8Bit().data(), "rb"); // f is null У пользователя папки/пути, вообще говоря, могут быть не привязаны к локали. а быть в unicode. Поэтому toLocal8Bit может не всегда верно срабатывать

Mr.Mait
auto * Указатель на указатель? Или я уже туплю

Нет тут auto это FILE https://en.cppreference.com/w/cpp/io/c/fopen

Станислав Трухан
Нет тут auto это FILE https://en.cppreference.com...

https://docs.microsoft.com/ru-ru/cpp/c-runtime-library/reference/fopen-wfopen?view=msvc-170 Мб не ту доку смотрю?

Станислав Трухан
Нет тут auto это FILE https://en.cppreference.com...

По твоей ссылке If successful, returns a pointer to the object Обычно же auto будет как FILE*, а если auto*, то получается FILE** . Сори если что-то не так, вторые сутки просто не спал

Mr.Mait
По твоей ссылке If successful, returns a pointer ...

fopen возвращает указатель на FILE, то есть auto* ~ FILE*

Станислав Трухан
fopen возвращает указатель на FILE, то есть auto* ...

Да, загуглил, нету разницы. Не думал о таком

Sergey eSKon
а toUtf8().data() не пробовали?

по идее примерно так и нужно, то есть сначала получить utf8 строку, а потом для винды эту строку преобразовать из utf8 в widestring utf16

Sergey eSKon
а зачем в utf16 то?

в доке так написано, что fopen на винде принимает только ascii ansi строку

𝙼𝚛. 𝙲𝚘𝚘𝚠𝚙𝚕𝚎𝚛 𝚠𝙷𝚊𝚝
ansi обычно они обозначают местную локаль (наприме...

верно, именно поэтому для винды нужно использовать не fopen, а _wfopen (если ожидаются unicode символы в пути к файлу)

Похожие вопросы

Обсуждают сегодня

Как думаете через какой сервис они верифицируют?
inc.
5
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
На чём в основном щас пишут мини апы? Vuejs?
Goot evening Not everyone
6
Вопрос: Здравствуйте! У меня возникла проблема с использованием плагина Mall в OctoberCMS. Я использую все файлы и компоненты в их исходном виде, без изменений. Однако на стр...
𐩱𐩪𐩣𐩱𐩲𐩺𐩡
8
Я правильно понимаю что нет способов получить список ожидающих заявок на вступление в группу с помощью бота из mtproto?
Шамиль Прилов
9
🙋 Ребята, всем привет. Поправил задачу: Нужно каждому новому сообщению (1 раз по каждому юзеру) в чате прибавлять снизу кнопку с предложением подписаться на канал. Как добавит...
Alexander
1
Добрый день. Мне посоветовали обратиться к вам в чат за помощью. Ситуация описана на скрине. Как мне сказали, мне на бота навесили флудвейт. Есть ли возможность снять его ра...
OVERLINK
7
Просто по очереди выпиливаешь на ручной маппинг? По методу за раз
Andrii Kurdiumov
7
всем привет помогите пожалуйста используя CDN (GCP) у игроков из вьетнама загружается конфиг (размер 999 bytes) загружается 5 и более минут н а других CDN сервисах такой пробл...
Andrew Krw.
1
Карта сайта