Вывод и ввод L-строк

Прежде чем выводить L-строки нужно настроить локаль с помощью функции 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 применяются для вывода сообщений об ошибках. Прежде чем использовать объекты, необходимо подключить файл iostream с помощью директивы #include:

#include <iostream>

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

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

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

#include <cwchar> /* или #include <wchar.h> */
int _putws(const wchar_t *str);

Функция выводит строку str и вставляет символ перевода строки. Пример:

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
_putws(L"Строка1");
_putws(L"Строка2");

Результат выполнения:

Строка1
Строка2

Для вывода L-строки можно также воспользоваться спецификаторами %ls и %S в строке формата функции printf():

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
std::printf("%ls\n", L"строка");  // строка
std::printf("%S\n", L"строка");   // строка

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

#include <iostream>

Давайте попробуем ввести L-строку:

_wsystem(L"chcp 1251");            // Смена кодировки консоли
_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t str[255] = {0};
std::wcout << L"Введите строку: "; // Вывод подсказки
std::wcout.flush();                // Сброс буфера
std::wcin >> str;                  // Получение L-строки
std::wcout << str << std::endl;    // Вывод L-строки

Если в окне консоли ввести строку "Hello, world!" и нажать клавишу <Enter>, то массив str будет содержать значение "Hello,\0". Фрагмент "world!" останется в буфере, так как символ пробела является символом-разделителем.

Чтобы получить определенное количество символов необходимо воспользоваться методом getline() объекта wcin. Прототипы метода:

__istream_type &getline(wchar_t *str, streamsize count);
__istream_type &getline(wchar_t *str, streamsize count, wchar_t delim);

В первом параметре задается указатель на L-строку, а во втором параметре максимальное количество символов. В параметре delim можно дополнительно указать символ-ограничитель. Метод, соответствующий первому прототипу, производит считывание count-1 символов. Если раньше встретится символ перевода строки (\n), то считывается фрагмент до этого символа. Символ перевода строки считывается, но не записывается в массив. В конец массива автоматически вставляется нулевой символ. В качестве значения метод возвращает ссылку на поток ввода. Пример:

_wsystem(L"chcp 1251");           // Смена кодировки консоли
_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t str[255] = {0};
std::wcout << "Введите строку: "; // Вывод подсказки
std::wcout.flush();               // Сброс буфера
std::wcin.getline(str, 255);      // Получение L-строки
std::wcout << str << std::endl;   // Вывод L-строки

Метод, соответствующий второму прототипу, производит считывание count-1 символов. Если раньше встретится символ delim, то считывается фрагмент до этого символа. Символ delim считывается, но не записывается в массив. В конец массива автоматически вставляется нулевой символ. В качестве значения метод возвращает ссылку на поток ввода.

Количество записанных в массив символов можно получить с помощью метода gcount() объекта wcin. Прототип метода:

streamsize gcount() const;

Пример:

std::cout << std::wcin.gcount() << std::endl;

Для ввода L-строки в языке C предназначена функция _getws(), однако применять ее в программе не следует, так как функция не производит никакой проверки длины строки, что может привести к переполнению буфера. Лучше получать строку посимвольно с помощью функции getwchar() или воспользоваться функцией fgetws(). Прототип функции fgetws():

#include <cwchar> /* или #include <wchar.h> */
wchar_t *fgetws(wchar_t *buffer, int maxCount, FILE *stream);

В качестве параметра stream указывается стандартный поток ввода stdin. Считывание производится до первого символа перевода строки или до конца потока или пока не будет прочитано maxCount–1 символов. Содержимое строки buffer включает символ перевода строки. Исключением является последняя строка. Если она не завершается символом перевода строки, то символ добавлен не будет. Если произошла ошибка или достигнут конец потока, то функция возвращает нулевой указатель. Пример получения L-строки приведен в листинге 8.2.

Листинг 8.2. Получение L-строки с помощью функции fgetws()

#include <iostream>
#include <clocale>
#include <cwchar>

int main() {
   _wsystem(L"chcp 1251");            // Смена кодировки консоли
   _wsetlocale(LC_ALL, L"Russian_Russia.1251");
   wchar_t buf[256] = {0}, *p = nullptr;
   std::wcout << "Введите строку: ";  // Вывод подсказки
   std::wcout.flush();                // Сброс буфера
   p = std::fgetws(buf, 256, stdin);  // Получение L-строки
   if (p) {
      // Удаляем символ перевода строки
      size_t len = std::wcslen(buf);
      if (len != 0 && buf[len - 1] == '\n') {
         buf[len - 1] = L'\0';
      }
      std::wcout << buf << std::endl; // Вывод L-строки
   }
   else std::wcout << L"Возникла ошибка" << std::endl;
   return 0;
}

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

Помощь сайту

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

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