c++ - 计算文件中字母的出现次数

标签 c++ arrays counting

我正在尝试计算每个字母在文件中出现的次数。当我运行下面的代码时,它会计算“Z”两次。谁能解释一下为什么?

测试数据为:

abcdefghijklmnopqrstuvwxyz

ABCDEFGHIJKLMNOPQRSTUVWXYZ

#include <iostream>                 //Required if your program does any I/O
#include <iomanip>                  //Required for output formatting
#include <fstream>                  //Required for file I/O
#include <string>                   //Required if your program uses C++ strings
#include <cmath>                    //Required for complex math functions
#include <cctype>                   //Required for letter case conversion

using namespace std;                //Required for ANSI C++ 1998 standard.

int main ()
{
string reply;
string inputFileName;
ifstream inputFile;
char character;
int letterCount[127] = {};

cout << "Input file name: ";
getline(cin, inputFileName);

// Open the input file.
inputFile.open(inputFileName.c_str());      // Need .c_str() to convert a C++ string to a C-style string
// Check the file opened successfully.
if ( ! inputFile.is_open())
{
    cout << "Unable to open input file." << endl;
    cout << "Press enter to continue...";
    getline(cin, reply);
    exit(1);
}

while ( inputFile.peek() != EOF )
{
      inputFile >> character;
      //toupper(character);

      letterCount[static_cast<int>(character)]++;
}

for (int iteration = 0; iteration <= 127; iteration++)
{
    if ( letterCount[iteration] > 0 )
    {
         cout << static_cast<char>(iteration) << " " << letterCount[iteration] << endl;
    }
}

system("pause");
exit(0);
}

最佳答案

正如其他人所指出的,您在输入中有两个 Q。你有两个 Z 的原因是最后一个

inputFile >> character;

(可能当流中只剩下一个换行符时,因此不是 EOF)无法转换任何内容,在上一次迭代的全局“字符”中留下“Z”。之后尝试检查 inputFile.fail() 以查看:

while (inputFile.peek() != EOF)
{
    inputFile >> character;

    if (!inputFile.fail())
    {
        letterCount[static_cast<int>(character)]++;
    }
}

编写循环的惯用方法是:

while (inputFile >> character)
{
      letterCount[static_cast<int>(character)]++;
}

关于c++ - 计算文件中字母的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5206448/

相关文章:

c++ - 如何在 Linux 中从其源代码安装 libavcodec 和 libavutil

c++ - 为什么私有(private)构造函数阻止对象创建 C++

java - 计算用户输入的数量

c++ - atexit() 与独立的 CLang 未定义

arrays - 如何通过 JSON 将数组从 php 解压到 Swift 中

c - 字节数组中下一个字节的大小

Android - 通过广播 Intent 传递长数组

java - 在没有文件处理的情况下计算java中的空格、制表符和新行

javascript - 计算 ul 中 li 的数量并分配类别

c++ - 在 C++ 中,如何从函数返回对象数组?