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

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

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

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

17 ответов

32 просмотра

я просто использую 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 символы в пути к файлу)

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

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

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
Карта сайта