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

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

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

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

17 ответов

12 просмотров

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

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

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

Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Портфолио: Зовут меня Александр, мне 41 год. Город Киров. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github.co...
Magic
11
Подскажите, пожалуйста, где в backende, или не в нем можно дату поправить? Логирует действия не в том часовом поясе
Лео
7
Есть магистры regex в чате? Задача: нужно написать regex который мэтчит полные (без сокращений по типу ::1/128) ipv6 адреса кроме 2001:0df7:cef7:29f7:52f7:adf7:2cf7:4ff7, при ...
Илья
5
Приветствую всех, есть вопросик. Передали проект на OctoberCms, без инсталяшки в полуразвернутом виде, нужно было залить бекап бд, после залития бд, оказалось, что части строк...
Лео
14
Привет! Подскажите может кто сталкивался, при создании купона выходит вот в таком виде окно. Как поправить это?
Ruslan
4
Помните я тут рассказывал про таролога программистку? Мне выдали новый мем
Magic
6
где собака, админ группы? нычкуется и боится проявить волю, в толерантность еще не наигрался? @yelizariev
Ognezar
61
DataGrip не сканирует почему-то все таблицы, хотя раньше показывал их че за херня, сталкивались?
Magic
9
Ребята, я за проф советом😅 По микросервисам. В монолите есть общие файлы для сервисов: фетчи, конфиги, либы, утилсы.. как при распиле правильно их поддерживать? Пока вариант д...
Александр Тарасюк
1
Карта сайта