使用stringstream和stream运算符(>>)将缓冲区数据放入特定的数据类型?

时间:2018-04-01 21:42:35

标签: c++ c++11

正如标题所说,我在C ++中进行输入验证(在这种情况下,对于int)。我使用stringstream对象从用户获取,使用stringstream通过stream运算符分配给变量,如下所示:

if (sStream >> validInteger) {
    if ((sStream >> input)) {
         code code code
    }
}

所以在第一个if语句中,我获取了我创建的stringstream对象,并将其置于整数类型中。如果我使用stringstream将char放入该整数类型,则该语句将返回false,并且它实际上不会分配给整数,正如在这种情况下所预期的那样。

我知道如果你尝试使用赋值运算符将一个char文字赋值给一个int,它只会转换为该char的ASCII int值(比如int charInt =' c'工作正常,分配ASCII值)

所以这意味着sStream中内置了逻辑>> validInteger语句不转换数据类型,返回false并且实际上没有将数据分配给该变量。

我的问题是关于这个陈述的逻辑。这个逻辑在哪里内置?逻辑是否返回false而不是在流操作符(>>)或stringstream对象中分配?

我已经使用iostream和cstream对象(如cin和ifstream)对此进行了测试,并且它们的执行方式相同。但这个逻辑是否也构建在cin和fstream中?或者它只是在流操作符(>>)?

我的代码功能正常,一切都按预期工作,我只是想澄清一下C ++运算符/对象在这种情况下如何实际工作以供我自己使用。

2 个答案:

答案 0 :(得分:0)

操作:

   sStream >> validInteger

返回流对象,不是true,false或者是一些错误。可以通过void *的运算符重载将流对象的状态(或iostream库中的任何其他流对象类型)转换为可以使用if()或其他条件构造进行测试的内容。早期版本的C ++中的转换,以及最新版本中的bool转换。

答案 1 :(得分:0)

详细说明,您可以随时查看cppreference。在stringstream的顶部,您可以看到继承树,并与其他输入流进行比较以查看第一个共享祖先。然后,看看它:

istream::operator>>

  

(1)算术类型

     
    

从流中按顺序提取和解析字符,将它们解释为正确类型值的表示,     它被存储为val的值。         在内部,该函数首先构造一个sentry对象(noskipws设置为false)来访问输入序列。然后(如果     好的,它调用num_get :: get(使用流的选定语言环境)来     执行提取和解析操作,调整     因此流的内部状态标志。最后,它摧毁了     返回前的哨兵对象。

  

引以为傲的。实施了适当的类型检查。