Вывод и ввод широких символов

Прежде чем выводить широкие символы нужно настроить локаль с помощью функции setlocale():

// #include <clocale>
std::setlocale(LC_ALL, "Russian_Russia.1251");

или с помощью функции _wsetlocale():

_wsetlocale(LC_ALL, L"Russian_Russia.1251");

Для вывода широких символов и L-строк в языке C++ предназначены объекты wcout, wcerr и wclog, объявленные в файле iostream. Объект wcout используется для вывода обычных сообщений в окно консоли. Объекты wcerr и wclog применяются для вывода сообщений об ошибках. Также как и объект wcout объекты wcerr и wclog первоначально связаны с окном консоли, однако возможно перенаправить поток на другое устройство или в файл. Прежде чем использовать объекты, необходимо подключить файл iostream с помощью директивы #include:

#include <iostream>

Пример вывода широкого символа и L-строки:

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
std::wcout << L'п' << std::endl;      // п
std::wcout << L"Строка" << std::endl; // Строка

Для вывода широких символов можно использовать функцию putwchar(). Прототип функции:

#include <cwchar> /* или #include <wchar.h> */
wint_t putwchar(wchar_t ch);

Пример вывода символа:

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t ch = L'п';
std::putwchar(ch);         // п

Можно также воспользоваться спецификаторами %lc и %C в функции printf():

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t ch = L'п';
std::printf("%lc\n", ch);  // п
std::printf("%C\n", ch);   // п

Для ввода широкого символа в языке C++ следует использовать объект wcin. Прежде чем использовать объект wcin необходимо подключить файл iostream с помощью директивы #include:

#include <iostream>

Пример получения широкого символа:

_wsystem(L"chcp 1251");        // Смена кодировки консоли
_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t ch = L'\0';
std::wcout << "ch = ";         // Вывод подсказки
std::wcout.flush();            // Сброс буфера
std::wcin >> ch;               // Получение символа
std::wcout << ch << std::endl; // Вывод символа
std::wcout << (unsigned)ch
           << std::endl;       // Вывод кода

Можно также воспользоваться методом get() объекта wcin:

ch = std::wcin.get();          // Получение символа
std::wcin.get(ch);             // Получение символа

Для ввода широкого символа в языке C используется функция getwchar(). Прототип функции:

#include <cwchar> /* или #include <wchar.h> */
wint_t getwchar(void);

Пример:

ch = std::getwchar();          // Получение символа

Функция getwchar() позволяет получить символ только после нажатия клавиши <Enter>. Если необходимо получить символ сразу после нажатия клавиши на клавиатуре, то можно воспользоваться функциями _getwche() и _getwch(). Прототипы функций:

#include <cwchar> /* или #include <wchar.h>
                     или #include <conio.h> */
wint_t _getwche(void);
wint_t _getwch(void);

Функция _getwche() возвращает код символа и выводит его на экран. При нажатии клавиши на клавиатуре функция _getwch() возвращает код символа, но сам символ на экран не выводится. Это обстоятельство позволяет использовать функцию _getwch() для получения конфиденциальных данных (например, пароля). Следует учитывать, что код символа возвращается и при нажатии некоторых служебных клавиш, например, <Home>, <End> и др. Пример:

_wsystem(L"chcp 1251");        // Смена кодировки консоли
_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t ch = L'\0';
std::wcout << "ch = ";         // Вывод подсказки
std::wcout.flush();            // Сброс буфера
ch = _getwch();                // Получение символа
std::wcout << ch << std::endl; // Вывод символа
std::wcout << (unsigned)ch
           << std::endl;       // Вывод кода

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов