文件中的字数,c ++

use*_*774 2 c++ file count stream

我正在尝试计算文件中的单词数量,我知道这个问题已经被问过,但我已经尝试了一些我见过的实现,但是我一直收到错误.

我正在阅读的文件中的行是"Super Chill",但是当我运行代码时,我得到一个计数3,其中>>第一次获得Super,然后两次获得Chill.关于这种方法,我有几个问题:

1)While(in)寻找什么?怎么知道什么时候停止?

2)为什么"寒意"用>>存储两次?

这是代码

int countWords(std::istream& in){ // line in file is -> Super Chill

    int count = 0;
    std::string word;
    while (in) {
        in >> word;
        if (word != "") {
            count+= 1;
        }
    }

    return count;
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 5

while (in)检查是否没有发生错误.这和写作一样while (!in.fail())

在你打电话in >> word并获得第一个"寒意"后,while (in)仍然是真的,直到下一次打电话给in >> word.当你in >> word再次点击它失败,因为它在文件的末尾并且没有写任何内容word,但是word变量在上一次仍然有"Chill",所以你再次计算它.然后while (in)在下一次迭代时最终失败.

调用while (in >> word) { ++count; }工作因为in >> word实际上是in.operator>>(word)碰巧返回的函数istream&,并且istream有一个operator bool方法允许你在一个条件而不是写条件中使用它!in.fail().我知道,有点环形交叉路口.点是,它调用in >> word,然后检查if (in),如果它通过,然后调用++count;并再次迭代.与您的原始技术相比,word即使in >> word失败也会计算之前的技术.

为了使这一点更清楚,可能有助于知道将原始代码的if语句更改为if (in)也可以工作,但是会有一些不好的代码.

作为最后的结论,整个函数可以写成:

int countWords(std::istream& in) {
    int count = 0;
    for (std::string word; in >> word; ++count) {}
    return count;
}
Run Code Online (Sandbox Code Playgroud)