#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
}
Несколько вопросов по работе с типом TCHAR
1. Если в настоящий момент в TCHAR хранится ANSI символы, то каждый символ все равно представляется двумя байтами(как в Unicode) только первый байт равен 0.
2.
Код:
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]
}
#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]
}
#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, не только консольный вывод а также консольный ввод и файловый ввод-вывод
Код:
#ifdef _UNICODE
# define TCOUT wcout
#else
# define TCOUT cout
#endif
# define TCOUT wcout
#else
# define TCOUT cout
#endif
Код:
#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;
}
#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;
}
Теперь вообще пустой экран. Прошу привести какой нибудь более полный пример. Заранее благодарен, за ваши ответы на мои вопросы :)
Почитайте на каком этапе вычисляются макросы. Потом поразмыслите над кодом, который привел Green.
Цитата: 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;
}
#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;
}
1) прочтите документацию по препроцессору(директивы, макросы, условная компиляция)
2) просмотрите заголовок tchar.h
ИМХО, только после этого стоит постить вопросы сюда, если они останутся:)
Код:
#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]
}
#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;, на экран вообще ни чего не выводится?
Код:
#include <locale>
std::locale rus("Russian_Russia.1251");
TCOUT.imbue(rus);
TCOUT <<_T("ля-ля-ля");
std::locale rus("Russian_Russia.1251");
TCOUT.imbue(rus);
TCOUT <<_T("ля-ля-ля");
Код:
#include <locale>
std::locale rus("Russian_Russia.1251");
TCOUT.imbue(rus);
TCOUT <<_T("ля-ля-ля");[COLOR="SeaGreen"]// выводит кракозябры[/COLOR]
std::locale rus("Russian_Russia.1251");
TCOUT.imbue(rus);
TCOUT <<_T("ля-ля-ля");[COLOR="SeaGreen"]// выводит кракозябры[/COLOR]
Цитата: Semich
Спасибо. Только вот:
Код:
#include <locale>
std::locale rus("Russian_Russia.1251");
TCOUT.imbue(rus);
TCOUT <<_T("ля-ля-ля");[COLOR="SeaGreen"]// выводит кракозябры[/COLOR]
std::locale rus("Russian_Russia.1251");
TCOUT.imbue(rus);
TCOUT <<_T("ля-ля-ля");[COLOR="SeaGreen"]// выводит кракозябры[/COLOR]
Компилятор какой? Например, MinGW (gcc), по моему мнению, плох тем, что у него криво реализованы стандартные возможности вывода русских букв в консоль (Windows). То, что в студии работает замечательно, в нём - нет. Приходится вместо стандартных функций использовать функции Win32 API.
Могу ошибаться, так как серьезных исследований не проводил. Но мой скромный опыт говорит так.