2013-10-17 3 views
2

Так что я хочу создать программу, которая учитывает появление каждого символа в файле. Например:C - Количество символов из файла

4 экземпляров символа 0x67 (г)

11 экземпляров символов 0x68 (ч)

и так далее

Я не знаю, как отображения и подсчета экземпляров.

Любые мысли?

#include <stdio.h> 
const char FILE_NAME[] = "input.txt"; 
#include <stdlib.h> 

int main() { 

    int    count = 0; /* number of characters seen */ 
    FILE   *in_file; /* input file */ 

    /* character or EOF flag from input */ 
    int    ch; 

    in_file = fopen(FILE_NAME, "r"); 
    if (in_file == NULL) { 
     printf("Cannot open %s\n", FILE_NAME); 
     exit(8); 
    } 

    while (1) { 
     ch = fgetc(in_file); 
     if (ch == EOF) 
      break; 
     ++count; 
    } 
    printf("Number of characters in %s is %d\n", 
        FILE_NAME, count); 

    fclose(in_file); 
    return (0); 
+0

Вы хотя бы поработали над тем, как вы собираетесь отслеживать количество символов каждого персонажа? –

+0

Ну, я думаю, мне нужен массив для этого и выводятся только целые числа, отличные от нуля. Но ... я должен использовать 2 массива?Один для всех символов (256) и один для вхождений и синхронизировать их так или иначе, чтобы array1 [0] = array2 [0]? – Sarah97

+0

Совет. Что произойдет, если вы сможете использовать символ в качестве индекса? –

ответ

5

Это то, что я придумал ...

#include<stdio.h> 
#include<stdlib.h> 

int main() { 
    /* a buffer to hold the count of characters 0,...,256; it is 
    * initialized to zero on every element */ 
    int count[256] = { 0 }; 

    /* loop counter */ 
    int k; 

    /* file handle --- in this case I am parsing this source code */ 
    FILE *fp = fopen("ccount.c", "r"); 

    /* a holder for each character (stored as int) */ 
    int c; 

    /* for as long as we can get characters... */ 
    while((c=fgetc(fp))) { 

    /* break if end of file */ 
    if(c == EOF) break; 

    /* otherwise add one to the count of that particular character */ 
    count[c]+=1; 
    } 

    /* now print the results; only if the count is different from 
    * zero */ 
    for(k=0; k<256; k++) { 
    if(count[k] > 0) { 
     printf("char %c: %d times\n", k, count[k]); 
    } 
    } 
    /* close the file */ 
    fclose(fp); 

    /* that's it */ 
    return 0; 
} 

компилировать код, используя следующую команду (GCC 4.8.1 на OS X 10.7.4)

gcc ccount.c -Wall -Wextra -pedantic -ansi 

компилируется без предупреждений и ошибок; это выход:

char 
: 40 times 
char : 190 times 
char ": 6 times 
char #: 2 times 
char %: 2 times 
char ': 1 times 
char (: 11 times 
char): 11 times 
char *: 23 times 
char +: 3 times 
char ,: 5 times 
char -: 3 times 
char .: 9 times 
char /: 20 times 
char 0: 5 times 
char 1: 1 times 
char 2: 3 times 
char 5: 3 times 
char 6: 3 times 
char :: 1 times 
char ;: 13 times 
char <: 3 times 
char =: 7 times 
char >: 3 times 
char E: 2 times 
char F: 2 times 
char I: 2 times 
char L: 1 times 
char O: 1 times 
char [: 4 times 
char \: 1 times 
char ]: 4 times 
char a: 29 times 
char b: 4 times 
char c: 36 times 
char d: 15 times 
char e: 49 times 
char f: 25 times 
char g: 4 times 
char h: 22 times 
char i: 36 times 
char k: 9 times 
char l: 19 times 
char m: 5 times 
char n: 35 times 
char o: 38 times 
char p: 9 times 
char r: 34 times 
char s: 22 times 
char t: 49 times 
char u: 16 times 
char v: 1 times 
char w: 4 times 
char y: 2 times 
char z: 3 times 
char {: 5 times 
char }: 5 times 
+0

попробуйте на реальном файле, он не будет работать, поскольку он не инициализирует массив, используйте только 128 вместо 256, читайте из файла 2 раза каждая итерация –

+0

Упс ... испорченный fgetc ... исправит. – Escualo

+0

Эй, Арриета! Спасибо за ваш ответ. Но он, похоже, не компилируется правильно: – Sarah97

2

вам нужно использовать массив, проверьте:

int charArray[256]; 
memset(charArray, 0, 256*sizeof(int)); // instead of memset, for 0 values you can you just {0} 

while (1) { 
     ch = fgetc(in_file); 
     if (ch == EOF) 
      break; 
     charArray[ch]++; 
    } 
for (int i=0; i<256; i++) 
    if (charArray[i] > 0) 
     printf("Number of character %c is %d\n", (char)i, charArray[i]); 
+0

Спасибо за ответ Илья! Что же с memset? Что оно делает? – Sarah97

+0

Я не думаю, что charArray должен быть из символов. Я бы использовал int charCount [256]; – lsiebert

+0

memset устанавливает все значения в ноль. – lsiebert

1

Если вы хотите получить отсчеты алфавита, то это может выглядеть следующим образом:

int counts[26]; 
memset(&counts[0], 0, sizeof(counts)); 

while ((ch = fgetc(in_file)) != EOF) { 
    if (ch >= 'a' && ch <= 'z') 
     ++count[ch - 'a']; 
} 

их печати может быть простым:

for (char c = 'a'; c <= 'z', ++c) 
    printf("Count of '%c' is %d\n", c, count[c - 'a']); 
0
int strchro(char c, char *str) { 

    char *pch; 
    int found = 0; 
    pch=strchr(str,c); 
    while (pch!=NULL) 
    { 
     //printf("found at %d\n",pch-str+1); 
     found++; 
     pch=strchr(pch+1,c); 
    } 
    return found; 
} 

старая функция я написал некоторое время назад .. надеется, что это помогает;)
более информации здесь: http://en.cppreference.com/w/c/string/byte/strchr

+0

Это было бы полезно для поиска подсчет одного символа, но для нахождения количества нескольких символов этот подход будет неэффективным, так как ему нужно будет сканировать вход несколько раз (один раз для «a», один раз для «b» и т. д.). – dreamlax

+0

О, я пропустил, я подумал, что это для одного символа ...: P спасибо –

0

Вы можете использовать массив из 256 целых чисел (на многих платформах char является 8-битным значением) , Так как количество символов, появляющихся в файле, не может быть отрицательным, имеет смысл беззнаковый тип.

unsigned charCount[256] = { 0 }; 

Каждый слот в массиве представляет количество раз, в течение которого символ с этим значением отображается в этом файле.

while ((ch = fgetc(in_file)) != EOF) 
{ 
    // increment the count of character ch 
    charCount[ch]++; 
} 

При их печати, некоторые символы не для печати или пробелы (это особенно применимо, если вы читаете бинарный файл), вы можете использовать isprint и isspace функции, найденные в заголовке ctype.h.

for (int i = 0; i < 256; i++) 
{ 
    // only display characters with a count of at least 1 
    if (charCount[i] > 0) 
    { 
     if (!isprint(i) || isspace(i)) 
      printf("%u instances of character %x\n", charCount[i], (unsigned) i); 
     else 
      printf("%u instances of character '%c'\n", charCount[i], i); 
    } 
} 
1

Простая программа, которую я нашел here. Он принимает два ввода, сначала символ, который вы хотите подсчитать, и имя файла, в котором необходимо учитывать появление символа.

Смежные вопросы