Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> std::wstring в TCHAR[] 
:(
    Опции темы
ТарасАтавин
Дата 26.8.2013, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Код
TCHAR FileOpenDialogDirrectoryPath[MAX_PATH];
std::wstring s;
s=FileOpenDialogDirrectoryPath;
, далее s укорачивается, потом надо перегнать s назад в FileOpenDialogDirrectoryPath, не замусоривая хвост буфера. c_str почему-то не помогает.


Это сообщение отредактировал(а) ТарасАтавин - 26.8.2013, 12:07


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
Alexeis
Дата 26.8.2013, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(ТарасАтавин @  26.8.2013,  13:02 Найти цитируемый пост)
потом надо перегнать s назад в FileOpenDialogDirrectoryPath, не замусоривая хвост буфера

  Обычно так и происходит, так что код в студию


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ТарасАтавин
Дата 27.8.2013, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Код

TCHAR FileOpenDialogDirrectoryPath[MAX_PATH];
std::wstring s;
GetModuleFileName(NULL, FileOpenDialogDirrectoryPath, MAX_PATH);
s=FileOpenDialogDirrectoryPath;
RemoveFileNameFromPath(s);
FileOpenDialogDirrectoryPath=s.c_str();
FileOpenDialog.lpstrInitialDir = FileOpenDialogDirrectoryPath;
void RemoveFileNameFromPath (std::wstring &s)
{
 size_t           L;
 size_t           i;
 size_t           p;
 unsigned wchar_t c;
 for (L=s.length()-1, i=L, p=L; i>0; --i)
 {
  c=s[i];
  if (c==L'\\')
  {
   p=i;
   break;
  }
 }
 if (p<L)
 {
  s.erase(p+1, L);
 }
}
. Не компилится. 
Код
FileOpenDialog.lpstrInitialDir = s.c_str();
 компилится, но не фурычит.


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
akizelokro
Дата 27.8.2013, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Код

if (c==L'\\')


пишется обычно TCHAR (WCHAR, CHAR), например WCHAR('\\')
но это ладно

Код

long pos = str.find_last_of(_T("\\"));
    if ( pos !=  - 1))
    {
        str = str.substr(0, pos);
    }


даёт подстроку без всего, что после последнего слэша

Код

long pos = str.find_last_of(_T("\\"));
    if ( pos > 0))
    {
        str = str.substr(0, pos-1);
    }


даёт подстроку без последнего слэша и всего, что после него

Это сообщение отредактировал(а) akizelokro - 27.8.2013, 08:36


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ТарасАтавин
Дата 27.8.2013, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



_T не определено, проект чисто уникодовый. И строка-объект обрабатывается правильно, проблема в копирожании её назад в массив широкочаров. Кстати, зачем обрезь строки простым эрейзом превращать в комбинацию вычисления новой строки и не нужного присваивания? У пасквилянтов научились? А по поводу функции у меня вопрос: как её возвращаемое значение дружит с типом size_t? И потрудитесь ка отличить объект от указателя: или точка вместо ->, или *str= вместо str=.


Это сообщение отредактировал(а) ТарасАтавин - 27.8.2013, 08:14


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
akizelokro
Дата 27.8.2013, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

_T не определено, проект чисто уникодовый.

Это по желанию, мне просто удобней работать через TCHAR и tstring, чтобы больше никогда не заморачиваться с перекомпиляцией или переносимостью. Просто я увидел TCHAR и решил, что _T вы подключили. Иначе бы WCHAR написали, наверно

Цитата

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

Можно и так, я чтобы не заморачиваться выдрал её из какого-то кода, можно и erase использовать, это уже не суть важно. Просто есть стандартная find_last_of() для строк, имхо использовать лучше её. Я думал, у вас с этим проблемка.
А если вам надо wstring закопировать в WCHAR, так надо просто копировать. А вы присваивате 
Код

FileOpenDialogDirrectoryPath=s.c_str();

аналог strcpy ищите. Потому что у вас небось потом что-то в этот массив FileOpenDialogDirrectoryPath должно и записаться

Цитата

У пасквилянтов научились? А по поводу функции у меня вопрос: как её возвращаемое значение дружит с типом size_t?"

Это где, в find_last_of? Номер предупреждения можно подавить прагмой. Лично я закрываю глаза на этот кусок кода, потому что возможное переполнение прошло бы раньше

Добавлено через 9 минут и 14 секунд
Цитата(ТарасАтавин @  27.8.2013,  08:06 Найти цитируемый пост)
 А по поводу функции у меня вопрос: как её возвращаемое значение дружит с типом size_t? И потрудитесь ка отличить объект от указателя: или точка вместо ->, или *str= вместо str=.

Исправлюсь сейчас, извините. У меня просто несколько иной подход, что важней идея, а доразобраться и в процессе реализации можно. поэтому часто на такие мелочи внимания не обращаю


Это сообщение отредактировал(а) akizelokro - 27.8.2013, 08:32


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ТарасАтавин
Дата 27.8.2013, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(akizelokro @  27.8.2013,  08:26 Найти цитируемый пост)
аналог strcpy ищите.
А как его зовут? Кроме того, у меня и с самой функцией strcpy проблемы, так что для ансичара мне проще самому её написать, чем юзать готовую. А вот с нервнобайтной кодировкой нуль-треминала беда. Вообще не могу с такими строками ничего толкового сделать.

Это сообщение отредактировал(а) ТарасАтавин - 27.8.2013, 08:39


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
akizelokro
Дата 27.8.2013, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата(ТарасАтавин @  27.8.2013,  08:36 Найти цитируемый пост)
А как его зовут?

Код

str.copy(FileOpenDialogDirrectoryPath, <количество копируемых символов>)




--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ТарасАтавин
Дата 27.8.2013, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(akizelokro @  27.8.2013,  08:26 Найти цитируемый пост)
Это где, в find_last_of?
Про str=str.sub.

Добавлено через 3 минуты и 51 секунду
Цитата(akizelokro @  27.8.2013,  08:40 Найти цитируемый пост)
str.copy(FileOpenDialogDirrectoryPath, <количество копируемых символов>)
В отладке видно, что буфер не изменился вовсе. При этом строка-объект s правильная, что тоже видно на отладке.

Добавлено через 7 минут и 12 секунд
Цитата(akizelokro @  27.8.2013,  08:26 Найти цитируемый пост)
 Номер предупреждения можно подавить прагмой.
При чём здесь предупреждение? Для меня не проблема привести тип при присваивании. А вот с чем потом сравнивать значение?

Добавлено через 9 минут и 4 секунды
Цитата(akizelokro @  27.8.2013,  08:26 Найти цитируемый пост)
потому что возможное переполнение прошло бы раньше
size_t - единственный тип, гарантирующий, что ни какой контейнер не способен переполнить его количеством своих элементов ни на одной возможной платформе.



--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
akizelokro
Дата 27.8.2013, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата(ТарасАтавин @  27.8.2013,  08:40 Найти цитируемый пост)
Про str=str.sub.

Про str.substr(...)?
да нет, кажется приведение long к size_t нормально работает, а вот обратное - чаще с предупреждениями.

Цитата(ТарасАтавин @  27.8.2013,  08:36 Найти цитируемый пост)
Кроме того, у меня и с самой функцией strcpy проблемы, так что для ансичара мне проще самому её написать, чем юзать готовую. А вот с нервнобайтной кодировкой нуль-треминала беда. Вообще не могу с такими строками ничего толкового сделать.


есть и просто аналоги копирования из буфера в буфер
описание

ANSI в OEM и обратно конвертить удобнее всего через CString (если MFC подключен). но можно и без MFC постараться, когда делал такое

Это сообщение отредактировал(а) akizelokro - 27.8.2013, 08:52


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
akizelokro
Дата 27.8.2013, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата(ТарасАтавин @  27.8.2013,  08:40 Найти цитируемый пост)
size_t - единственный тип, гарантирующий, что ни какой контейнер не способен переполнить его количеством своих элементов ни на одной возможной платформе.

Не обращайте внимания, вы правильно всё говорите, просто у меня старые привычки чуть ли 20 летней давности. В программе,откуда кусок кода выдран, это пр9иведение long к size_t или наоборот роли не играет. А так - да. Вы правильно всё говорите.

Цитата

В отладке видно, что буфер не изменился вовсе. При этом строка-объект s правильная, что тоже видно на отладке.

обнулите его для лучшей видимости
Код


for(int i=0; i < 256; i++)
     FileOpenDialogDirrectoryPath[i] = WCHAR('\0');


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


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
xvr
Дата 27.8.2013, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Код

wcscpy(FileOpenDialogDirrectoryPath,str.c_str());


PM MAIL   Вверх
GremlinProg
Дата 27.8.2013, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: нет
Всего: 106




M
GremlinProg
Тема перемещена из раздела C/C++: Системное программирование и WinAPI



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Dem_max
Дата 28.8.2013, 04:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Код

TCHAR FileOpenDialogDirrectoryPath[MAX_PATH];
GetModuleFileName(NULL, FileOpenDialogDirrectoryPath, MAX_PATH);
PathRemoveFileSpec(FileOpenDialogDirrectoryPath);
FileOpenDialog.lpstrInitialDir = FileOpenDialogDirrectoryPath;





--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.