Я читал «C++ Cookbook», который имел следующий фрагмент кода:Смешивание COUT и wcout в той же программе
// cout << s << std::endl; // You shouldn't be able to
wcout << ws << std::endl; // run these at the same time
Если вы заинтересованы в том, чтобы фактический пример, вот a link to the page on Google books.
Кроме того, я нашел это SO question, который, похоже, указывает, что смешивание wcout и cout в порядке. Может ли кто-нибудь объяснить мне, о чем говорит этот комментарий?
РЕДАКТИРОВАТЬ
От стандарта C++ [27.4.1]:
Смешивание операций на соответствующем широкоэкранные и узкий-символьные потоки следует той же семантике, смешивая такие операции с файлами, как указано в Поправке 1 стандарта ISO C.
От C Standard [7.19.2]:
Каждый поток имеет ориентацию. После того, как поток связан с внешним файлом, но перед выполнением каких-либо операций, поток не имеет ориентации. Как только широкая функция ввода/вывода символов применяется к потоку без ориентации, поток становится широко ориентированным потоком. Аналогично, как только функция ввода/вывода байта имеет , применяется к потоку без ориентации, поток становится потоком, ориентированным на байты. Только вызов функции freopen или функции fwide может в противном случае изменить ориентацию потока . (Успешный вызов freopen удаляет любую ориентацию.)
Байт функции ввода/вывода не применяются к широко ориентированному потоку, а широкие функции ввода/вывода символов не применяются к потоку, ориентированному на байты.
Итак, стандарт, кажется, говорит, что вы не должны смешивать их. Тем не менее, я нашел эту цитату from this article:
Для Visual C++ 10.0 функция fwide документирована как нереализованная. И с практической точки зрения, по крайней мере на уровне вывода целых строк, он, по-видимому, отлично работает, чтобы объединить использование cout и wcout. Поэтому, к счастью, Visual C++, по-видимому, просто игнорирует требования стандарта и не поддерживает непрактичную явную ориентацию потока C FILE.
А также, относительно GCC я нашел эту цитату из here:
Это (новая) особенность, а не ошибка, см libstdC++/11705 и в общем поиске об ориентации потока в C (C99, 7.19.2). В двух словах вы не можете смешивать ориентированные и широко ориентированные I/O байты. На данный момент из-за ошибки , указанной в libstdC++/11705, вы можете получить что-то близкое к ожиданиям , вызвав std :: ios :: sync_with_stdio (false); в начале вашей программы.
Я действительно проверил страницу с ошибками книги, потому что думал, что это может быть ошибка, но ничего не нашел. –
@ Джесси: Время связаться с автором, возможно. –
Можете ли вы объяснить, что вы имеете в виду, и что на самом деле происходит: «Они оба сопоставляются с STDOUT»? , Спасибо –