std::getline 在最后一次出现定界符后跳过来自 std::cin 的输入,但不包含来自 std::istringstream 的输入

std::getline skipping input from std::cin after last occurrence of delimiter, but not with input from std::istringstream

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

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

对于输入:"this is some text"

S 的输出将是:"this"、"is"、"some",从而跳过最后一个空格后的最后一段输入。

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

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

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

对于输入:"this is some text"

S 的输出将是:"this"、"is"、"some"、"text",这正是我想要的。

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

My question is: why does reading from std::cin with a delimiter skip the input after the last occurrence of the delimiter, but reading from std::istringstream does not?

没有。

在你的第一个例子中:

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

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

在你的第二个例子中:

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

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

第一个 while 中的 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.