stringstream>>操作者

时间:2012-12-21 16:43:07

标签: c++ stringstream

我有这段代码:

    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文档但我无法找到解释为什么会发生这种情况的原因。这是编译器特定的行为,还是我可以依赖它?

2 个答案:

答案 0 :(得分:8)

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

  

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

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

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

答案 1 :(得分:2)

Read up here.

  

表现为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%这是同样在这种情况下。我不熟悉语言环境。