Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
 Аватар для Prostoplus
12 / 2 / 1
Регистрация: 21.09.2012
Сообщений: 122

Нужен код функции c_str()

26.11.2012, 21:27. Показов 5550. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужен код функции c_str(), так как в моем RAD Studio XE3 - баг, она возвращает wchar_t*, вместо char*.
Дайте либо код рабочей версии функции c_str(), или код аналогичной функции.

Вопрос решён, нужно сначала инициализировать любую переменную типа АнсиСтринг, а потом уже использовать c_str().
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.11.2012, 21:27
Ответы с готовыми решениями:

реализация функции c_str() в моем классе Str
Ребята, вот есть у меня в классе Str данные: private: Vec<char> data; char* buffer; В конструкторе я пишу: Str() :buffer(new...

Нужен код функции
У меня вопрос. Я новичек. Вот есть, например, метод listdir() , который ищет файлы. Но как она работает? Как мне написать подобную функцию...

Нужен код этой функции
Помогите пожалуйста написать код этой функции Вот начало, а дальше не знаю как function f(x,a:real):real; begin if x<=0...

14
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
26.11.2012, 21:28
UnicodeString
И есть хорошая традиция показывать код, вызвавший ошибку, и цитировать текст оной ошибки.
1
 Аватар для Prostoplus
12 / 2 / 1
Регистрация: 21.09.2012
Сообщений: 122
26.11.2012, 22:27  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void LoadFromFile(char *s)
{
    ifstream in(s, ios::in | ios::binary );
   if (!in) ShowMessage("Файл не найден, либо не открывается!");
   for (int c = 0; c<size; c++)
        in.read ((char *)&m[c], sizeof m[c]);
   in.close();
   Form1->M1->Lines->Add("Файл " + AnsiString(s) + " загружен успешно!");
}
...
[B]//ПРАВИЛЬНО[/B]
if(OpenDialog1->Execute())
    {
        AnsiString n = OpenDialog1->FileName;
        LoadFromFile(n.c_str());
    }
    FillTable();
[B]//НЕ ПРАВИЛЬНО:[/B]
LoadFromFile((OpenDialog1->FileName).c_str());
Ошибки:
Невозможно преобразовать wchar_t в char*,
==//== UnicodeString в char*
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
26.11.2012, 23:14
Ну, если уж совсем правильно...
C++
1
void LoadFromFile(TCHAR *s) { /*...*/ }
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.11.2012, 23:30
Цитата Сообщение от Prostoplus Посмотреть сообщение
Нужен код функции c_str(), так как в моем RAD Studio XE3 - баг, она возвращает wchar_t*, вместо char*.
Да, да Unicode - это баг

Добавлено через 1 минуту
C++
1
LoadFromFile(AnsiString(OpenDialog1->FileName).c_str() );
1
 Аватар для Prostoplus
12 / 2 / 1
Регистрация: 21.09.2012
Сообщений: 122
26.11.2012, 23:34  [ТС]
Avazart, Не знаю, вот почитал эту страничку, и решил, что действительно баг.
На Builder 6 C++ вроде бы работало.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
26.11.2012, 23:41
Баг или не баг, а нелогичность в реализации некоторых методов UnicodeString на лице, как говорится.
Сам же по себе юникод - штука хоть и расистская, но весьма полезная.
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.11.2012, 00:55
Ну как бы баг в RAD 2009, он при таком преобразовании не выдает ошибки при компиляции.
Но когда если вдруг попадет юникодный символ в строку ...
( я как-то долго искал причину ошибки в своей программе )

А если по судить вполне логично что c_str() приводит к строке в стиле ( тобиш заканчивающеюся '\0' )
Не понятно только назначение w_str() и t_str()

Добавлено через 9 минут
В общем собственно код

ustring.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    // C string operator.
    // NOTE: c_str() returns 'char*' by default to be compatible with
    //       AnsiString::c_str(). However, note that it does so by narrowing
    //       the underlying data of the UnicodeString. So, it's dangerous
    //       to use 'char* UnicodeString::c_str()' in cases where the
    //       the owner of the UnicodeString does not expect its underlying
    //       data to change. 
#if !defined(USTRING_CSTR_AS_WCHART)
    // Hack (apparently) for backward compatibility with AnsiString ??
    char*    __fastcall c_str();
#else
    wchar_t* __fastcall c_str() const   { return (Data)? Data: const_cast<wchar_t*>(L"");}
#endif
 
    wchar_t* __fastcall w_str() const   { return (Data)? Data: const_cast<wchar_t*>(L"");}
 
#if defined(UNICODE) || defined(_UNICODE)
    wchar_t* __fastcall t_str() const   { return (Data)? Data: const_cast<wchar_t*>(L"");}
#else
    char*    __fastcall t_str();
#endif
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.11.2012, 01:27
Из того что я понял
c_str()- возвращает в AnsiString char*, а UnicodeString wchar_t*
w_str() - сугубо метод для UnicodeString
t_str() - зависит от того определен ли макрос UNICODE, т.е. настроек среды и _TCHAR

Собственно от этой настройки и будет зависеть что будут требовать WinApi ф-ции в качестве параметра.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.12.2012, 12:46
Забавно...
Когда уже разработчики определятся с методами...

RAD XE3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#if defined(_Windows)
    WideChar* __fastcall c_str() const   { return (Data)? Data: const_cast<WideChar*>(L"");}
    WideChar* __fastcall w_str() const   { return (Data)? Data: const_cast<WideChar*>(L"");}
#else    
    WideChar* __fastcall c_str() const   { return (Data)? Data: reinterpret_cast<WideChar*>(const_cast<char16_t*>(u""));}
    WideChar* __fastcall w_str() const   { return (Data)? Data: reinterpret_cast<WideChar*>(const_cast<char16_t*>(u""));}
#endif    
 
    // The previously available 'char* UnicodeString::t_str()' squeezed/corrupted the 
    // underlying word size element into byte size ones.
    // NOTE: As of C++Builder 2011, the logic to convert the underlying data of strings has
    //       been removed and the t_str() method is now flagged as deprecated. Please, 
    //       use UnicodeString::c_str() instead.
    // For more information see:
    //              [url]http://blogs.embarcadero.com/abauer/2010/01/26/38908[/url]
    WideChar* __fastcall t_str _DEPRECATED_ATTRIBUTE0 () const   { return (Data)? Data: const_cast<WideChar*>(_D(""));}
 
    // Read access to raw Data ptr.  Will be NULL for an empty string.
    const void* __fastcall data() const   { return Data; }
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
20.12.2012, 12:57
Да никогда уже, наверно. Оно им явно до лампочки.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.12.2012, 14:03
Казалось что стоит использовать шаблон + макрос.

типа
C++
1
2
typedef std::basic_string<TCHAR> tstring;
typedef std::basic_fstream<TCHAR> tfstream;
Но походу там сложности с конверсиями...

Кстати о макросах заметил в обычном проекте теперь не определен макрос _T(), есть только TEXT().
И что удивительно не определяет _TCHAR ( есть только TCHAR )

Добавлено через 1 час 0 минут
По видимому теперь проект не содержит в себе <tchar.h> в котором определен _TCHAR и _T() его теперь нужно подключать.
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
20.12.2012, 23:07
в ХЕ3 из СРР проекта убрали подключение <tchar.h> ?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.12.2012, 23:08
Ну да...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
21.12.2012, 00:13
В XE-версии тоже надо подключать(явно или неявно) tchar.h для макроса _T() - намедни довелось проверить...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.12.2012, 00:13
Помогаю со студенческими работами здесь

Нужен исходный код, исходник функции strcat()
Мне нужен исходный код,исходник функции strcat(); , которая в string.h библиотеке. Помогите найти,а то я порылся в папке codeblocks-а и...

Нужен исходный код функции sinh() и cosh() из библиотеки math.h
Нужен исходный код функции sinh() и cosh() из библиотеки math.h. Искал в библиотеке - не нашел. Задача: написать программу которая будет...

string, c_str
функция string.c_str() возвращает const char*, что бы не изменяли строку напрямую. Но! Если явно преобразовать указатель к char*, то строка...

Функция c_str()
Здравствуйте, Подскажите пожалуйста, правильно ли я понимаю принцип работы функции c_str() ? Я понял вот так: string...

Разбираю код одной темы, что означает следующий код и зачем он нужен?
Доброго времени суток всем. Скачал тут как-то на днях вот такую тему для wordpress и смотрю, разбираю, что там внутри и как это работает. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru