统计单词程序将整个文件作为一个单词

时间:2017-11-12 20:47:45

标签: c++ while-loop eof word-count

初学者到C ++并在此编程

我想编写一个计算文件中单词数量的程序。 我只用一个文件测试它,但它应该适用于具有不同格式的其他文件,即。多个空间。 (我假设现在文件打开等没有问题)

这是我的代码:

#include <iostream> // these are the only imports I can use
#include <fstream>
#include <string>

using namespace std;

ifstream fin("story.txt"); // open the file called filename

void skip_space(char c) {
    cout << "skip_space()\n";

    while (c == ' ' || c == '\n' || c == '\t') { // as long as char is space
        c = fin.get(); // get next character from file

        if (fin.eof()) { // if eof is raised
            return;
        }
    } // while
    return;
}

void skip_char(char c) {
    cout << "skip_char()\n";

    while (c != ' ' || c != '\n' || c != '\t') { // as long as char is not space
        c = fin.get(); // get next character from file

        if (fin.eof()) { // if eof is raised
            return;
        }
    }
    return;
}


void num_words() { 
    cout << "num_words()\n";
    int word_count = 0;
    char c = fin.get(); // get first character of file

    while (!fin.eof()) { // while not end of file

        if (c == ' ' || c == '\n' || c == '\t') {
            skip_space(c); // loops until an nonblank character is reached
        } else { // if not a blank
            word_count++; // increment count
            skip_char(c); // loops until a space is reached
        }
    }

    cout << "story.txt" << " has " << word_count << " words\n";
    // prints a message to cout indicating the number of words in filename. 
    // A word is defined as the string that an input stream (such as cin) returns when reading a string value.
}

int main() {
    num_words();
}

以下是文件的内容:

One day
a green
a frog ate a 
princess.

当我运行代码时,输​​出是

num_words()
skip_char()
story.txt has 1 words

问题是word_count是1而不是9.我总体上很困惑。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

如果您写while (c != ' ' || c != '\n' || c != '\t'),那么无论c的值是多少,都会始终满足此条件(因为对于任何c,它肯定与{{1}不同或者与' ')不同。

你可能意味着'\n'

进一步注意,当您使用C ++标记问题时,您可以使用while (! (c==' ' || c !== '\n' || c == '\t')) { ...,它会自动跳过任何空白区域,并只计算此操作成功的频率。

答案 1 :(得分:0)

您的程序中有一个小的逻辑流程。问题出在你的skip_char函数中。 看看这一行:

cin >> aString

想想如果你是一个读取空格字符会发生什么。条件应该是:

while (c != ' ' || c != '\n' || c != '\t')

我强烈建议您理解为什么您的情况有问题,并且还要了解如何自行查找此类错误,例如,考虑您可以为代码添加哪种类型的打印以便找到此错误。另一个选择是尝试熟悉在您使用的系统中工作的调试器。