很抱歉,标题令人困惑。我有一个程序从文件中读取字符并保持每个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),但它是关于实现计数器本身(我相信我已经弄明白了)。
答案 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)。