如何重置.get()

时间:2014-10-10 20:11:02

标签: c++ get

我正在尝试从我拥有的文件中找到字母表中的字母数量。我可以得到第一个字母A来给我正确的数字,但是当for循环通过时它只给我0其余的字母。我觉得它与我的.get()有关,不是再次从文件的开头开始。我需要做些什么来解决这个问题?谢谢!

ifstream openFile("data.txt");
int numberOfLetters(0);
char letter;
for (int i = 0; i < 26; i++)
{
    numberOfLetters = 0;
    openFile.clear();
    while (!openFile.eof())
    {

        openFile.get(letter);
        if (letter == char(i + 97) || letter == char(i + 65))
        {
            numberOfLetters++;
        }
    }
    cout << numberOfLetters;
}

1 个答案:

答案 0 :(得分:0)

问题是你的外部循环:看起来你想使用这个循环来检查从文件中获取的字符是否等于某个范围内的某些字符。如果是这种情况,则在循环中执行输入不是可行的方法。

在循环的第一次迭代中,文件将被完全读取,这样第二次迭代openFile.get(letter)将不会将任何内容提取到letter中,使其保留其先前的值,对于其余的外部迭代。必须是最后一个值previous没有通过if()语句测试,因此numberOfLetter没有增加。

解决方案是更改检查字符是否为字母的方式。字符使用ASCII格式表示,ASCII格式只是映射到字符的整数。由于字符实际上是整数,因此可以对它们使用算术运算。此外,字符以ASCII格式表示,因此您可以简单地比较它们的值,看它们是否在字母字符范围内:

while (openFile.get(letter))
{
    if (('a' <= letter && letter <= 'z') || ('A' <= letter && letter <= 'Z'))
    {
        numberOfLetters++;
    }
}
cout << numberOfLetters;

幸运的是,标准库提供了一个为您执行此操作的函数std::isalpha()

...
if (std::isalpha(letter))
{
    numberOfLeters++;
}
...

根据您的评论,检查字符是否为字母是不够的。相反,请使用std::map之类的数据结构,以便保留特定字符数的总计数:

#include <map>

std:map<char, std::size_t> alpha_count;

while (openFile.get(letter))
{
    if (std::isalpha(letter))
        alpha_count[letter]++;
}

现在打印有多少特定字符,遍历地图并打印字符count()

for (auto&& c : alpha_count)
{
    std::cout << "# of " << c << ": " << alpha_count.count(c) << '\n';
}