使用std::wcin读取wchar_t总是得到LF (10,0xa)
Using std::wcin to read wchar_t always gives LF (10, 0xA)
我在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;
}
在我的一个项目中,这可以完美地工作(在调试和发布配置中)。在我的另一个项目中,这个非常相同的代码(也只是wmain
中的代码)行为奇怪(也在两种配置中):它不会停止等待我的输入后"键入'y'输入下一个参数",而是立即从流中读取换行字符。
我甚至尝试了wcin >> skipws >> userabort;
,但结果相同。我完全不知道是什么原因造成的。它可能是一些编译器设置或导入文件的结果吗?或者它可能是按返回将userinput
wstring发送到程序的结果?
当未指定"将wchar_t
视为内置类型" (/Zc:wchar_t
)选项时,将出现此行为。
转到项目的属性,在配置属性,C/c++,语言下,并确保"将WChar_t视为内置类型"设置为yes。
这是因为当该选项被设置为no时,wchar_t
将成为unsigned short
的typedef
,这意味着您不能再对其进行过载。因此,表达式wcin >> userabort
为unsigned short
而不是为wchar_t
调用operator>>
,这不会给出正确的结果。
我无法解释为什么这段代码可以在一个程序中工作,但在另一个程序中失败。在我看来是不对的。我认为你误解了wcin.clear();
的作用。我猜您正在考虑清除流中的任何挂起输入,但它没有。方法就是这一长串代码
wcin.ignore(std::numeric_limits<std::streamsize>::max());
你需要#include <limits>
来获得std::numeric_limits
。
相关文章:
- boost::log 输出到 Visual Studio 输出控制台 - 为格式添加额外的 LF/CR
- 格式“%lf”期望“ double *”类型的论点,但参数2具有“ poly term **”类型
- C/C++ TensorFlow hello_tf.c:(.text+0xa):对"TF_Version"的未定义引用
- 正在分析具有CR LF EOL结构的.csv文件
- C++ 套接字发送不传输 CR 和 LF
- 为什么在Windows中将CR LF更改为LF
- 信用CR或LF推到下一行
- gzstream在windows上通过mingw注入CR + LF
- 使用std::wcin读取wchar_t总是得到LF (10,0xa)
- cout set_precision(5) + 固定和 printf( "%lf.5" ,var) 之间的区别
- 获取 std :: ifstream 来处理 LF、CR 和 CRLF