crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> fstream::open() и кирилица.
Trisch
  опции профиля:
сообщение 31.12.2013, 5:16
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


У меня fstream::open() не может открыть файлы в пути которых кириллица. Это можно как то исправить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 31.12.2013, 6:27
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


а как ты их ему скармливаешь? переведи в юникод. детально можно почитать тут: http://habrahabr.ru/post/112997/
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 31.12.2013, 7:43
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Ну примерно вот так:
...
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
  опции профиля:
сообщение 31.12.2013, 20:14
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Trisch @ 31.12.2013, 9:43) *
const wchar_t* filename = QString::toStdWString().data();
прокомментируй эту строку
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 2.1.2014, 3:16
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Цитата(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
  опции профиля:
сообщение 3.1.2014, 11:40
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


В общем под Linux я решил проблему избавившись от посредников и напрямую загнал QString::toStdString().data() в fstream::open(). Под Windows по прежнему файлы не открываются.

Сообщение отредактировал Trisch - 3.1.2014, 22:34
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.1.2014, 11:07
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 5.1.2014, 11:58
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Цитата(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
  опции профиля:
сообщение 5.1.2014, 12:17
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Я б просто попробовал по разному получать имя файла:
str.toLocal8Bit().data ()
str.toStdString().data ()
str.toUtf8().data ()

(названия методов по памяти)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.1.2014, 20:54
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(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);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 6:43