Как работает wcout? - PullRequest
       12

Как работает wcout?

4 голосов
/ 06 сентября 2011

Я заметил странную проблему при использовании wcout в консольном приложении.

После вызова определенной функции остальные вызовы wcout не работали вообще. т.е. операторы вывода не отображаются на консоли.

Я заметил, что в функции я использовал массив широких символов, который никогда не назначался.

WCHAR wArray[1024];
wcout<<wArray<<endl;

Именно после этого звонка все остальные wcout перестали работать.

Итак, мне было просто интересно узнать, что отличает wcout от cout и почему возникла эта проблема,

Ответы [ 2 ]

5 голосов
/ 06 сентября 2011

wcout может выполнять некоторую проверку юникода на выходе;и сбой вывода, если проверка не удалась.Частично это связано с тем, что консольная подсистема Windows не очень хорошо обрабатывает Unicode.

Проверьте, установлен ли поток failbit или badbit.Сброс потока (например, wcout.clear()) должен восстановить функциональность потока.

Строго говоря, cout - это std::basic_ostream<char>, а wcout - это std::basic_ostream<wchar_t> ... и это действительно так.различия.Просто для Unicode предъявляются дополнительные требования, чтобы этот Unicode был правильно сформирован.

4 голосов
/ 06 сентября 2011

В этом примере вызывается неопределенное поведение.

operator<<(std::wostream&,const wchar_t*) ожидает, что буфер завершится нулем, и прекратит печать символов, когда он достигнет первого L'\0' символа.Если в буфере окажется нулевой символ (L'\0'), то код будет работать «правильно» (хотя вывод непредсказуем).Если этого не произойдет, то operator<< продолжит чтение памяти до тех пор, пока не встретит ее.

Наличие нулевого терминатора не поддерживается вашим примером.Для сравнения, следующее вывело бы неопределенное количество символов, скорее всего, нежелательных, но хорошо определенных:

WCHAR wArray[1024];
wArray[1023] = L'\0';
wcout << wArray << endl;
...