Здравствуйте, <Аноним>, Вы писали:
А>всем привет. А>подскажите пожалуйста, как из 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[4]: Как без макросов перевести CString в const char *
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: Как без макросов перевести CString в const char *
Здравствуйте, Аноним, Вы писали:
А>всем привет. А>подскажите пожалуйста, как из 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 *
Здравствуйте, Rocky, Вы писали:
R>Здравствуйте, <Аноним>, Вы писали: А>>Спасибо Odi$$ey, Rocky, MasterZiv за участие.
R>Тут принято оценки расставлять вместе со спасибо...
замечание учтено, друг мой
с уважением, всегда ваш .... ;)
Как без макросов перевести 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 *
Аноним 532 пишет:
> ответы двух предедущих людей не подходят. > вы сами попробуйте написать то что написали в небольшом приложении и > увидете что получиться.
Вы не поверите, писал, и не один раз
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Как без макросов перевести CString в const char *
От:
Аноним
Дата:
07.11.08 05:28
Оценка:
Здравствуйте, Odi$$ey, Вы писали:
...
Зачем вы засоряете эфир?
Хорошо MasterZiv и Rocky попробую ваш вариант, но у меня вылетаеш ошибка когда fopen возвращает указатель на fl, т.е. там полня трабла возникапт.
Re[3]: Как без макросов перевести CString в const char *
Здравствуйте, MasterZiv, Вы писали:
MZ>Ну не везде не надо приведения.
MZ>Если _tfopen объявлен с первым параметром const TCHAR* — то да. MZ>Но там (или в других случаях) может быть и просто char*, тогда MZ>приведение типа (TCHAR*)(LPCTSTR)tmp обязательно.
это когда, если не секрет? _tfopen и CString же оба TCHARные...
Re[6]: Как без макросов перевести CString в const char *
Здравствуйте, superlexx, Вы писали:
MZ>>Ну не везде не надо приведения.
MZ>>Если _tfopen объявлен с первым параметром const TCHAR* — то да. MZ>>Но там (или в других случаях) может быть и просто char*, тогда MZ>>приведение типа (TCHAR*)(LPCTSTR)tmp обязательно.
S>это когда, если не секрет? _tfopen и CString же оба TCHARные...
Он, наверное, имеет в виду потерю const.
До последнего не верил в пирамиду Лебедева.
Re[7]: Как без макросов перевести CString в const char *
Roman Odaisky пишет:
> S>это когда, если не секрет? _tfopen и CString же оба TCHARные... > > Он, наверное, имеет в виду потерю const.
Я имею в виду ДРУГИЕ функции. Не одна же _tfopen на свете есть.
К тому же как минимум есть ДВЕ реализации (mingw ещё), и не факт, что в обоих
будут проставлены const-ы.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Как без макросов перевести CString в const char *
Здравствуйте, 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 *
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 *
Здравствуйте, MasterZiv, Вы писали:
MZ>А если это функция с переменным числом параметров ?
>> где уже учтены константные входящие параметры; 3) попытаться таки >> отдавать именно буфер (CString::GetBuffer()).
MZ>Вы понимаете, что советуете ? CString::GetBuffer() нужен ДЛЯ ЗАПИСИ
Я понимаю что советую: функция с переменным числом параметров константность переданных параметров в списке переменных вообще никак не различает.
Ну и вообще, конечно, переменное число параметров — это же не наш метод! (к) — к си++ он имеет крайне опосредствованное отношение: попробуйте например без дополнительных телодвижений определить, что за параметры там у нас в списке, какого типа.
MZ>в строку, а не для чтения из неё. Константность или нет — это не MZ>очень и важно. А вот запись или чтение — две большие разницы.
Насчет разницы есть приговорка хорошая. Насчет константности или нет — да, действительно в случае передачи в printf нет разницы и конструкция (LPTSTR)(LPCTSTR) здесь особенно изощренное извращение.
ЗЫ: и формально и фактически данной конструкцией мы явно приводим переданный нам CString указатель к типу, нужному ДЛЯ ЗАПИСИ — что нарушает архитектурную целлостность и приводит к потенциальным ошибкам: а может там у нас объект вообще константный? Как это проверить после такого приведения?
MZ>Это вы про передачу строки по значению вместо указателя на её данные ?
MZ>Ну, увы вам, изводите. Да, конечно тут хреново, что это работает. MZ>Не работало бы -- был бы другой разговор.