繁体   English   中英

stringstream >>运算符

[英]stringstream >> operator

我有这个代码:

    std::string s = "\n\n\n\n+\n\n\n+";
    std::stringstream serializedDataStream(s);

    std::string plusCharacter, plusCharacter2;
    serializedDataStream >> plusCharacter ;
    cout << "plusCharacter "<<plusCharacter << "\n";
    serializedDataStream >> plusCharacter2 ;
    cout << "plusCharacter "<<plusCharacter2;

    //OUTPUT:
    //    plusCharacter +
    //    plusCharacter +

这意味着stringsteam >>运算符跳过了新行。 我查看了std::stringstream文档但我无法找到解释为什么会发生这种情况的原因。 这是编译器特定的行为,还是我可以依赖于此?

这是因为operator>>表现为格式化的输入函数 格式化输入函数的部分过程是:

每个格式化的输入函数通过使用noskipws (第二个)参数false构造类哨兵的对象来开始执行。

noskipws设置为false(并且流上的skipws标志为true,这是默认值)时,只要下一个可用输入字符c是空白字符, sentry对象“就会提取并丢弃每个字符”。

如果要一次读取每一行,请使用std::getline 此函数表现为无格式输入函数 ,其noskipws设置为true并读取一行文本(由行终止符定义(std :: getline()的参数3(默认为'\\ n')))。

在这里阅读。

表现为FormattedInputFunction。 在构造和检查可以跳过前导空格的哨兵对象之后,提取连续的字符并将它们存储在由s指向其第一个元素的字符数组的连续位置处。

因此,按照标准,它将沿着流中的任何东西蹒跚学步,直到它实际发现一些有趣的东西,然后读回给你,然后停止。 然后下次再做同样的事情。

另一方面, std::getline将读取下一个换行符的所有内容 (这将从流中删除但不会返回给你)并在std::string中将它全部返回给你。 然后由你来得到你想要的东西从(如数字) string

编辑:我正在努力通过默认语言环境确切地找到哪些字符被认为是空格。 认为它将与为isspace (继承自c)定义的相同,即space (0x20), form feed (0x0c), line feed (0x0a), carriage return (0x0d), horizontal tab (0x09) and vertical tab (0x0b). 但是我无法说服自己100%在这种情况下它是一样的。 我不熟悉语言环境。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM