URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7760
[ Назад ]

Исходное сообщение
"Ввод и вывод wcin & wcout"

Отправлено sy , 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

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


Содержание

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

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

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

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


"Ввод и вывод wcin & wcout"
Отправлено vic , 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;
}


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

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


"Ввод и вывод wcin & wcout"
Отправлено vic , 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.

http://www.opennet.me/man.shtml?topic=setlocale&category=3&r...

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


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

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


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

#include <cstdlib>

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

    .....
}


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

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