如何重置.get()

How to reset .get()

本文关键字:get 何重置      更新时间:2023-10-16

我正试图从一个文件中找到字母表中的字母数量。我可以得到第一个字母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;
}

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

在循环的第一次迭代中,文件将被完全读取,这样到第二次迭代时,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';
}