2015-04-30 2 views
1

, поэтому пользователь будет вводить файл с любым текстом внутри, а программа должна читать каждый символ и подсчитывать, сколько из них имеет каждый символ (только прописные и строчные буквы). Таким образом, не может быть 50 А, 23 б, и т.д ...Прочитайте символы в файле и подсчитайте, сколько отдельных букв есть [C++]

Вот что я до сих пор в моем main.cc:

char character; 
    int i = 65; //this is the iterator to go through upper and lowercase letters 
    int count = 0; //counts number of characters and resets when exiting the loop and after using cout 
    ifstream file(filename); //filename is a string the user inputs 
    while (i != 0) { 
     while (file >> character) { 
      int a = character; 
      cout << a << endl; //testing: outputs the correct number for the letter 
      if (i == a) { //but for some reason this part isn't working? 
       count++; 
      } 
     } 
     cout << count << endl; //this outputs 0 every time 
     count = 0; 
     i++; 
     if (i == 91) i = 97; //switch to lower case 
     if (i == 123) i = 0; //exit loop 
    } 

Я ценю вашу помощь! спасибо :)

+1

Я думаю, что файл >> символ дает слово не характер. Таким образом, вы фактически пропускаете остальные символы, когда вы выполняете int a = character. – InQusitive

+2

@InQusitive: 'character' имеет тип' char', поэтому 'file >> character' будет читать только один символ, а не целое слово. – AndyG

+1

Проблема atm заключается в том, что вы читаете файл до конца, ища первый символ («A»), затем поток достиг EOF! Таким образом, в потоке не останется никаких данных. Я также сделал бы условие (! File.eof()) – Nidhoegger

ответ

3

Давайте предположим, что текст в ASCII или расширенного ASCII, так что будет не более 256 возможных символов.

Вы можете использовать массив для хранения числа вхождений заданного символа. Каждый слот будет соответствовать символу; наоборот, символ может использоваться как индекс в массиве.

Пример:

unsigned int MAXIMUM_CHAR_VALUES = 256U; 
unsigned int occurrences[MAXIMUM_CHAR_VALUES] = {0}; 
char c; 
while (my_text_file >> c) 
{ 
    ++occurrences[c]; 
} 
// Print them out 
for (unsigned int i = 0; i < MAXIMUM_CHAR_VALUES; ++i) 
{ 
    if (!isprint(i)) 
    { 
    cout << "0x" << hex << i; 
    } 
    else 
    { 
    c = static_cast<char>(i); 
    cout << c; 
    } 
    cout << ": " << occurrences[i] << "\n"; 
} 

Если вы должны использовать «узлы» вы можете изменить массив в массив узлов.

Существуют и другие структуры, которые можно использовать, например двоичное дерево.

2

Это идеальное место, чтобы использовать карту

чтения символа из файла

file >> character; 

приращение, что карта расположения

if(isalpha(character)) { myMap[character]++; } 

В конце концов, вы может перебирать все записи карты и распечатывать их все.

for(map<char, int >::const_iterator it = myMap.begin(); it != myMap.end(); ++it) 
{  
    std::cout << "The character " << it->first << " was found " << it->second<< " times." << std::endl; 
} 
+1

Я бы добавил проверку, чтобы определить, является ли символ буквой, используя 'isalpha', обновить карту, только если символ является буквой. –

+0

Почему файл >> символ получает только первую букву каждого слова? Просто зациклируйте его и прочитайте файл по одному символу за раз –

+1

file >> character читает каждую букву. Я могу проверить его снова, чтобы дважды проверить. Редактировать: да ... он читает каждую букву – TheShah1

0

Благодаря другим ответам, я придумал этот метод его выполнения ... он отлично работает до сих пор. Спасибо, парни!

char character; 
int a[256] = {0}; 
int i = 65; 
ifstream file(filename); 

while (file >> character) { 
    a[character]++; 
} 

while (i != 0) { 
    character = i; 
    cout << "There are " << a[i] << " of " << character << endl; 
    i++; 
    if (i == 91) i = 97; 
    if (i == 123) i = 0; 
} 
+0

Линии 'i == 91' и' i == 123' (и 'i = 65;') являются непостижимыми и плохо написаны. Было бы более понятным использовать 'if (i == 'Z') i = 'a'; if (i == 'z') i = 0; ', но есть более эффективные способы управления циклами, чем это, особенно, если вам не нужно беспокоиться об эксцентричных наборах кода, таких как [EBCDIC] (http: //en.wikipedia.org/wiki/EBCDIC), где строчные буквы поступают перед прописными буквами (и оба перед цифрами). –