首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >stringstream >>操作符

stringstream >>操作符
EN

Stack Overflow用户
提问于 2012-12-22 00:43:07
回答 2查看 7.3K关注 0票数 6

我有这样的代码:

代码语言:javascript
复制
    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文档,但找不到为什么会发生这种情况的解释。这是编译器特定的行为,还是我可以依赖它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-22 00:49:04

这是因为operator>>的行为类似于格式化的输入函数。格式化输入函数的过程的一部分是:

通过构造带有noskipws (第二个)参数

的类的对象,false开始执行每个格式化的输入函数。

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

如果您希望一次读取每一行,请使用std::getline。此函数的行为类似于一个未格式化的输入函数,它将noskipws设置为true并读取一行文本(由行终止符( std::getline()的参数3(默认为‘\n’)定义))。

票数 8
EN

Stack Overflow用户

发布于 2012-12-22 00:48:00

Read up here.

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

因此,根据标准,它将沿着流中的任何内容蹒跚前行,直到它真正找到有趣的东西,读回给你听,然后停止。下次再做同样的事情。

另一方面,std::getline将读取直到下一个换行符的所有内容(这将从流中删除,但不会返回给您),并在std::string中将其返回给您。然后,您可以从该string获取您想要的内容(例如,一个数字)。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13993951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档