C ++计算两个单词之间的文件中的单词

时间:2012-11-15 17:51:09

标签: c++ file count words

我目前正在尝试计算文件中的字数。在此之后,我计划计算文件中两个单词之间的单词。例如。我的文件可能包含。 “你好,我的名字是詹姆斯”。我想计算单词,所以5.然后我想计算“你好”和“詹姆斯”之间的单词数,所以答案是3.我在完成这两项任务时遇到了麻烦。 主要是由于不完全确定如何构造我的代码。 这里的任何帮助将不胜感激。我目前使用的代码是使用空格来计算单词。

这是我的代码:

readwords.cpp

string ReadWords::getNextWord()
{
    bool pWord = false;
    char c;
    while((c = wordfile.get()) !=EOF)
    {
        if (!(isspace(c)))
        {
            nextword.append(1, c);
        }

        return nextword;
    }
}

bool ReadWords::isNextWord()
{
    if(!wordfile.eof())
    {
        return true;
    }
    else
    {
        return false;
    }
}

的main.cpp

main()
{
    int count = 0;
    ReadWords rw("hamlet.txt");
    while(rw.isNextWord()){
        rw.getNextWord();
                count++;
    }
    cout << count;
    rw.close();
}

它目前所做的是计算字符数。我敢肯定它只是一个简单的修复和愚蠢的东西,我想念。但我一直在努力寻找一些帮助。

非常感谢任何帮助。 :)

5 个答案:

答案 0 :(得分:1)

要算:

std::ifstream infile("hamlet.txt");
std::size_t count = 0;
for (std::string word; infile >> word; ++count) { }

仅在开始和结束之间计数:

std::ifstream infile("hamlet.txt");
std::size_t count = 0;
bool active = false;

for (std::string word; infile >> word; )
{
     if (!active && word == "Hello") { active = true; }
     if (!active) continue;
     if (word == "James") break;
     ++count;
}

答案 1 :(得分:1)

您可以简单地使用istream::operator<<()来读取以空格分隔的单词,而不是逐个字符地解析文件。 <<返回流,当仍然可以读取流时,该流的值为true {/ 1}}。

bool

使用vector<string> words; string word; while (wordfile >> word) words.push_back(word); <iterator>实用程序有一个共同的表述,它更详细,但可以与其他迭代器算法组合:

<algorithm>

然后你就拥有了多少单词,并且可以随心所欲地使用它们:

istream_iterator<string> input(wordfile), end;
copy(input, end, back_inserter(words));

如果您想查找words.size() "Hello",请使用"James"标题中的find()来获取其位置的迭代器:

<algorithm>

如果它们不在向量中,// Find "Hello" anywhere in 'words'. const auto hello = find(words.begin(), words.end(), "Hello"); // Find "James" anywhere after 'hello' in 'words'. const auto james = find(hello, words.end(), "James"); 将返回find();为了说明的目的而忽略错误检查,您可以通过取差异来计算它们之间的单词数,并调整范围中包含words.end()

"Hello"

您可以在此处使用const auto count = james - (hello + 1); ,因为operator-()是“随机访问迭代器”。更一般地说,您可以使用std::vector::iterator中的std::distance()

<iterator>

其优点是更能描述您实际在做什么。此外,为了将来参考,这种代码:

const auto count = distance(hello, james) - 1;

可以简化为:

bool f() {
    if (x) {
        return true;
    } else {
        return false;
    }
}

由于bool f() { return x; } 已将x转换为bool

答案 2 :(得分:0)

我认为“返回下一个字”;应该改为“else return nextword”;或者你每次都从函数getNextWord返回,无论char是什么。

string ReadWords::getNextWord()
{
    bool pWord = false;
    char c;
    while((c = wordfile.get()) !=EOF)
    {
        if (!(isspace(c)))
        {
            nextword.append(1, c);
        }

        else return nextword;//only returns on a space
    }
}

答案 3 :(得分:0)

计算所有单词:

std::ifstream f("hamlet.txt");
std::cout << std::distance (std::istream_iterator<std::string>(f),
                            std::istream_iterator<std::string>()) << '\n';

在两个单词之间计算:

std::ifstream f("hamlet.txt");
std::istream_iterator<std::string> it(f), end;
int count = 0;
while (std::find(it, end, "Hello") != end)
  while (++it != end && *it != "James")
    ++count;
std::cout << count;

答案 4 :(得分:0)

试试这个: 在线下

nextword.append(1, c);

添加

continue;