我有这样的代码:
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文档,但找不到为什么会发生这种情况的解释。这是编译器特定的行为,还是我可以依赖它?
发布于 2012-12-22 00:49:04
这是因为operator>>的行为类似于格式化的输入函数。格式化输入函数的过程的一部分是:
通过构造带有noskipws (第二个)参数
的类的对象,false开始执行每个格式化的输入函数。
当noskipws设置为false (流上的skipws标志为true,这是默认值)时,sentry对象“只要下一个可用的输入字符c是空白字符,就提取并丢弃每个字符”。
如果您希望一次读取每一行,请使用std::getline。此函数的行为类似于一个未格式化的输入函数,它将noskipws设置为true并读取一行文本(由行终止符( std::getline()的参数3(默认为‘\n’)定义))。
发布于 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%地说服自己在这种情况下是相同的。我对语言环境不太熟悉。
https://stackoverflow.com/questions/13993951
复制相似问题