【问题标题】:Why doesn't std::noskipws work, or what is it supposed to do?为什么 std::noskipws 不起作用,或者它应该做什么?
【发布时间】:2011-08-05 00:12:54
【问题描述】:

首先我的理解是

cin >> std::noskipws >> str;

应该将整行从cin 插入str,例如“我有空格”。然而,这只会将“i”放入str。这可能是一个错误的假设,在这种情况下std::noskipws 做了什么?

我知道有一个函数 std::getline 确实有效,但只是出于教育目的,我决定尝试让 std::noskipws 为我工作。我过去尝试过,但它从来没有用过,所以我通常继续使用std::getline

到目前为止,我认为我发现std::noskipws 在技术上只是取消了std::skipws 内部对basic_iostream 的调用

ios_base::unsetf(std::ios::skipws); 

ios_base::unsetf(ios_base::skipws);

所以我尝试继承我自己的流形式basic_iostream 并手动设置这些标志(取消设置)。还是没有骰子。

那么,我是完全偏离了基地还是有办法让这项工作发挥作用?

【问题讨论】:

标签: c++ std cin


【解决方案1】:

std::noskipws 告诉 istream 在尝试读取类型时不要跳过任何前导空格。当没有前导空格时,标志没有影响。

【讨论】:

  • 啊,很公平,我认为没有标志告诉它空格不是分隔符?
  • @Digital:您可以使用std::ctype 格式化方面重新定义空格,但您喜欢。如果你愿意涉足各个方面。
  • 或者你可以创建一个 line 类,它有自己的操作符 >> 来读取一行。
【解决方案2】:

std::skipws 的工作方式如下:std::istream 始终保持当前读取位置。如果设置了std::skipws,则在调用operator>> 之前,当前读取位置前进到第一个非空格字符。

您看到的行为(停在'i' 之后的第一个空格处)是由operator>> 引起的std::string(和std::wstring)。该运算符没有考虑std::istream 标志。另一个类型的operator<< 可能会做出不同的决定,甚至跨空格继续。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2013-02-15
    • 1970-01-01
    • 2011-02-23
    • 2017-03-23
    相关资源
    最近更新 更多