C ++:计算文件中ASCII字符的频率

时间:2014-03-04 20:18:49

标签: c++ arrays pointers ascii file-io

我是C ++的初学者,一直在思考这个问题,但我发现自己无法提出解决方案,并希望我能在这里找到方向。

我有一个输入文件,其中包含任意数量的ASCII字符(例如:hello,world; lorem ipsum;等等)。我的程序将读取此文件并计算每个ASCII字符的频率,在达到EOF时输出结束计数。我相信我需要使用数组[128]作为计数器,但除此之外,我完全被卡住了。

这是我到目前为止所做的(它不多,只读取文件中的字符):

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

int main(void)
{
    ifstream inputFile;
    string infile;
    char ch;
    //char ascii;
    //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);

    while(!inputFile.eof())
    {
        inputFile.get(ch);
    }

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

    return 0;
}

任何方向或帮助将不胜感激。我有一种感觉,我需要使用指针来解决这个问题......但我刚刚开始覆盖指针,所以我很困惑。谢谢!

编辑:我删除了一些变量,它现在正在工作,看起来我在头脑风暴时忘记了它们。很抱歉让它失去工作而没有提到原因;我不会再这样做了!

2 个答案:

答案 0 :(得分:2)

您应该将循环编写为:

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

请注意,我不会在循环条件中直接检查eof,因为那是almost always wrong

此外,您应确保您的文件确实仅使用ascii字符编写。由于ascii范围之外的任何字符都会导致对asciiArray的界限访问。

答案 1 :(得分:1)

在常规的Ascii中,你有128个字符...其中每个字符都可以作为int来计算。 这是解决这个难题的关键。

记住你有128个可能的字符,一个128个值的数组,每个字符代表一个0-127的数字。

还记得你可以做这样的事情:

int i = 97;
char a = i;
char b = a + 1;

cout << (int)i << (int)a << (int)b << endl;
// 979798
cout << (char )i << (char )a << (char )b << endl;
// aab
cout << i << a << b << endl;
// 97ab

就指针而言,我认为使用它们的唯一方法是在操作变量asciiArray时使用指针表示法而不是数组表示法