C ++:输出文件中ASCII字符计数频率的结果时的奇数

时间:2014-03-04 22:49:13

标签: c++ ascii

很抱歉,标题令人困惑。我有一个程序从文件中读取字符并保持每个ASCII字符的频率计数器。最后,程序应该输出每个使用的ASCII字符以及它的使用次数(计数器)。

这是我的代码,它编译并运行正常(请注意,注释掉的代码只是我之前使用过的代码无法正常工作;我将它保留在那里供我参考):

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <iomanip>
using namespace std;

int main(void)
{
    ifstream inputFile;
    string infile;
    char ch;
    int i;
    int asciiArray[128] = {0};

    // Gets input filename from user, checks to make sure it can be opened, and then
    // gets output filename from user.
    cout << "Please enter your input filename: ";
    cin >> infile;

    inputFile.open(infile.c_str());

    if (inputFile.fail())
    {
        cout << "Input file could not be opened. Try again." << endl;
        exit(0);
    }

    // Gets the first character of the input file.
    //inputFile.get(ch);

    // Sets up the ASCII/Frequency table
    cout << left << setw(10) << "ASCII" << right << setw(10) << "Frequency" << endl;

    while(inputFile >> ch)
    {
        asciiArray[(int)ch]++;

        for (i = 0; i < 129; i++)
        {
            if (asciiArray[i] > 0)
            {
                cout << left << setw(10) << asciiArray[i] << right << setw(10) << asciiArray[(int)ch] << endl;
            }
        }
    }

    /*
    while(!inputFile.eof())
    {
        asciiArray[(int)ch]++;
        //cout << asciiArray[(int)ch] << endl;

        for (i = 0; i < 129; i++)
        {
            if (asciiArray[i] > 0)
            {
                cout << left << setw(10) << asciiArray[i] << right << setw(10) << asciiArray[(int)ch] << endl;
            }
        }

        inputFile.get(ch);
    }
    */

    // Closes the input file
    inputFile.close();

    return 0;
}

使用包含以下内容的文件运行程序时

111
[newline added by text editor]

我得到以下输出:http://puu.sh/7jbnl.png

我有点失落,不知道这些随机长数来自哪里。我有一种感觉,也许我已经把我的循环放在了错误的地方,因为当涉及到循环时我倾向于混淆。但除此之外,我很困惑。

注意:我今天早些时候提出了一个关于这个程序的问题(C++: Counting the frequency of ASCII characters in file),但它是关于实现计数器本身(我相信我已经弄明白了)。

2 个答案:

答案 0 :(得分:1)

您的循环边界错误。

    for (i = 0; i < 129; i++)

应该是:

    for (i = 0; i < 128; i++)

您正在访问数组范围之外的asciiArray[128],导致未定义的行为。它正在读取一些你没有初始化为0的无关内存。

在阅读完文件后,您还应该将该循环移动到该位置。在读取每个字符后,您将打印所有频率。

答案 1 :(得分:0)

您的打印方式是错误的。您希望在计算所有ASCII字符后打印。由于您在每次迭代期间打印。

将循环重组为:

while(inputFile >> ch)
{
    asciiArray[(int)ch]++;
}

for (i = 0; i < 128; i++)
{
  if (asciiArray[i] > 0)
  {
    cout << left << setw(10) << i << right << setw(10) << asciiArray[i] << endl;
  }
}

会解决问题。请注意,我已将循环条件更改为i<128,因为数组中只能有128个元素(索引从0到127)。