Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: fstream::open() и кирилица.
Форум на CrossPlatform.RU > Разработка > С\С++
Trisch
У меня fstream::open() не может открыть файлы в пути которых кириллица. Это можно как то исправить?
Iron Bug
а как ты их ему скармливаешь? переведи в юникод. детально можно почитать тут: http://habrahabr.ru/post/112997/
Trisch
Ну примерно вот так:
...
const wchar_t* filename = QString::toStdWString().data();
...
size_t filenameLength = wcslen(filename);
    filename_.resize(filenameLength+1, 0);
    wcstombs(&*(filename_.begin()), filename, filenameLength);

#if _MSC_VER>=1400    // VS 2005
    file_.open(&*(filename_.begin()), mode | ios_base::binary, _SH_DENYRW);
#else
    file_.open(&*(filename_.begin()), mode | ios_base::binary);
#endif
...
Litkevich Yuriy
Цитата(Trisch @ 31.12.2013, 9:43) *
const wchar_t* filename = QString::toStdWString().data();
прокомментируй эту строку
Trisch
Цитата(Litkevich Yuriy @ 31.12.2013, 21:14) *
Цитата(Trisch @ 31.12.2013, 9:43) *
const wchar_t* filename = QString::toStdWString().data();
прокомментируй эту строку


ну сначала преобразуем QString в std::wstring, а потом в wchar_t*.
Trisch
В общем под Linux я решил проблему избавившись от посредников и напрямую загнал QString::toStdString().data() в fstream::open(). Под Windows по прежнему файлы не открываются.
Litkevich Yuriy
Цитата(Trisch @ 2.1.2014, 5:16) *
сначала преобразуем QString
какой QString? у тебя нет такого объекта. Метод toStdWString() - не статический, он требует объект.


Trisch
Цитата(Litkevich Yuriy @ 5.1.2014, 12:07) *
Цитата(Trisch @ 2.1.2014, 5:16) *
сначала преобразуем QString
какой QString? у тебя нет такого объекта. Метод toStdWString() - не статический, он требует объект.


А если так?
QString str("/test");
const wchar_t* filename = str.toStdWString().data();


ну это сейчас не важно.
Сейчас я делаю, примерно, так:
fstring file;
QString str("/test");
file.open(str.toStdString().data(), std::ios::binary | ios::in | ios::out);


Под Linux все работает. А вот под windows не хочет работать :(
Litkevich Yuriy
Я б просто попробовал по разному получать имя файла:
str.toLocal8Bit().data ()
str.toStdString().data ()
str.toUtf8().data ()

(названия методов по памяти)
AD
Цитата(Trisch @ 5.1.2014, 12:58) *
Под Linux все работает. А вот под windows не хочет работать :(

У меня была подобная проблема.
Попробуй в две строки:
QString str("/test");
std::string tmp(str.toStdString());
file.open(tmp.data(), std::ios::binary | ios::in | ios::out);
Trisch
Цитата(AD @ 5.1.2014, 20:54) *
Цитата(Trisch @ 5.1.2014, 12:58) *
Под Linux все работает. А вот под windows не хочет работать :(

У меня была подобная проблема.
Попробуй в две строки:
QString str("/test");
std::string tmp(str.toStdString());
file.open(tmp.data(), std::ios::binary | ios::in | ios::out);



А чем две строки отличаются от одной строки?

Я решил проблему через str.toLocal8Bit().data(), а перед этим получив str из wchar_t*, а еще перед этим получив объект типа wchar_t* из str1.toStdWString().data().
Litkevich Yuriy
Сегодня нашёл кайфовый макрос, тут
#ifdef UNICODE

#define QStringToTCHAR(x) (wchar_t*) x.utf16()

#define PQStringToTCHAR(x) (wchar_t*) x->utf16()

#define TCHARToQString(x) QString::fromUtf16((x))

#define TCHARToQStringN(x,y) QString::fromUtf16((x),(y))

#else

#define QStringToTCHAR(x) x.local8Bit().constData()

#define PQStringToTCHAR(x) x->local8Bit().constData()

#define TCHARToQString(x) QString::fromLocal8Bit((x))

#define TCHARToQStringN(x,y) QString::fromLocal8Bit((x),(y))

#endif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.