Использование std :: wcin для чтения wchar_t всегда дает LF (10, 0xA) - PullRequest
2 голосов
/ 26 августа 2011

Я использую этот код в MSVC ++ 2010 для реализации пользовательского цикла ввода:

int wmain(int argc, wchar_t* argv[]) 
{
    vector<wstring> arguments;
    wstring userinput;
    wchar_t userabort;
    do
    {
        wcout << L"Please type param #" << argc++ << L":" << endl;
        wcin >> userinput;
        arguments.push_back(userinput);
        userinput.clear();
        wcout << L"Type 'y' to input next param, 'n' to start program:" << endl;
        wcin >> userabort;
        wcout << L"Userabort: " << userabort << " (" << int(userabort) << ")" << endl;
    }
    while (userabort == L'y' || userabort == L'Y'
        || userabort == L'j' || userabort == L'J');
    return 1;
}

В одном из моих проектов это работает безупречно (как в конфигурации Debug, так и в Release).В другом из моих проектов этот тот же самый код (также как и только код в wmain) ведет себя странно (также в обеих конфигурациях): он не останавливает ожидание моего ввода после «Типа y» для ввода следующего параметра », но вместо этого сразу читает символ перевода строки из потока.

Я даже пытался wcin >> skipws >> userabort;, но тот же результат.Я не знаю, что вообще может быть причиной этого.Может ли это быть результатом какой-то настройки компилятора или импортированного файла?Или это может быть результатом нажатия return для отправки userinput wstring в программу?Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 26 августа 2011

Такое поведение возникает, если не указан параметр «Рассматривать wchar_t как встроенный тип» (/Zc:wchar_t).

Перейти к свойствам проекта в разделе «Свойства конфигурации», C /C ++, Language и убедитесь, что для параметра «Лечить WChar_t как встроенный тип» задано значение «да».

Это происходит потому, что если для параметра установлено значение «нет», wchar_t становится typedef для unsigned shortЭто означает, что вы больше не можете перегружать его.В результате выражение wcin >> userabort вызвало operator>> для unsigned short, а не для wchar_t, что не дает правильного результата.

0 голосов
/ 26 августа 2011

У меня нет объяснения, почему этот код будет работать в одной программе, но не будет работать в другой. Это выглядит неправильно для меня. Я думаю, вы неправильно понимаете, что делает wcin.clear();. Я думаю, вы думаете, что очищает любой ожидающий ввод из потока, но это не так. Способ сделать это - это полный набор кода

wcin.ignore(std::numeric_limits<std::streamsize>::max());

Вам понадобится #include <limits>, чтобы получить std::numeric_limits.

...