6

我有这个代码:

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

4

2 回答 2

8

发生这种情况是因为operator>>其行为类似于格式化的输入函数。格式化输入函数的部分过程是:

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

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

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

于 2012-12-21T16:49:03.737 回答
2

在这里阅读。

表现为 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% 说服自己在这种情况下是相同的。我不擅长语言环境。

于 2012-12-21T16:48:00.177 回答