我需要阅读一些由空格分隔的输入,我用的主要结构是:
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读取却没有?
答案 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.