【问题标题】:How can I read multiple wstring lines? [duplicate]如何读取多个 wstring 行? [复制]
【发布时间】:2021-06-29 19:25:17
【问题描述】:

是否可以读取多行国际字符?我可以用简单的 ascii 字符串做到这一点:

#include <iostream>
#include <string>

void main ()
{
    std::string text{};
    //I cannot use std::wcin in that manner
    //std::wcout << "Enter any arbitrary text terminated by an asterisk:" << std::endl;
    //std::wstring wtext{};
    //std::getline (std::wcin, wtext, '*');THIS SPECIFIC LINE DOESN'T COMPILE
    std::cout << "Enter any arbitrary text terminated by an asterisk:" << std::endl;
    std::getline (std::cin, text, '*');
}

如何使用支持国际字符的字符串类型来实现同样的效果?

根据要求,我包含了无法编译的行。 我的疑问是:还有其他方法吗?

错误是:没有重载函数“std::getline”的实例与参数列表匹配

已解决。请注意在接受的答案中存在L 前缀'*'。在我使用wcinwstring(会产生编译错误的那个)注释掉的std::getline 调用中,我忘记使用wchar_t 文字并改用char 文字。因此类型不匹配(stringcharwstringwchar_t 组成——又名宽字符)。要表示一个宽字符文字,需要添加一个L 作为前缀,即L'*'

【问题讨论】:

  • 我不能以那种方式使用 std::wcin 为什么不呢?
  • 另外,C++ 对 unicode 的支持很糟糕。如果你想使用 unicode,你应该得到一个专用的库,让你的生活更轻松。
  • std::getline 是一个使用基本模板std::basic_string模板。因此可以处理任何类型的字符,只要流和字符串都使用相同的字符类型。
  • 也许问题是您仍然使用窄字符'*' 而不是宽字符L'*'?分隔符必须与流和字符串的字符类型相同。
  • Works just fine here。您是否偶然忘记在调用getline 时将'*' 更改为L'*'

标签: c++ c++17


【解决方案1】:

这里是使用std::wstringstd::wcinstd::wcout 的示例

顺便说一句:you shouldn't mixstd::cinstd::coutstd::cerrstd::wcinstd::wcoutstd::wcerr。如果您选择使用std::wcin,请仅使用std::wcinstd::wcoutstd::wcerr

编辑:如果您在std::getline 中使用std::wcin,则所有参数都必须是宽的,因为std::getline 只为字符类型获取一个模板参数,并多次使用它:对于流,输出字符串, 和分隔符。

#include <iostream>
#include <string>

int main ()
{
    std::wstring text{};
    
    std::wcout << L"Enter any arbitrary text terminated by an asterisk:" << std::endl;
    std::getline (std::wcin, text, L'*');
}

【讨论】:

  • 是的,'*' 中缺少 L 是问题所在。
  • @paulsm4 它就在那里。我强调了,可能不是很清楚。
  • @SHR 你能特别提到 * 前面缺少 L 以使其成为一个宽字符吗?这就是我的代码出了什么问题。我已经知道不混合流的事情,这就是为什么这些行被注释掉了。
猜你喜欢
  • 2013-06-20
  • 2016-02-21
  • 2013-10-27
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多