Учитывая, что вы, очевидно, хотите считать только английские буквы, кажется, что вы должны значительно упростить свой код:
int main(int argc, char **argv) {
std::ifstream infile(argv[1]);
char ch;
static int counts[26];
while (infile >> ch)
if (isalpha(ch))
++counts[tolower(ch)-'a'];
for (int i=0; i<26; i++)
std::cout << 'A' + i << ": " << counts[i] <<"\n";
return 0;
}
Конечно, есть еще несколько возможностей. По сравнению с кодом @ Nawaz (например), это, очевидно, немного короче и проще - но он также более ограничен (например, в нынешнем виде он только работает с английскими символами без акцента). Он в значительной степени ограничен основными буквами ASCII - кодировка EBCDIC, ISO 8859-x или Unicode полностью его сломает.
Его также позволяет легко применить фильтрацию "только буквы" к любому файлу. Выбор между ними зависит от того, хотите ли вы / нуждаетесь / можете использовать эту гибкость или нет. Если вы заботитесь только о буквах, упомянутых в вопросе, и только на типичных машинах, которые используют некоторый расширенный набор ASCII, этот код будет выполнять задачу легче, но если вам нужно больше, он совсем не подходит.