Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Несовместимость в c++ потоков cout и wcout  (Прочитано 4983 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн lzv

  • Автор темы
  • Любитель
  • *
  • Сообщений: 89
    • Просмотр профиля
Здравствуйте.

Изучаю недавно c++. Попробовал выводить русские символы в консоль. Сначала были проблемы, но затем получилось. Однаков в процессе выяснилось, что если в программе используется один из потоков (cout и wcout), то второй поток не работает, или работает неверно. Например:

#include <iostream>

using std::cout;
using std::wcout;
using std::endl;

int main() {

setlocale(LC_ALL, "ru_RU.UTF8");

//Если первым в программе выводится cout, то wcout выводит непонятные значения вместо русских букв
cout << "Тест 1" << endl;
wcout << L"Тест 1 L" << endl;
cout << "Тест 1" << endl;
wcout << L"Тест 1 L" << endl;

/* Результат:
Тест 1
"5AB 1 L
Тест 1
"5AB 1 L
//*/

return 0;
}

#include <iostream>

using std::cout;
using std::wcout;
using std::endl;

int main() {

setlocale(LC_ALL, "ru_RU.UTF8");

//Если первым в программе выводится wcout, то cout не выводится вообще
wcout << L"Тест 2 L" << endl;
cout << "Тест 2" << endl;
wcout << L"Тест 2 L" << endl;
cout << "Тест 2" << endl;

/* Результат:
Тест 2 L
Тест 2 L
//*/

return 0;
}

В чем причина, или может я что-то неправильно делаю?
« Последнее редактирование: 16 Декабря 2012, 04:16:14 от lzv »

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: Несовместимость в c++ потоков cout и wcout
« Ответ #1 : 16 Декабря 2012, 14:40:37 »
добавьте в код:
Цитировать
std::locale::global(std::locale(""));
std::ios::sync_with_stdio(false);

и проверьте, возможно надо будет добавить еще вот это:
std::cout.imbue(std::locale());
  std::cerr.imbue(std::locale());
  std::clog.imbue(std::locale());
 
  std::wcout.imbue(std::locale());
  std::wcerr.imbue(std::locale());
  std::wclog.imbue(std::locale());

после чего все заработает.
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн lzv

  • Автор темы
  • Любитель
  • *
  • Сообщений: 89
    • Просмотр профиля
Re: Несовместимость в c++ потоков cout и wcout
« Ответ #2 : 20 Декабря 2012, 11:27:45 »
Получилось, спасибо.

Оказалось достаточно добавить
std::locale current_locale("");
std::locale::global(current_locale);
std::ios::sync_with_stdio(false);

Если оставить setlocale(LC_ALL, "ru_RU.UTF8") и добавить sync_with_stdio(false), то будет выводиться только cout.

 

Страница сгенерирована за 0.015 секунд. Запросов: 22.