我正在用C ++编写一个程序来计算文本文档中的字母数。我需要知道我做错了什么,我得到了疯狂的数字结果。我上次得到了一些很好的帮助,我在计算后把我的“频率[?]”。计数本身有问题,但是什么?
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const int ALPHA_SIZE = 26;
void open_file ( ifstream & );
void process ( ifstream &, int [], string lineBuffer);
void draw ( int [] );
void printchar ( int[] );
string lineBuffer;
int main()
{
string lineBuffer;
ifstream infile;
open_file ( infile );
int frequency [ALPHA_SIZE];
process ( infile, frequency, lineBuffer);
draw ( frequency );
system("Pause");
return 0;
}
void open_file ( ifstream & inf )
{
char infilename[50]; //actual file name
cout << "File name for input? ";
cin >> infilename;
inf.open(infilename);
}
void process (ifstream &infile, int frequency[], string lineBuffer)
{
int A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z;
A = 0;
B = 0;
C = 0;
D = 0;
E = 0;
F = 0;
G = 0;
H = 0;
I = 0;
J = 0;
K = 0;
L = 0;
M = 0;
N = 0;
O = 0;
P = 0;
Q = 0;
R = 0;
S = 0;
T = 0;
U = 0;
V = 0;
W = 0;
X = 0;
Y = 0;
Z = 0;
if (infile.is_open())
{
while(getline(infile, lineBuffer))
{
if ( 'a' || 'A')
{ A++;
}
if ( 'b' || 'B')
{ B++;
}
if ( 'c' || 'C')
{ C++;
}
if ( 'd' || 'D')
{ D++;
}
if ( 'e' || 'E')
{ B++;
}
if ( 'f' || 'F')
{ F++;
}
if ( 'g' || 'G')
{ G++;
}
if ( 'h' || 'H')
{ H++;
}
if ( 'i' || 'I')
{ I++;
}
if ( 'j' || 'J')
{ J++;
}
if ( 'k' || 'K')
{ K++;
}
if ( 'l' || 'L')
{ L++;
}
if ( 'm' || 'M')
{ M++;
}
if ( 'n' || 'N')
{ N++;
}
if ( 'o' || 'O')
{ O++;
}
if ( 'p' || 'P')
{ P++;
}
if ( 'q' || 'Q')
{ Q++;
}
if ( 'r' || 'R')
{ R++;
}
if ( 's' || 'S')
{ S++;
}
if ( 't' || 'T')
{ T++;
}
if ( 'u' || 'U')
{ U++;
}
if ( 'v' || 'V')
{ V++;
}
if ( 'w' || 'W')
{ W++;
}
if ( 'x' || 'X')
{ X++;
}
if ( 'y' || 'Y')
{ Y++;
}
if ( 'z' || 'Z')
{ Z++;
}
}
infile.close();
frequency [0] = A;
frequency [1] = B;
frequency [2] = C;
frequency [3] = D;
frequency [4] = E;
frequency [5] = F;
frequency [6] = G;
frequency [7] = H;
frequency [8] = I;
frequency [9] = J;
frequency [10] = K;
frequency [11] = L;
frequency [12] = M;
frequency [13] = N;
frequency [14] = O;
frequency [15] = P;
frequency [16] = Q;
frequency [17] = R;
frequency [18] = S;
frequency [19] = T;
frequency [20] = U;
frequency [21] = V;
frequency [22] = W;
frequency [23] = X;
frequency [24] = Y;
frequency [25] = Z;
}
}
void draw(int frequency[])
{
cout << "A:" << frequency[0] << endl;
cout << "B:" << frequency[1] << endl;
cout << "C:" << frequency[2] << endl;
cout << "D:" << frequency[3]<< endl;
cout << "E:" << frequency[4] << endl;
cout << "F:" << frequency[5] << endl;
cout << "G:" << frequency[6] << endl;
cout << "H:" << frequency[7] << endl;
cout << "I:" << frequency[8] << endl;
cout << "J:" << frequency[9] << endl;
cout << "K:" << frequency[10] << endl;
cout << "L:" << frequency[11] << endl;
cout << "M:" << frequency[12] << endl;
cout << "N:" << frequency[13] << endl;
cout << "O:" << frequency[14] << endl;
cout << "P:" << frequency[15] << endl;
cout << "Q:" << frequency[16] << endl;
cout << "R:" << frequency[17] << endl;
cout << "S:" << frequency[18] << endl;
cout << "T:" << frequency[19] << endl;
cout << "U:" << frequency[20] << endl;
cout << "V:" << frequency[21] << endl;
cout << "W:" << frequency[22] << endl;
cout << "X:" << frequency[23] << endl;
cout << "Y:" << frequency[24] << endl;
cout << "Z:" << frequency[25] << endl;
}
答案 0 :(得分:3)
这些条件中的每一个
if ( 'n' || 'N')
将始终求值为true,因为它们是非零常量char值。因此,您用于计数的变量总是递增。要测试角色的发生率,你需要这样的东西
char char_to_test;
if (char_to_test == 'n' || char_to_test == 'N') {
N++;
}
你现在拥有的东西总是增加你的数量。此外,您需要实际从文件中提取每个字符才能进行测试。从string
获得getline
后,您应该迭代其各个字符并按上述方式对其进行测试。
答案 1 :(得分:1)
您的代码存在很多问题。
其中一个是您正在调用函数来打开文件。
void open_file ( ifstream & inf )
此功能将在文件范围消失后关闭文件。
所有变量都有很多重复的代码,如果使用循环,这些代码可以很容易地变得更紧凑。
#include <string>
#include <iostream>
#include <algorithm>
#include <fstream>
#include <cctype>
#include <map>
int main() {
std::map<char,int> alpha;
//Fills the map with A-Z with 0 as the value.
for(char k = 65; k <= 90; k++) {
alpha.insert(std::pair<char,int>(k,0));
}
//opens example.txt contains "the quick brown fox jumped over the cow"
std::ifstream in("example.txt");
std::string str;
if(in.is_open()) {
//loops through every line in the file.
while(std::getline(in,str)) {
//removes all whitespace
str.erase(std::remove_if(str.begin(),str.end(), ::isspace),str.end());
//capitalizes the string
std::transform(str.begin(),str.end(),str.begin(), ::toupper);
//loops through the string
for(auto& i : str) {
if(isalpha(i))
alpha[i]++; //Increments the frequency.
}
}
}
for(auto& i : alpha)
std::cout << i.first << " " << i.second << std::endl;
}
答案 2 :(得分:0)
程序中没有任何内容可以确保它只读取每个字符一次。这类似于这个问题: http://www.cplusplus.com/forum/beginner/24492/ 你必须告诉程序什么时候结束。你要求程序做的是“当文件A ++中存在A时”它总是存在于文件中。你可以这样: http://www.cplusplus.com/reference/iostream/istream/get/
这将有助于它压缩文件,char by char。你仍然需要弄清楚如何让它停在文件的末尾。
答案 3 :(得分:0)
我认为你需要努力做得更懒。这是C中的一个版本:
unsigned counts[UCHAR_MAX];
int main() {
int ch;
while (EOF != (ch=getchar()))
++counts[toupper((unsigned char)ch)];
for (int i=0; i<UCHAR_MAX; i++)
if (isupper(i))
printf("%c: %u\n", i, counts[i]);
return 0;
}
我已经简化了一点(例如,阅读stdin
而不是打开文件),但这最终是一项非常简单的工作 - 不要试图让它变得比真正复杂得多是