我有这段代码:
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
文档但我无法找到解释为什么会发生这种情况的原因。这是编译器特定的行为,还是我可以依赖它?
答案 0 :(得分:8)
这是因为operator>>
表现为格式化的输入函数。格式化输入函数的部分过程是:
每个格式化的输入函数都是通过构造一个具有
noskipws
(第二个)参数false的类哨兵的对象来开始执行的。
当noskipws
设置为false(并且流上的skipws
标志为true,这是默认值)时,sentry
对象“提取并丢弃每个字符,只要下一个可用的输入字符c
是一个空白字符。“
如果您想一次阅读每一行,请使用std::getline
。此函数表现为无格式输入函数,其noskipws
设置为true并读取一行文本(由行终止符定义(std :: getline()的参数3(其中)默认为'\ n')))。
答案 1 :(得分:2)
表现为FormattedInputFunction。构建和检查后 哨兵对象可以跳过前导空格,提取 连续的字符并将它们存储在a的连续位置 字符数组,其第一个元素由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%这是同样在这种情况下。我不熟悉语言环境。