одновременная работа с std::wcout и std::cout

184
05 ноября 2018, 19:50

Все примеры я запускаю в такой main ф-ии:

// работа с локалью взята отсюда 
// https://ru.cppreference.com/w/cpp/locale/locale
int main() {
    locale::global(std::locale("") );
    wcout.imbue(std::locale());
    cout.imbue(std::locale());
    return 0;
}

Для начала вопрос про работу с объектами std::wcout и std::cout.

добавим только такую строку в мейн

wcout << L"добро1" << endl; // именно это и выведется в консоль

а теперь только такую

cout << "добро2" << endl; // именно это и выведется в консоль

а теперь обе:

wcout << L"добро1" << endl; // выведется только это, но правилньо
cout << "добро2" << endl;   // ни как не вывелось! даже перевода строки нет.

а теперь поменяем местами:

cout << "добро2" << endl; //добро2
wcout << L"добро1" << endl; //4>1@>1

<<endl на сколько я помню/знаю должен полностью очищать объект c++ потока, заставляя этот объект полностью отдавать всё своё содержимое устройству стандартного вывода.

Это так и есть (если в ф-ях делать отладку и делать '\n' вместо endl то однажды будет случай неправильной последовательности вывода) только если работаешь с одним из объектов cout или wcout.

вопрос. Есть ли способ одновременной работы и с тем и с другим объектом чтобы ничего не терялось и все выводилось на стандартный вывод. При этом обращение к cout и wcout могут быть вообще из разных мест проекта. Возможно ли такое?

Answer 1

Когда wcout/cout вызывается впервые, устанавливается определенная ориентация stdout(стандартный поток вывода). В случае cout поток становится однобайтно-ориентированным, а в случае wcout поток становится ориентированным на широкоформатные символы. Согласно стандарту C++ [27.4.1] и стандарту С [7.19.2] (C11 [7.21.2]), однажды установив ориентацию stdout нельзя вызывать функции несовместимые с установленной ориентацией.

источник

Answer 2

Как и было сказано одновременно печатать с разными форматами нельзя. Но. Можно закрыть поток и открыть. Этим редко кто занимается.

# include <cstdio>
# include <iostream>
int main(){
  int mode = fwide(stdout,0);
  std::cout<<"0.mode="<<mode<<std::endl;
  std::cout<<"ABC"<<std::endl;
  mode = fwide(stdout,0);
  std::cout<<"1.mode="<<mode<<std::endl;
  freopen(NULL,"w",stdout);
  setlocale(LC_ALL, "en_US.UTF-8");
  mode = fwide(stdout,0);
  std::wcout<<L"2.mode="<<mode<<std::endl;
  std::wcout<<L"Ура"<<std::endl;
  mode = fwide(stdout,0);
  std::wcout<<L"3.mode="<<mode<<std::endl;
  freopen(NULL,"w",stdout);
  mode = fwide(stdout,0);
  std::cout<<"4.mode="<<mode<<std::endl;
  std::cout<<"Again"<<std::endl;
  mode = fwide(stdout,0);
  std::cout<<"5.mode="<<mode<<std::endl;}

Результат:

0.mode=0
ABC
1.mode=-1
2.mode=0
Ура
3.mode=1
4.mode=0
Again
5.mode=-1
READ ALSO
Десериализация JSON ответа

Десериализация JSON ответа

Пытаюсь десериализовать JSON ответ с помощью GSON через response ResponseFio = gsonfromJson(json, response

214
Как решить эту задачу?

Как решить эту задачу?

Добрый день решил изучить алгоритмы и делаю задачи из книги , но вот с этой задачей сломал голову Условия

221
Вырезать последнюю букву из слова java

Вырезать последнюю букву из слова java

Хочу сделать игру "города" на java (человек вводит название города, а программа выдает другой, название которого начинается на последнюю букву...

190
JavaFX Изменение картинки

JavaFX Изменение картинки

Поскольку только учусь, то не совсем понимаю как работаетВообщем есть сцена которая заливается текстурой:

208