The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Ввод и вывод wcin & wcout"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Ввод и вывод wcin & wcout"  
Сообщение от sy email(ok) on 10-Дек-08, 08:58 
Здравствуйте. Я так понимаю, что если в моей системе локаль настроена правильно, то следующий код должен работать так, как я думаю:

1. Вывести кол-во символов в строке "Привет!", т.е. 7
2. Вывести строку "Привет!".
3. Считывать строки с стандартного потока и выводить их длинну.


А вот код и как он работает:
cat ./main.cpp
#include <iostream>

int main()
{
        std::wstring s(L"Привет!");
        std::wcout << s.length() << s << "\n";
        while ( std::wcin >> s )
        {
                std::wcout << s.size() << "\n";
        }

        std::wcout << " wcin.eof()=" << std::wcin.eof() << "\n";
        std::wcout << " wcin.good()=" << std::wcin.good() << "\n";
        std::wcout << " wcin.fail()=" << std::wcin.fail() << "\n";
        std::wcout << " wcin.bad() =" << std::wcin.bad() << "\n";
        return 0;
}

sy@localhost ~$ g++ main.cpp && ./a.out
7??????!
qwe
3
вап
wcin.eof()=1
wcin.good()=0
wcin.fail()=1
wcin.bad() =0

т.е. Русские буквы не вводятся и не выводятся. Где я не прав? Подскажите, пожалуйста...

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Ввод и вывод wcin & wcout"  
Сообщение от Fuzzy (ok) on 10-Дек-08, 11:35 
Если заменить wcin/wcout/wstring на cin/cout/string и убрать L в s(L"Привет!"), все будет работать.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Ввод и вывод wcin & wcout"  
Сообщение от sy email(??) on 10-Дек-08, 12:55 
>Если заменить wcin/wcout/wstring на cin/cout/string и убрать L в s(L"Привет!"), все будет
>работать.

Ага, только учитывая, что у меня юникод, в первом пункте я получу не кол-во букв, а кол-во байт, т.е 13.

Какбы не канает такое решение....

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Ввод и вывод wcin & wcout"  
Сообщение от vic (??) on 10-Дек-08, 14:33 
В самом начале следует установить локаль. Еще по ходу пьесы может потребоваться подергать всякие ios_base::imbue для потоков, ну там запятые вместо точек выводить для double :)

#include <iostream>
#include <string>

int main()
{
    setlocale(LC_ALL, "");

    std::wstring ws(L"Уличная магия");
    std::wcout << ws << std::endl;

    return 0;
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Ввод и вывод wcin & wcout"  
Сообщение от sy email(??) on 10-Дек-08, 14:56 
>В самом начале следует установить локаль. Еще по ходу пьесы может потребоваться
>подергать всякие ios_base::imbue для потоков, ну там запятые вместо точек выводить
>для double :)

Да, так как Вы написали все работает. Правда, что-то я ничего не понял.
Локаль должна же быть установлена в соответствии с переменными окружения? Или нет?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Ввод и вывод wcin & wcout"  
Сообщение от vic (??) on 10-Дек-08, 15:07 
>>В самом начале следует установить локаль. Еще по ходу пьесы может потребоваться
>>подергать всякие 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.

https://www.opennet.ru/man.shtml?topic=setlocale&category=3&r...

По нашему: локаль в процессе устанавливается в соответствии с текущим окружением (определяемым переменными окружения), вместо дефолтовой "C".

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Ввод и вывод wcin & wcout"  
Сообщение от Аноним (??) on 11-Дек-08, 14:04 
>
>setlocale(LC_ALL,""); - означает:
>
>По нашему: локаль в процессе устанавливается в соответствии с текущим окружением (определяемым
>переменными окружения), вместо дефолтовой "C".

Это C. А в С++ как локаль устанавливать?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Ввод и вывод wcin & wcout"  
Сообщение от vic (??) on 11-Дек-08, 15:31 
>>
>>setlocale(LC_ALL,""); - означает:
>>
>>По нашему: локаль в процессе устанавливается в соответствии с текущим окружением (определяемым
>>переменными окружения), вместо дефолтовой "C".
>
>Это C. А в С++ как локаль устанавливать?

#include <cstdlib>

int main()
{
    std::locale l(getenv("LANG"));
    std::locale::global(l);

    .....
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Ввод и вывод wcin & wcout"  
Сообщение от sy email(??) on 10-Дек-08, 14:45 
Похоже это старый баг http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35353

Правда я не понял, что означает статус SUSPENDED...

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру