2011-04-13 149 views
5

首先我的理解是,为什么不std :: noskipws工作,或者它应该做什么?

cin >> std::noskipws >> str; 

应该cin像“我有空间”坚持一整行到str。但是,这只会将“我”放入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并手动设置这些标志(取消设置)。仍然没有骰子。

那么,我只是完全脱离基地或有办法让这项工作?

+0

好问题;欢迎来到:) :) – 2011-04-13 19:53:02

+0

也许你想[更改分隔符](http://stackoverflow.com/a/7304184/3484570),但我怀疑它。 – nwp 2015-08-11 14:35:06

回答

10

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

+0

啊,够公平的,我认为没有标志告诉它空白不是分隔符? – 2011-04-13 20:28:28

+0

如果你想读取整行输入,使用'getline'。 – 2011-04-13 20:36:06

+0

@Digital:你可以使用'std :: ctype'格式的facet来重新定义你喜欢的空白。如果你愿意进入方面。 – Potatoswatter 2011-04-13 20:49:35

2

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

你看到的行为(停止在第一空间'i'后)由operator>>std::string(和std::wstring)引起的。该操作员不考虑std::istream标志。另一种类型的operator<<可能会做出其他决定,甚至可以跨空间继续。

相关问题