1

我目前正在尝试计算文件中的字数。在此之后,我打算让它计算文件中两个单词之间的单词。例如。我的文件可能包含。“你好,我的名字是詹姆斯”。我想数单词,所以 5。然后我想数“Hello”和“James”之间的单词数,所以答案是 3。我无法完成这两项任务。主要是因为不确定如何构建我的代码。在这里的任何帮助将不胜感激。我目前使用的代码是使用空格来计算单词。

这是我的代码:

读字.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()
{
    int count = 0;
    ReadWords rw("hamlet.txt");
    while(rw.isNextWord()){
        rw.getNextWord();
                count++;
    }
    cout << count;
    rw.close();
}

它目前所做的是计算字符数。我敢肯定这只是一个简单的修复和我错过的一些愚蠢的事情。但是我已经尝试了足够长的时间来寻求帮助。

任何帮助是极大的赞赏。:)

4

5 回答 5

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;
}
于 2012-11-15T17:56:14.570 回答
1

istream::operator<<()您可以简单地使用读取空格分隔的单词,而不是逐个字符地解析文件。<<返回流,它的计算结果truebool仍然可以从中读取流。

vector<string> words;
string word;
while (wordfile >> word)
    words.push_back(word);

有一个使用<iterator>and<algorithm>实用程序的通用公式,它更冗长,但可以与其他迭代器算法组合:

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

然后你就有了单词的数量,并且可以随心所欲地使用它们:

words.size()

如果要查找"Hello"and "James",请使用find()from<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()from <iterator>

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

这样做的好处是更能描述你实际在做什么。另外,为了将来参考,这种代码:

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

可以简化为:

bool f() {
    return x;
}

由于x已经被转换boolif.

于 2012-11-15T18:00:38.740 回答
0

我认为“返回下一个单词;” 应该改为“else return nextword;” 否则,无论字符是什么,您每次都会从函数 getNextWord 返回。

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
    }
}
于 2012-11-15T17:59:34.620 回答
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;
于 2012-11-15T18:03:40.747 回答
0

试试这个:线下

nextword.append(1, c);

添加

continue;
于 2012-11-15T20:35:22.087 回答