C++;:计算文件中ASCII字符的频率 我是C++初学者,已经思考了相当长的一段时间,但我发现自己无法想出一个解决办法,希望能在这里找到一些方向。

C++;:计算文件中ASCII字符的频率 我是C++初学者,已经思考了相当长的一段时间,但我发现自己无法想出一个解决办法,希望能在这里找到一些方向。,c++,arrays,pointers,ascii,file-io,C++,Arrays,Pointers,Ascii,File Io,我有一个包含任意数量ASCII字符的输入文件(例如:hello,world;lorem ipsum;等等)。我的程序将读取此文件并计算每个ASCII字符的频率,当达到EOF时输出结束计数。我相信我需要使用数组[128]作为计数器,但除此之外,我完全被卡住了 以下是我到目前为止所拥有的内容(内容不多,只读取文件中的字符): #包括 #包括 #包括 #包括 使用名称空间std; 内部主(空) { ifstream输入文件; 字符串填充; char ch; //字符ascii; //int ascii

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

以下是我到目前为止所拥有的内容(内容不多,只读取文件中的字符):

#包括
#包括
#包括
#包括
使用名称空间std;
内部主(空)
{
ifstream输入文件;
字符串填充;
char ch;
//字符ascii;
//int asciiArray[128]={0};
//从用户获取输入文件名,检查以确保它可以打开,然后
//从用户获取输出文件名。
填充;
open(infle.c_str());
if(inputFile.fail())
{

cout您应该将循环编写为:

while(inputFile >> ascii)
{                    
    asciiArray[ascii]++;
}
请注意,我没有直接检查循环中的
eof
,因为这是一个错误


此外,您还应确保您的文件确实仅使用ascii字符写入。由于ascii范围之外的任何字符都会导致对常规ascii中的
asciiArray

的越界访问,因此您有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
inti=97;
字符a=i;
字符b=a+1;

不能……而且没有工作状态……关于你的问题,离开我们是不好的。请具体点!比如@πάνταῥεῖ 一般来说,这是有帮助的(并且会加快你得到答案的速度)如果您通过提及您正在获取的错误消息或您的输出或至少其他内容来包括其损坏的位置。感谢您的帮助,这确实有助于我理解问题。编译时,我收到此错误:
警告:数组下标的类型为“char”™ [-Wchar subscripts]asciiArray[ascii]++;
将数组类型更改为char时发生类似错误。将
asciiArray[ascii]++
更改为
asciiArray[(int)ascii]++
解决了这个问题,但我觉得这有点不对劲。我只是很难理解。再次感谢您。@korina将字符作为下标通常是不好的,因为字符编码可能不同,并且会导致问题。此外,字符可能会被签名。这就是为什么我还告诉您一定要在中保持ascii范围在我的答案中使用dexing。ascii范围保证在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