我是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;
}
任何方向或帮助将不胜感激。我有一种感觉,我需要使用指针来解决这个问题......但我刚刚开始覆盖指针,所以我很困惑。谢谢!
编辑:我删除了一些变量,它现在正在工作,看起来我在头脑风暴时忘记了它们。很抱歉让它失去工作而没有提到原因;我不会再这样做了!
答案 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
时使用指针表示法而不是数组表示法