[英]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.