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

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

26.11.2012, 21:27. Показов 5460. Ответов 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru