Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2012, 21:10   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию Как считать из объекта типа stringstream в буфер TCHAR

Доброго времени суток! Как считать из объекта типа stringstream в буфер TCHAR при использовании опции проекта "Использовать Юникод кодировку"?

Код:
#include <sstream>
#include <tchar.h>
using namespace std;

#define BSIZE 20

int main ()
{
    TCHAR buf[BSIZE];
    stringstream s;

    s << "hello, world!" << endl;

    s.getline(buf, BSIZE);

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 02.06.2012, 01:26   #2
zvoronz
Пользователь
 
Регистрация: 03.01.2011
Сообщений: 49
По умолчанию

Используй объекты для широких строк. Добавляй w спереди.
wstringstream s;
zvoronz вне форума Ответить с цитированием
Старый 02.06.2012, 01:55   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

када то мудохолся с подобной темой. Не придумал ничего умнее топора:

Код:
void CWinDisplay::PrintText(const std::string& text)
{
    ...
    #ifdef UNICODE
        #pragma message("CWinDisplay::PrintText(): UNICODE")
        wchar_t *buf = new wchar_t[text.length() + 1];
        MultiByteToWideChar(CP_ACP, 0, text.c_str(), -1, buf, text.length() + 1);
        std::wstring tmp(buf);
        delete [] buf;
    #else
        #pragma message("CWinDisplay::PrintText(): multibyte")
        const std::string& tmp = text;
    #endif 
    ...
Зато извне функции не нужно пасти, юникод у тебя, или мультибайт. Никакие диррективы, и никакие макросы снаружи не нужны

Последний раз редактировалось _Bers; 02.06.2012 в 01:57.
_Bers вне форума Ответить с цитированием
Старый 02.06.2012, 05:42   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Спасибо, _Bers! То что нужно!

Цитата:
Сообщение от zvoronz Посмотреть сообщение
Используй объекты для широких строк. Добавляй w спереди.
wstringstream s;
Моя вина. В своём вопросе я забыл добавить, что и при использовании опции: "Использовать многобайтовую кодировку", тоже должно работать. Всё-равно спасибо! Такой вариант может пригодиться, плюсую!
8Observer8 вне форума Ответить с цитированием
Старый 02.06.2012, 11:35   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Вот такой вариант нашёл:

Код:
#include <sstream>
#include <tchar.h>
using namespace std;

#define BSIZE 20

#ifdef _UNICODE
    typedef std::wstring tstring;
    typedef std::wstringstream tstringstream;
#else
    typedef std::string tstring;
    typedef std::stringstream tstringstream;
#endif

int main ()
{
    TCHAR buf[BSIZE];
    tstringstream  s;

    s << _T("hello, world!") << endl;

    s.getline(buf, BSIZE);

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 02.06.2012, 12:13   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Там видишь, в чем сложность то: литерные константы в исходном коде виндузятные компили воспринимают исключительно как мультибайт (если ничего не путаю), что в условиях, когда нужно поддерживать юникод, вынуждает, нас пасти эти ситуации и юзать всякие макросы аля _T(), или L(), и тп.

Фейлы начинаются, когда хочется единообразно пихать в функцию и литерную константу, и готовый объект.

Я привык к моральному std::string, и к тому, что char весит 1 байт, а не "хрен пойми чего в зависимости от чего-то там"

Поэтому, решил минимизировать точки контроля над ситуаций непосредственно в исполняющие функции. А вот снаружи синтаксис должен быть стабилен и прост:

Код:
int main ()
{
    char buf[BSIZE];
    stringstream  s;

    s << "hello, world!" << endl;

    s.getline(buf, BSIZE);

    return 0;
}
stringstream пусть сам ловит геммор с кодировками. Я привык писать просто.
А если он это не умеет, значит нужно вызывать такой механизм, который умеет. И сам будет всем рулить.

А вот здесь очень доступно и замечательно описаны дрязги с юникодом под форточками:

http://wm-help.net/books-online/prin.../59464-13.html
_Bers вне форума Ответить с цитированием
Старый 02.06.2012, 12:39   #7
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Цитата:
А если он это не умеет, значит нужно вызывать такой механизм, который умеет. И сам будет всем рулить.
Внешний механизм нужен надёжный, простой и продуманный. Для этого нужно хорошенько в нюансы въехать. Жаль нет готовых решений. За изложение позиции и ссылку - большое спасибо!
8Observer8 вне форума Ответить с цитированием
Старый 02.06.2012, 13:19   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Внешний механизм нужен надёжный, простой и продуманный. Для этого нужно хорошенько в нюансы въехать. Жаль нет готовых решений. За изложение позиции и ссылку - большое спасибо!
Политика корпорации Зла


Однако деление на мультибайт/юникод критично только при дерганье модулей, которые взаимодействуют с системой (дергают winapi, либо готовят материалы для тех, кто будет дергать winapi).

Моя идея заключается в том, что в рамках собственного приложения не используются никакие макросы вообще. Используется обычный std::string and char.

мы не пишем вот так:
Код:
Foo(_T("trololo"));
мы пишем просто:

Код:
Foo("trololo");
При взаимодействии с системой, материалы передаются на вход специальным функциям, которые уже внутри себя сами подготовят материалы так, что бы их могло прожевать winapi, и толкнуть их дальше.

Тогда получается: что внутри своего приложения чар стабильно весит 1 байт. А что именно будет скормлено winapi меня (моё приложение) вообще не заботит.

Профит тут ещё в том, что используя стандартные std::string and char в коде целевого приложения, можно не просто обеспечить поддержку кодировок, но и совместимость кода msc/mingw/gcc

То бишь, код, учитывающий политику Зла может взлететь и под Linux
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с созданием объекта своего типа,С# roadzero Помощь студентам 4 04.04.2011 17:23
ошибка 1004 при удалении объекта типа Range Red_Garry Microsoft Office Excel 2 26.02.2011 15:12
CLR. Ошибка C3918. Как вызвать из объекта обработчик, переданный родителю объекта от деда? Stilet Общие вопросы .NET 0 15.01.2011 17:49
считать данные из переменной типа String 1o1man Помощь студентам 13 17.04.2009 22:34
Преобразование типа объекта Oburec Общие вопросы Delphi 4 12.04.2009 14:20