【问题标题】:Number of Words in a file, c++ [duplicate]文件中的字数,c ++ [重复]
【发布时间】:2016-03-15 10:27:36
【问题描述】:

我正在尝试计算文件中的字数,我知道有人问过这个问题,但我已经尝试了一些我见过的实现,但我一直收到错误。

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

1) While(in) 寻找什么?它如何知道何时停止?

2) 为什么“Chill”会被 >> 存储两次?

这里是代码

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;
}

【问题讨论】:

  • 改成while(in >> word) { ++count; }
  • 有效,但您介意回答一下 While(in) 到底在做什么以及为什么我两次“冷静”吗?

标签: c++ file count stream


【解决方案1】:

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

在您调用 in >> word 并获得第一个“Chill”后,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;并再次迭代。与您的原始技术相比,即使 in >> word 失败,也计算了之前的 word

为了更清楚地说明这一点,了解将原始代码的 if 语句更改为 if (in) 也可能会有所帮助,但会是一种糟糕的代码。

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

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

【讨论】:

  • 那么 >> 到底是做什么的呢?我知道它抓住了一个词,但它是否沿线移动了一些参考,在我的原始解决方案中,>> 第三次没有工作并且 while(in) 失败的“失败”构成什么?
【解决方案2】:

我看到您已经为您发布的问题找到了一种解决方案。不过,您可能需要考虑另一种可能性:

int countWords(std::istream& in){  
    return std::distance(std::istream_iterator<std::string>(in),
                         std::istream_iterator<std::string>());
}

这实际上并没有消除循环,而是将它隐藏在std::distance 中,这很难搞砸。

【讨论】:

  • 我对 istream_iterators 或距离不太了解,所以这让我很困惑,但我一定会查一下,谢谢!
  • @user2076774:非常值得学习两者(以及其他迭代器和算法)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 2016-05-29
  • 1970-01-01
相关资源
最近更新 更多