检测stringstream是否到达末尾

26
我尝试编写一个函数,以便检测是否接近stringstream的末尾,但似乎不起作用。
这是一些代码:
std::string path(1.2.3);
int number;
std::stringstream ss(path);
while (!ss.eof()) {
    if (ss.peek() != '.') {
        ss >> number;
        if (ss.tellg() == path.length()) {
            std::cout << "Last one: " << number;
        } else {
            std::cout << number;
        }
    } else { ss.get(); }
}

我尝试使用ss.tellg() == path.length(),但是不起作用。有人有其他方法吗?


@Dave 那个也不行。 - JNevens
1个回答

23

我明白了...

std::string path(1.2.3);
int number;
std::stringstream ss(path);
while (!ss.eof()) {
    if (ss.peek() != '.') {
        ss >> number;
        if (ss.tellg() == -1) {
            std::cout << "Last one: " << number;
        } else {
            std::cout << number;
        }
    } else { ss.get(); }
}

嗯...你从来没有将某个值提取到number中,所以为什么要尝试打印它呢? - David G
4
最好只是使用 while (ss)。EOF 只是无法从流中读取的几个原因之一。 - isekaijin
@EduardoLeón是正确的。 当“ss”为false时,它意味着您无法再读取。 然后调用ss.eof()来判断“文件结尾”是否是导致您无法继续读取的原因。 - xuhdev
2
不应该在不了解它们可能返回什么的情况下使用建议的终止条件。@pyon 使用 while(ss) 会导致在退出时读取一个额外的虚假值。@JNevens ss.eof() 可能出现0的情况,所以我们不能确定循环退出的原因是预期的终止条件;这里有一些讨论 here - BoltzmannBrain
当 (ss.peek() != EOF) 怎么样? - Shaobo Zi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接