2016-10-12 4 views
0

テキストファイルに文字が表示される回数をカウントするプログラムがあります。カウンタとファイルI/Oとのやり取り

void file_histogram(char *filename) 
{ 
    FILE *file1; 
    file1 = fopen(filename, "r"); 
    int size = 26; 
    int charCounters[size]; 
    char c; 
    int i, j; 

    if(file1 != NULL) { 
     while(fscanf(file1, "%c", &c) == 1) { 
      for(i = 0; i < size; ++i) { 
       if(c == i + 97) { 
        charCounters[i]++; 
        break; 
       } 
      } 
     } 
    } 
    for(j = 0; j < size; ++j) 
     printf("%c: %d\n", j + 97, charCounters[j]); 
    fclose(file1); 
これが二回最初の文字をカウントしているやっているように見える、その後、約半数が正しくカウントされているもの

、残りの半分はすべて、最大またはオーバーフローに到達するように見えました。ここで何が起こっているのですか?

+0

int size = 26とどうやって決めていますか?そして、これは特定の「既知の」ファイルやファイルのためになっているのでしょうか? – inbinder

+2

a)charCountersをすべて0に設定しないでください。b)なぜそのファイルの読み込みセクションにforループがあるのですか? – John3136

+0

配列は、アルファベットの各文字に対してです – nichow

答えて

0

最初のfor()ループのロジックが正しくありません。

#include <ctype.h> 
.... 
// initialize to all 0s 
int charCounters[26] = {0}; 
.... 
while(fscanf(file1, "%c", &c) == 1) 
{ 
    if(isalpha(c)) 
    { // then alphabet a...z or A...Z 
     // -'a' to get offset from lower case 'a' 
     // to use as index into array 
     charCounters[ tolower(c)-'a' ]++; 
    } 
} 
関連する問題