Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Несколько вопросов по работе с типом TCHAR

37K
09 апреля 2009 года
Semich
18 / / 02.12.2008
Как я понял в переменной типа TCHAR могут храниться как и ANSI так и Unicode символы, в зависимости от того определен ли при компиляции дефайн _UNICODE. По этому поводу у меня возникло несколько вопросов:

1. Если в настоящий момент в TCHAR хранится ANSI символы, то каждый символ все равно представляется двумя байтами(как в Unicode) только первый байт равен 0.
2.
Код:
#include<iostream>
#include<string>
#include<windows.h>
#include<TChar.h>
#define _UNICODE [COLOR="SeaGreen"]//что меняется если убрать эту строку(на первый взгляд программа работает одинаково)?[/COLOR]
using namespace std;

void main()
{
    TCHAR s1[50],s2[50]=_T("Михаил");
    _tcscpy(s1,s2);//смотрел содержимое s1 и s2 через watch
}


3. Когда TCHAR представляет собой ANSI символы становится ли он эквивалентен обычному char.
Код:
#include<iostream>
#include<string>
#include<windows.h>
#include<fstream>
#include<TChar.h>
#define _UNICODE   //?
using namespace std;

void main()
{
    char s[50]="Михаил";
    TCHAR s1[50],s2[50]=_T("Михаил");
    _tcscpy(s1,s);[COLOR="SeaGreen"]//эта строка будет работать если TCHAR это ANSI[/COLOR]
}


4.Вывод на консоль типа TCHAR.

Код:
#include<iostream>
#include<string>
#include<windows.h>
#include<fstream>
#include<TChar.h>
#define _UNICODE//?
using namespace std;

void main()
{
    TCHAR s1[50],s2[50]=_T("Михаил");
    _tcscpy(s1,s2);

cout << s1 << endl; [COLOR="SeaGreen"]//выводит 0012FEFC[/COLOR]
cout << s2 << endl; [COLOR="SeaGreen"]//выводит 0012FE90[/COLOR]
}

Почему выводит разные значения, это адреса? Как с помощью потоков работать с TCHAR, не только консольный вывод а также консольный ввод и файловый ввод-вывод
3
09 апреля 2009 года
Green
4.8K / / 20.01.2000
 
Код:
#ifdef _UNICODE
#  define TCOUT  wcout
#else
#  define TCOUT  cout
#endif
37K
09 апреля 2009 года
Semich
18 / / 02.12.2008
Код:
#include<iostream>
#include<string>
#include<windows.h>
#include<fstream>
#include<TChar.h>
#define _UNICODE
using namespace std;

#ifdef _UNICODE
#  define TCOUT  wcout
#else
#  define TCOUT  cout//строка серая?
#endif

void main()
{
    char s[50]="Михаил";
    TCHAR s1[50],s2[50]=_T("Михаил");
    _tcscpy(s1,s2);
TCOUT << s1 << endl;
TCOUT << s2 << endl;
}

Теперь вообще пустой экран. Прошу привести какой нибудь более полный пример. Заранее благодарен, за ваши ответы на мои вопросы :)
255
09 апреля 2009 года
Dart Bobr
1.4K / / 09.04.2004
Ну почитайте уже наконец-то документацию.. Не злите модераторов такими вопросами.
Почитайте на каком этапе вычисляются макросы. Потом поразмыслите над кодом, который привел Green.
3
10 апреля 2009 года
Green
4.8K / / 20.01.2000
Цитата: Semich

Теперь вообще пустой экран. Прошу привести какой нибудь более полный пример. Заранее благодарен, за ваши ответы на мои вопросы :)


Код:
#define _UNICODE
#include<iostream>
#include<tchar.h>
using namespace std;

#ifdef _UNICODE
#  define TCOUT  wcout
#else
#  define TCOUT  cout    //строка серая!
#endif

void main()
{
    TCHAR s1[50], s2[50]=_T("Mifodiy");
    _tcscpy(s1, s2);
    TCOUT << s1 << endl;
    TCOUT << s2 << endl;
}
38K
10 апреля 2009 года
alt@zir
29 / / 28.08.2008
2автор:
1) прочтите документацию по препроцессору(директивы, макросы, условная компиляция)
2) просмотрите заголовок tchar.h

ИМХО, только после этого стоит постить вопросы сюда, если они останутся:)
37K
10 апреля 2009 года
Semich
18 / / 02.12.2008
Уважаемый Green ваш код работает правильно, но как быть с русскими сообщениями.

Код:
#define _UNICODE
#include<iostream>
#include<windows.h>
#include<tchar.h>
using namespace std;

#ifdef _UNICODE
#  define TCOUT  wcout
#else
#  define TCOUT  cout  
#endif

void main()
{
    TCHAR tc[50]=_T("Миша"),tc2[50]=_T("Misha");
    char c[50];
    CharToOem(tc,c);

    [COLOR="DarkRed"]TCOUT << tc2 << endl;//выводит Misha[/COLOR]
        TCOUT << c << endl;//выводит Миша
        TCOUT << tc << endl;//ничего не выводит
    [COLOR="DarkRed"]TCOUT << tc2 << endl;//ничего не выводит[/COLOR]
}

Как можно вывести TCHAR содержащие русские буквы на консоль?
Почему после строки TCOUT << tc << endl;, на экран вообще ни чего не выводится?
32K
11 апреля 2009 года
Rififi
54 / / 04.06.2008
Semich
 
Код:
#include <locale>
std::locale rus("Russian_Russia.1251");
TCOUT.imbue(rus);
TCOUT <<_T("ля-ля-ля");
37K
11 апреля 2009 года
Semich
18 / / 02.12.2008
Спасибо. Только вот:
 
Код:
#include <locale>
std::locale rus("Russian_Russia.1251");
TCOUT.imbue(rus);
TCOUT <<_T("ля-ля-ля");[COLOR="SeaGreen"]// выводит кракозябры[/COLOR]
87
11 апреля 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: Semich
Спасибо. Только вот:
 
Код:
#include <locale>
std::locale rus("Russian_Russia.1251");
TCOUT.imbue(rus);
TCOUT <<_T("ля-ля-ля");[COLOR="SeaGreen"]// выводит кракозябры[/COLOR]


Компилятор какой? Например, MinGW (gcc), по моему мнению, плох тем, что у него криво реализованы стандартные возможности вывода русских букв в консоль (Windows). То, что в студии работает замечательно, в нём - нет. Приходится вместо стандартных функций использовать функции Win32 API.

Могу ошибаться, так как серьезных исследований не проводил. Но мой скромный опыт говорит так.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог