std :: getline在最后一次出现分隔符后从std :: cin跳过输入,但是没有来自std :: istringstream的输入

时间:2016-02-08 11:30:24

标签: c++ getline istringstream

我需要阅读一些由空格分隔的输入,我用的主要结构是:

while(std::getline(std::cin, s, ' ')){
    std::cout << s << std::endl;
}

输入:&#34;这是一些文字&#34;

S的输出将是:&#34;这&#34;,&#34;&#34;,&#34; some&#34 ;,因此跳过最后一个空格后的最后一个输入。

我想在程序中包含最后一条输入,所以我去找一个解决方案并找到以下内容:

while (std::getline(std::cin, line)) {
    std::istringstream iss(line);

    while (std::getline(iss, s, ' ')) {
        std::cout << s << std::endl;
    }
}

输入:&#34;这是一些文字&#34;

S的输出将是:&#34;此&#34;,&#34;是&#34;,&#34;一些&#34;,&#34; text&#34;,这正是我想要。

我的问题是:为什么在分隔符的最后一次出现之后从带有分隔符的std :: cin读取跳过输入,但是从std :: istringstream读取却没有?

1 个答案:

答案 0 :(得分:3)

  

我的问题是:为什么在分隔符的最后一次出现后从std::cin读取分隔符会跳过输入,但是从std::istringstream读取却没有?

没有。

在你的第一个例子中:

while(std::getline(std::cin, s, ' ')){
    std::cout << s << std::endl;
}

您专门从换行中读取由单个空格分隔的项目。因为该行(表面上)以换行符结束,所以它永远不会从输入字符串中完成提取,因为它期望' '或EOF。

在你的第二个例子中:

while (std::getline(std::cin, line)) {
    std::istringstream iss(line);

    while (std::getline(iss, s, ' ')) {
        std::cout << s << std::endl;
    }
}

第一次使用std::getline从您的示例句中剥离换行符。然后根据一些基本规则提取项目。

以下是规则(from cppreference)

Extracts characters from input and appends them to str until one of the following occurs (checked in the order listed)
    a) end-of-file condition on input, in which case, getline sets eofbit.
    b) the next available input character is delim, as tested by Traits::eq(c, delim), in which case the delimiter character is extracted from input, but is not appended to str.
    c) str.max_size() characters have been stored, in which case getline sets failbit and returns.