Как без макросов перевести CString в const char *
От: Аноним  
Дата: 06.11.08 14:08
Оценка:
всем привет.
подскажите пожалуйста, как из CString перевести в const char* ?

CString tmp="blsblabla";
const char* tmp2 = tmp.GetBuffer(); // не работает, т.к. char = wchar_t()
FILE *fl ;
if((fl=fopen(tmp2, "rb"))==NULL ) // попадаю в этот цикл
MessageBox(_T(Возникла ошибка при открытии файла, или файл не выбрали),_T("Предупреждение"),MB_OK)
....

Re: Как без макросов перевести CString в const char *
От: Draqon  
Дата: 06.11.08 14:10
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>всем привет.

А>подскажите пожалуйста, как из CString перевести в const char* ?

А>CString tmp="blsblabla";

А>const char* tmp2 = tmp.GetBuffer(); // не работает, т.к. char = wchar_t()
А>FILE *fl ;
А>if((fl=fopen(tmp2, "rb"))==NULL ) // попадаю в этот цикл
А> MessageBox(_T(Возникла ошибка при открытии файла, или файл не выбрали),_T("Предупреждение"),MB_OK)
А>....

А>


const char* tmp2 = (LPCSTR)tmp;
Re: Как без макросов перевести CString в const char *
От: MasterZiv СССР  
Дата: 06.11.08 14:13
Оценка:
Аноним 338 пишет:

> CString tmp="blsblabla";


А где ты здесь-то макросы нашёл ?
> const char* tmp2 = tmp.GetBuffer(); // не работает, т.к. char = wchar_t()

Но вышеприведенный код неправильный.
Должно быть

const TCHAR* tmp2 = (LPCTSTR)tmp;


.GetBuffer() нужен ТОЛЬКО ДЛЯ ЗАПИСИ в строку.
И имеет побочный эффект — "порчу" строки.


И char никогда не может быть wchar_t
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Как без макросов перевести CString в const char *
От: Аноним  
Дата: 06.11.08 20:27
Оценка:
Здравствуйте, MasterZiv, Вы писали:

....

ответы двух предедущих людей не подходят.
вы сами попробуйте написать то что написали в небольшом приложении и увидете что получиться.
Re[3]: Как без макросов перевести CString в const char *
От: MasterZiv СССР  
Дата: 06.11.08 20:56
Оценка:
Аноним 532 пишет:

> ответы двух предедущих людей не подходят.

> вы сами попробуйте написать то что написали в небольшом приложении и
> увидете что получиться.

Вы не поверите, писал, и не один раз
Posted via RSDN NNTP Server 2.1 beta
Re: Как без макросов перевести CString в const char *
От: Rocky  
Дата: 06.11.08 21:02
Оценка: 1 (1)
Здравствуйте, <Аноним>, Вы писали:

А>всем привет.

А>подскажите пожалуйста, как из CString перевести в const char* ?

А>CString tmp="blsblabla";

А>const char* tmp2 = tmp.GetBuffer(); // не работает, т.к. char = wchar_t()
А>FILE *fl ;
А>if((fl=fopen(tmp2, "rb"))==NULL ) // попадаю в этот цикл
А> MessageBox(_T(Возникла ошибка при открытии файла, или файл не выбрали),_T("Предупреждение"),MB_OK)
А>....

А>


Должно быть так:
CString tmp = _T("blsblabla");
const TCHAR* tmp2 = (LPCTSTR)tmp;
FILE *fl;
if (( fl = _tfopen ( tmp2, _T("rb"))) == NULL )
    MessageBox(_T(Возникла ошибка при открытии файла, или файл не выбрали),_T("Предупреждение"),MB_OK)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Как без макросов перевести CString в const char *
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 07.11.08 04:34
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>всем привет.

А>подскажите пожалуйста, как из CString перевести в const char* ?

зачем? пиши просто:

А>CString tmp="blsblabla";

А>if((fl=fopen(tmp, "rb"))==NULL )
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[2]: Как без макросов перевести CString в const char *
От: Аноним  
Дата: 07.11.08 05:28
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

...
Зачем вы засоряете эфир?

Хорошо MasterZiv и Rocky попробую ваш вариант, но у меня вылетаеш ошибка когда fopen возвращает указатель на fl, т.е. там полня трабла возникапт.
Re[3]: Как без макросов перевести CString в const char *
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 07.11.08 06:10
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Зачем вы засоряете эфир?


пардон, не тот кусок скопировал, должно быть:

if (( fl = _tfopen ( tmp, _T("rb"))) == NULL )


и не надо никаких явных приведений
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[4]: Как без макросов перевести CString в const char *
От: Аноним  
Дата: 07.11.08 08:04
Оценка:
Спасибо Odi$$ey, Rocky, MasterZiv за участие.
Re[5]: Как без макросов перевести CString в const char *
От: Rocky  
Дата: 07.11.08 08:12
Оценка: -1 :)
Здравствуйте, <Аноним>, Вы писали:


А>Спасибо Odi$$ey, Rocky, MasterZiv за участие.


Тут принято оценки расставлять вместе со спасибо...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Как без макросов перевести CString в const char *
От: MasterZiv СССР  
Дата: 07.11.08 09:07
Оценка: 1 (1)
Odi$$ey пишет:
> пардон, не тот кусок скопировал, должно быть:
>
> if (( fl = *_tfopen* ( tmp, _T("rb"))) == NULL )
>
> и не надо никаких явных приведений

Ну не везде не надо приведения.

Если _tfopen объявлен с первым параметром const TCHAR* — то да.
Но там (или в других случаях) может быть и просто char*, тогда
приведение типа (TCHAR*)(LPCTSTR)tmp обязательно.
Но только надо ещё десять раз подумать ...
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Как без макросов перевести CString в const char *
От: superlexx  
Дата: 07.11.08 11:50
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Ну не везде не надо приведения.


MZ>Если _tfopen объявлен с первым параметром const TCHAR* — то да.

MZ>Но там (или в других случаях) может быть и просто char*, тогда
MZ>приведение типа (TCHAR*)(LPCTSTR)tmp обязательно.

это когда, если не секрет? _tfopen и CString же оба TCHARные...
Re[6]: Как без макросов перевести CString в const char *
От: Roman Odaisky Украина  
Дата: 07.11.08 14:03
Оценка:
Здравствуйте, superlexx, Вы писали:

MZ>>Ну не везде не надо приведения.


MZ>>Если _tfopen объявлен с первым параметром const TCHAR* — то да.

MZ>>Но там (или в других случаях) может быть и просто char*, тогда
MZ>>приведение типа (TCHAR*)(LPCTSTR)tmp обязательно.

S>это когда, если не секрет? _tfopen и CString же оба TCHARные...


Он, наверное, имеет в виду потерю const.
До последнего не верил в пирамиду Лебедева.
Re[7]: Как без макросов перевести CString в const char *
От: MasterZiv СССР  
Дата: 07.11.08 20:04
Оценка:
Roman Odaisky пишет:

> S>это когда, если не секрет? _tfopen и CString же оба TCHARные...

>
> Он, наверное, имеет в виду потерю const.

Я имею в виду ДРУГИЕ функции. Не одна же _tfopen на свете есть.
К тому же как минимум есть ДВЕ реализации (mingw ещё), и не факт, что в обоих
будут проставлены const-ы.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: Как без макросов перевести CString в const char *
От: 2faust  
Дата: 10.11.08 13:37
Оценка: +1
Здравствуйте, Rocky, Вы писали:

R>Здравствуйте, <Аноним>, Вы писали:

А>>Спасибо Odi$$ey, Rocky, MasterZiv за участие.

R>Тут принято оценки расставлять вместе со спасибо...


замечание учтено, друг мой
с уважением, всегда ваш .... ;)
Re[5]: Как без макросов перевести CString в const char *
От: The Lex Украина  
Дата: 14.11.08 19:29
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Если _tfopen объявлен с первым параметром const TCHAR* — то да.

MZ>Но там (или в других случаях) может быть и просто char*, тогда
MZ>приведение типа (TCHAR*)(LPCTSTR)tmp обязательно.

тогда уж писать: (LPTSTR)(LPCTSTR)tmp
Но формально это — архитектурная ошибка: использование константной строки как неконстантной явным (насильственным) приведением. Если это "свои" функции — рекомендую переписать их под const — все равно оно так или иначе "выстрелит" — опыт говорит так. Если это "чужие" — библиотека какая сторонняя или еще что — 1) подумать хорошенько, стоит ли пользоваться такой библиотекой; 2) попытаться получить версию посвежее, где уже учтены константные входящие параметры; 3) попытаться таки отдавать именно буфер (CString::GetBuffer()).

MZ>Но только надо ещё десять раз подумать ...


Вообще-то такое использование CString на практике встречается довольно часто — на моей практике в основном из-за использования char* без const везде подряд без разбору в собственном коде (собственные либы, фреймворк, etc.) — вообще-то это таки довольно грязный хак или же так называемый "костыль". имхо, следует планомерно такое изводить из своего кода.
Голь на выдумку хитра, однако...
Re[6]: Как без макросов перевести CString в const char *
От: MasterZiv СССР  
Дата: 17.11.08 16:29
Оценка:
The Lex пишет:

> тогда уж писать: (LPTSTR)(LPCTSTR)tmp

> Но формально это — архитектурная ошибка: использование константной
> строки как неконстантной явным (насильственным) приведением.

Это в парамет printf-а то запихать -- архитектурная ошибка ?
Да так у вас весь С++ архитектурной ошибкой будет.
У printf-а же нет сигнатуры чёткой, что ж делать-то ?

Если это
> "свои" функции — рекомендую переписать их под const — все равно оно так
> или иначе "выстрелит" — опыт говорит так. Если это "чужие" — библиотека

А если это функция с переменным числом параметров ?

> где уже учтены константные входящие параметры; 3) попытаться таки

> отдавать именно буфер (CString::GetBuffer()).

Вы понимаете, что советуете ? CString::GetBuffer() нужен ДЛЯ ЗАПИСИ
в строку, а не для чтения из неё. Константность или нет — это не
очень и важно. А вот запись или чтение — две большие разницы.

> Вообще-то такое использование CString на практике встречается довольно

> часто — на моей практике в основном из-за использования char* без const
> везде подряд без разбору в собственном коде (собственные либы,
> фреймворк, etc.) — вообще-то это таки довольно грязный хак или же так
> называемый "костыль". имхо, следует планомерно такое изводить из своего
> кода.

Это вы про передачу строки по значению вместо указателя на её данные ?
Ну, увы вам, изводите. Да, конечно тут хреново, что это работает.
Не работало бы -- был бы другой разговор.
Posted via RSDN NNTP Server 2.1 beta
Re[7]: Как без макросов перевести CString в const char *
От: The Lex Украина  
Дата: 21.11.08 21:42
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>А если это функция с переменным числом параметров ?


>> где уже учтены константные входящие параметры; 3) попытаться таки

>> отдавать именно буфер (CString::GetBuffer()).

MZ>Вы понимаете, что советуете ? CString::GetBuffer() нужен ДЛЯ ЗАПИСИ


Я понимаю что советую: функция с переменным числом параметров константность переданных параметров в списке переменных вообще никак не различает.

Ну и вообще, конечно, переменное число параметров — это же не наш метод! (к) — к си++ он имеет крайне опосредствованное отношение: попробуйте например без дополнительных телодвижений определить, что за параметры там у нас в списке, какого типа.

MZ>в строку, а не для чтения из неё. Константность или нет — это не

MZ>очень и важно. А вот запись или чтение — две большие разницы.

Насчет разницы есть приговорка хорошая. Насчет константности или нет — да, действительно в случае передачи в printf нет разницы и конструкция (LPTSTR)(LPCTSTR) здесь особенно изощренное извращение.

ЗЫ: и формально и фактически данной конструкцией мы явно приводим переданный нам CString указатель к типу, нужному ДЛЯ ЗАПИСИ — что нарушает архитектурную целлостность и приводит к потенциальным ошибкам: а может там у нас объект вообще константный? Как это проверить после такого приведения?

MZ>Это вы про передачу строки по значению вместо указателя на её данные ?




MZ>Ну, увы вам, изводите. Да, конечно тут хреново, что это работает.

MZ>Не работало бы -- был бы другой разговор.

Голь на выдумку хитра, однако...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.