одновременная работа с std::wcout и std::cout
Когда wcout/cout вызывается впервые, устанавливается определенная ориентация stdout (стандартный поток вывода). В случае cout поток становится однобайтно-ориентированным, а в случае wcout поток становится ориентированным на широкоформатные символы. Согласно стандарту C++ [27.4.1] и стандарту С [7.19.2] (C11 [7.21.2]), однажды установив ориентацию stdout нельзя вызывать функции несовместимые с установленной ориентацией.
Отслеживать
ответ дан 16 авг 2018 в 5:36
1,756 1 1 золотой знак 6 6 серебряных знаков 10 10 бронзовых знаков
Как и было сказано одновременно печатать с разными форматами нельзя. Но. Можно закрыть поток и открыть. Этим редко кто занимается.
# include # include int main()
Отслеживать
ответ дан 16 авг 2018 в 6:13
17.2k 1 1 золотой знак 9 9 серебряных знаков 33 33 бронзовых знака
- c++
- utf-8
- вывод
- кириллица
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.26.3951
Wcout c что это
Здравствуйте. Я так понимаю, что если в моей системе локаль настроена правильно, то следующий код должен работать так, как я думаю: 1. Вывести кол-во символов в строке «Привет!», т.е. 7
2. Вывести строку «Привет!».
3. Считывать строки с стандартного потока и выводить их длинну.
А вот код и как он работает:
cat ./main.cpp
#include int main()
{
std::wstring s(L»Привет!»);
std::wcout while ( std::wcin >> s )
{
std::wcout } std::wcout std::wcout std::wcout std::wcout return 0;
} sy@localhost ~$ g++ main.cpp && ./a.out
7.
qwe
3
вап
wcin.eof()=1
wcin.good()=0
wcin.fail()=1
wcin.bad() =0 т.е. Русские буквы не вводятся и не выводятся. Где я не прав? Подскажите, пожалуйста.
| Оглавление |
- Ввод и вывод wcin & wcout, Fuzzy, 11:35 , 10-Дек-08, ( 1 )
- Ввод и вывод wcin & wcout, sy, 12:55 , 10-Дек-08, ( 2 )
- Ввод и вывод wcin & wcout, sy, 14:56 , 10-Дек-08, ( 5 )
- Ввод и вывод wcin & wcout, vic, 15:07 , 10-Дек-08, ( 6 )
- Ввод и вывод wcin & wcout, Аноним, 14:04 , 11-Дек-08, ( 7 )
- Ввод и вывод wcin & wcout, vic, 15:31 , 11-Дек-08, ( 8 )
Сообщения по теме [Сортировка по времени | RSS] Если заменить wcin/wcout/wstring на cin/cout/string и убрать L в s(L»Привет!»), все будет работать.
>Если заменить wcin/wcout/wstring на cin/cout/string и убрать L в s(L»Привет!»), все будет
>работать.Ага, только учитывая, что у меня юникод, в первом пункте я получу не кол-во букв, а кол-во байт, т.е 13.
Какбы не канает такое решение.
В самом начале следует установить локаль. Еще по ходу пьесы может потребоваться подергать всякие ios_base::imbue для потоков, ну там запятые вместо точек выводить для double 🙂
#include
#includeint main()
{
setlocale(LC_ALL, «»);std::wstring ws(L»Уличная магия»);
std::wcout return 0;
}>В самом начале следует установить локаль. Еще по ходу пьесы может потребоваться
>подергать всякие ios_base::imbue для потоков, ну там запятые вместо точек выводить
>для double 🙂Да, так как Вы написали все работает. Правда, что-то я ничего не понял.
Локаль должна же быть установлена в соответствии с переменными окружения? Или нет?>>В самом начале следует установить локаль. Еще по ходу пьесы может потребоваться
>>подергать всякие ios_base::imbue для потоков, ну там запятые вместо точек выводить
>>для double 🙂
>
>Да, так как Вы написали все работает. Правда, что-то я ничего не
>понял.
>Локаль должна же быть установлена в соответствии с переменными окружения? Или нет?
>setlocale(LC_ALL,»»); — означает:
Specifies an implementation-defined native environment. This corresponds to the value of the associated environment variables, LC_* and LANG ; see the Base Definitions volume of IEEE Std 1003.1-2001, Chapter 7, Locale and the Base Definitions volume of IEEE Std 1003.1-2001, Chapter 8, Environment Variables.
http://www.opennet.ru/man.shtml?topic=setlocale&category=3&r.
По нашему: локаль в процессе устанавливается в соответствии с текущим окружением (определяемым переменными окружения), вместо дефолтовой «C».
>
>setlocale(LC_ALL,»»); — означает:
>
>По нашему: локаль в процессе устанавливается в соответствии с текущим окружением (определяемым
>переменными окружения), вместо дефолтовой «C».Это C. А в С++ как локаль устанавливать?
>>
>>setlocale(LC_ALL,»»); — означает:
>>
>>По нашему: локаль в процессе устанавливается в соответствии с текущим окружением (определяемым
>>переменными окружения), вместо дефолтовой «C».
>
>Это C. А в С++ как локаль устанавливать?#include
int main()
{
std::locale l(getenv(«LANG»));
std::locale::global(l);.
}
Архив | Удалить
Индекс форумов | Темы | Пред. тема | След. темаОцените тред (1=ужас, 5=супер)? [ Рекомендовать для помещения в FAQ] Форум русскоязычного сообщества Ubuntu
Страница сгенерирована за 0.041 секунд. Запросов: 25.
- Сайт
- Об Ubuntu
- Скачать Ubuntu
- Семейство Ubuntu
- Новости
- Форум
- Помощь
- Правила
- Документация
- Пользовательская документация
- Официальная документация
- Семейство Ubuntu
- Материалы для загрузки
- Совместимость с оборудованием
- RSS лента
- Сообщество
- Наши проекты
- Местные сообщества
- Перевод Ubuntu
- Тестирование
- RSS лента
© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.Обработка строк в C++/WinRT
С помощью C++/WinRT можно вызывать интерфейсы API среды выполнения Windows, используя типы широких строк стандартной библиотеки C++, такие как std::wstring (но не типы узких строк, такие как std::string). В C++/WinRT имеется настраиваемый строковый тип winrt::hstring (определенный в базовой библиотеке C++/WinRT — %WindowsSdkDir%Include\\cppwinrt\winrt\base.h ). Этот строковый тип фактически принимают и возвращают конструкторы, функции и свойства среды выполнения Windows. Но, во многих случаях благодаря конструкторам преобразования hstring и операторам преобразования можно выбирать, следует ли учитывать hstring в коде клиента. Если вы разрабатываете интерфейсы API, вероятность того, что вам нужно знать о hstring, возрастает.
В C++ существует множество строковых типов. Различные варианты существуют во множестве библиотек в дополнение к std::basic_string из стандартной библиотеки C++. В С++17 имеются служебные программы для преобразования строк и std::basic_string_view, чтобы заполнить пробелы между всеми строковыми типами. Тип winrt::hstring дает возможность преобразования с помощью std::wstring_view для обеспечения взаимодействия, для которого был создан std::basic_string_view.
Использование std::wstring (и, при необходимости, winrt::hstring) с Uri
public: Uri(winrt::hstring uri) const;Но hstring имеет конструкторы преобразования, позволяющие работать с ним, не учитывая этот факт. Ниже приведен пример кода, показывающий, как создать Uri из литерала широкой строки, представления широкой строки и std::wstring.
#include #include using namespace winrt; using namespace Windows::Foundation; int main() < using namespace std::literals; winrt::init_apartment(); // You can make a Uri from a wide string literal. Uri contosoUri< L"http://www.contoso.com" >; // Or from a wide string view. Uri contosoSVUri< L"http://www.contoso.com"sv >; // Or from a std::wstring. std::wstring wideString< L"http://www.adventure-works.com" >; Uri awUri< wideString >; >Метод доступа к свойству Uri::Domain имеет тип hstring.
public: winrt::hstring Domain();// Access a property of type hstring, via a conversion operator to a standard type. std::wstring domainWstring< contosoUri.Domain() >; // L"contoso.com" domainWstring = awUri.Domain(); // L"adventure-works.com" // Or, you can choose to keep the hstring unconverted. hstring domainHstring< contosoUri.Domain() >; // L"contoso.com" domainHstring = awUri.Domain(); // L"adventure-works.com"public: hstring ToString() const;Uri реализует интерфейс IStringable.
// Access hstring's IStringable::ToString, via a conversion operator to a standard type. std::wstring tostringWstring< contosoUri.ToString() >; // L"http://www.contoso.com/" tostringWstring = awUri.ToString(); // L"http://www.adventure-works.com/" // Or you can choose to keep the hstring unconverted. hstring tostringHstring< contosoUri.ToString() >; // L"http://www.contoso.com/" tostringHstring = awUri.ToString(); // L"http://www.adventure-works.com/"Можно использовать функцию hstring::c_str для получения стандартной широкой строки из hstring (так же, как и из std::wstring).
#include std::wcoutЕсли у вас есть hstring, значит, вы можете получить Uri.
Uri awUriFromHstring< tostringHstring >;Рассмотрим метод, который принимает hstring.
public: Uri CombineUri(winrt::hstring relativeUri) const;Все параметры, которые мы рассмотрели, также применяются в таких случаях.
std::wstring contact< L"contact" >; contosoUri = contosoUri.CombineUri(contact); std::wcoutДля hstring имеется член-оператор преобразования std::wstring_view, и преобразование осуществляется без дополнительных затрат.
void legacy_print(std::wstring_view view); void Print(winrt::hstring const& hstring)
Функции и операторы winrt::hstring
Для winrt::hstring реализован ряд конструкторов, операторов, функций и итераторов.
Тип hstring является диапазоном, поэтому вы можете использовать его с основанным на диапазоне for или с std::for_each . Он также предоставляет операторы сравнения для естественного и эффективного сравнения с его аналогами в стандартной библиотеке C++. Кроме того, он включает в себя все, что необходимо для использования hstring в качестве основы для ассоциативных контейнеров.
Мы понимаем, что многие библиотеки C++ используют std::string и работают только с текстом UTF-8. Для удобства мы предоставляем вспомогательные методы, такие как winrt::to_string и winrt::to_hstring, для двустороннего преобразования.
WINRT_ASSERT — это макроопределение, которое передается в _ASSERTE.
winrt::hstring w< L"Hello, World!" >; std::string c = winrt::to_string(w); WINRT_ASSERT(c == "Hello, World!"); w = winrt::to_hstring(c); WINRT_ASSERT(w == L"Hello, World!");Дополнительные примеры и сведения о функциях и операторах hstring приведены в справочных материалах по API winrt::hstring.
Обоснование для winrt::hstring и winrt::param::hstring
Среда выполнения Windows реализуется в знаках wchar_t, но двоичный интерфейс приложения (ABI) среды выполнения Windows не является подмножеством того, что предоставляют std::wstring или std::wstring_view. Их использование приведет к значительной неэффективности. Вместо этого C++/WinRT предоставляет winrt::hstring, представляющий собой неизменяемую строку, согласованную с базовым HSTRING и реализованную за интерфейсом, аналогичным std::wstring.
Можно заметить, что входные параметры C++/ WinRT, которые логически должны принимать winrt::hstring, фактически ожидают winrt::param::hstring. Пространство имен param содержит набор типов, используемых исключительно для оптимизации входных параметров для естественной привязки к типам стандартной библиотеки C++, а также позволяющих избежать копий и других аспектов, снижающих эффективность. Эти типы не следует использовать напрямую. Если вы хотите использовать оптимизацию для собственных функций, применяйте std::wstring_view. Также см. статью о передаче параметров в интерфейс ABI.
Идея состоит в том, что вы можете по большей части игнорировать особенности управления строками среды выполнения Windows и просто эффективно работать с тем, что вам известно. Это важно, учитывая, насколько активно строки используются в среде выполнения Windows.
Форматирование строк
Одно из средств форматирования строк — std::wstringstream. Вот пример, который форматирует и отображает простое сообщение отладочной трассировки.
#include #include #include . void MainPage::OnPointerPressed(winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e) < winrt::Windows::Foundation::Point const point< e.GetCurrentPoint(nullptr).Position() >; std::wostringstream wostringstream; wostringstream
Правильный способ задать свойство
Для установки свойств значение передается в функцию задания. Приведем пример.
// The right way to set the Text property. myTextBlock.Text(L"Hello!");Ниже приведен неправильный код. Компиляция происходит, но все, что выполняется — это изменение значения winrt::hstring, возвращаемое функцией получения доступаText(), а затем результаты отклоняются.
// *Not* the right way to set the Text property. myTextBlock.Text() = L"Hello!";Важные API
- Структура winrt::hstring
- Функция winrt::to_hstring
- Функция winrt::to_string
- Ввод и вывод wcin & wcout, Аноним, 14:04 , 11-Дек-08, ( 7 )
- Ввод и вывод wcin & wcout, vic, 15:07 , 10-Дек-08, ( 6 )