1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[Resolvido] C leitura de ficheiro e contabilização dos caracteres

Discussão em 'Programação' iniciada por zbenta, 15 de Dezembro de 2008. (Respostas: 2; Visualizações: 2028)

  1. zbenta

    zbenta Power Member

    Boa minha gente,

    tenho que fazer um programa em c que me leia um ficheiro caracter a caracter e que me preencha uma tabela com a frequencia de cada um dos caracteres existentes no ficheiro.
    Para isso criei uma estrutura de dados que me guarda cada caracter existente no ficheiro e a sua frequencia.
    Não consigo é perceber porque é que esta porcaria não funciona, quando corro o programa o output, que me é devolvido aquando da passagem pela estrutura de dados, apenas me apresenta o último caracter do ficheiro para cada uma das posições do array e não um caracter diferente para cada posição do array.
    Alguém pode testar este código e dizer-me qual acha que é o erro. Já ando com isto à muito tempo e não sei o que fazer para resolver o problema?

    Código:
    
    #include <stdio.h>
    const char FILE_NAME[] = "/home/meunick/texto.txt";
    #include <stdlib.h>
    
    typedef struct tabela
        {
            char caracter;
            int frequencia;
        }TABELA;
        TABELA dados[255];
    
    /*função que conta o nr de linhas do ficheiro*/
    int nrlinhas(){
        int result;
        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);
            printf("%c \n",ch);
            if (ch == EOF)
                break;
            ++count;
        }
        printf("Number of characters in %s is %d\n",
                      FILE_NAME, count);
    
        fclose(in_file);
        result = count;
        return(count);
    }
    
    /*função que contabiliza o nr de vezes que um caracter aparece no ficheiro*/
    int contachar(struct tabela *ptr  ,char ch)
        {
        int linhas = 255;
        int i;
        int result;
    
        for (i=0;i<linhas-1;i++)
            {
            //printf("char dentro do array: %c, index: %d\n",ch,i);
                if( (ptr[i]).caracter =ch)
                    {
                        result = ptr[i].frequencia +1;
                    }
            }
        return(result);
        }
    /*Função que verifica se o caractaer existe na estrutura de dados*/
    int existechar(char ch, struct tabela *ptr)
        {
        //printf("char:%c \n",ch);
            int result;
            int i ;
            for(i=0;i<255;i++)
                {
                    if(ptr[i].caracter == ch)
                        {
                        //printf("existe char : %c\n",ch);
                            result = 1;
                            i=255;
                        }
                    else
                        {
                            //printf("não existe char : %c\n",ch);
                            result =0;
                            i=255;
                        }
                }
           return result;
        }
    /*Função que acrescenta caracteres na estrutura de dados*/
    void acrescenta_char(char c, struct tabela *ptr, int freq)
    {
        int index;
        char ch='#';
        for (index=0;index<254;index++)
        {
            
            if(ptr[index].caracter!=ch)
            {
                ptr[index].caracter=c;
                ptr[index].frequencia=freq;
                //printf("caracter: %c freq:%d !=%c \n",ptr[index].caracter,ptr[index].frequencia,ch );
                index=255;
            }
        }
    }
    /*função que actualiza a frequencia dos caracteres na estrutura de dados*/
    void actualiza_freq(struct tabela *ptr,char c)
    {
        int index;
        for(index=0;index<254;index++)
        {
            if( (ptr[index]).caracter =c && (ptr[index]).caracter !='#')
                    {
                        ptr[index].frequencia =ptr[index].frequencia+1;
                        //printf("caracter: %c freq:%d \n",ptr[index].caracter,ptr[index].frequencia );
                        index=255;
                    }
        }
    
    
    }
    /*funçãoq utiklizada para a leitura do ficheiro e inserção dos dados na estrutura de dados*/
    void preenchearray(struct tabela *ptr )
        {
            int i;
            int j=0;
            char ch;
            FILE *in_file;
            //abre ficheiro
            in_file = fopen(FILE_NAME,"r");
            //verifica se ficheiro existe
            if (in_file == NULL) {
                printf("Cannot open %s\n", FILE_NAME);
                exit(8);
            }
    
            while((ch=fgetc(in_file))!=EOF)
            {
    
                //printf("char lido : %c\n",ch);
                for(i=0;i<255;i++)
                    {
                        //preenche o primeiro caracter
                        //if(i==0)
                        if(j==0)
                            {
                                //printf("primeiro caracter %c indice, %d \n",ch,i);
                                ptr[0].caracter = ch;
                                ptr[0].frequencia= 1;
                                printf("primeiro caracter %c ,ferquencia:%d indice, %d \n",ptr[0].caracter,ptr[0].frequencia,i);
                            }
                            else
                                if(j>0)
                                {
                                    //se o carater não existir preenche
                                    if((existechar(ch,ptr) == 0))
                                        {
                                            acrescenta_char(ch, ptr,contachar(ptr,ch));
                                           
                                        }
                                        else
                                            //caso o caracter exista actualiza a frequência
                                            if((existechar(ch,ptr) == 1)) //ptr[i].caracter==ch
                                                {
                                                     actualiza_freq(ptr,ch);
                                                 }
    
                                }
                        j++;
                    }
            }
    
            fclose(in_file);
            
            for (i=0;i<255;i++)
                {
                 printf("caracter: %c fre: %d index:%d \n", ptr[i].caracter, ptr[i].frequencia,i);
                }
    
            
        }
    
    /*função que inicualiza a estrutura de dados*/
    void inicializa_array(struct tabela *ptr)
    {
        int i;
        char ch='#';
        for (i=0;i<255;i++)
        {
            ptr[i].caracter=ch;
    
        }
    }
    
    int main() {
         
         TABELA * dados_ptr;
         dados_ptr = dados;
         inicializa_array(dados_ptr);
         preenchearray(dados_ptr);
         
    
    }
    
    
    
     
    Última edição: 18 de Dezembro de 2008
  2. sportingdan

    sportingdan I'm cool cuz I Fold

    sinceramente, não me dei ao trabalho de ler o teu código, mas parece-me que andaste a complicar :D

    eu sou apenas um novato em C e fiz da seguinte maneira:

    PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main(int argcchar **argv)
    {
      
    FILE *fich;
      
    int i1i2i3;
      
    char texto[256];
      
    int letra[128];
      
      
    fich fopen(argv[1],"rt");
      
      for(
    i1=i1<128; ++i1)
        
    letra[i1]=0;
      
      
    i1=0;
      
    i2=0;
      
      while (
    fgets(texto,256,fich))
        {
          
    i1=strlen(texto);
          
    i2i2+i1;
          
          
    i3=0;
          
          while(
    texto[i3]!=0)
            {
              ++
    letra[texto[i3]];
              ++
    i3;
            }  
        }    

      
    printf("O ficheiro tem %d caracteres\n\n",i2);
      
      
    printf("Caracter      Nr. de Vezes\n");
      
      for(
    i1=i1<128; ++i1)
        {
          if(
    letra[i1]!=0)
          
    printf("  %c           %d\n", (char)i1,letra[i1]);
        }
      
      
    fclose(fich);    
      return 
    0;
    }
    o único problema é que não conta os caracteres não ASCII, mas julgo que podes tirar algumas ilacções deste código :007:
     
  3. zbenta

    zbenta Power Member

    Boas minha gente,

    sportingdan, obrigadão pelas tuas dicas, mas quando vi a tua resposta já tinha descoberto o problema.

    Fica aqui então a minha implementação, caso alguém necessite de algo parecido.

    Código:
    #include <stdio.h>
    const char FILE_NAME[] = "/home/minhadir/meuficheiro.txt";
    #include <stdlib.h>
    
    typedef struct tabela
        {
            char caracter;
            int frequencia;
        }TABELA;
        TABELA dados[255];
    
    
    //função que conta a frequencia do caracter
    int contachar(struct tabela *ptr  ,char ch)
        {
        int i;
        int result;
    
        for (i=0;i<255;i++)
            {
                if( (ptr[i]).caracter ==ch)
                    {
                        result = ptr[i].frequencia +1;
                        i=255;
                    }
            }
        return(result);
        }
    
    //funcao que determina se o caracter já existe
    int existechar(char ch, struct tabela *ptr)
        {
            int result;
            int i ;
            for(i=0;i<255;i++)
                {
                    if(ptr[i].caracter == ch)
                        {
                            result = 1;
                            i=255;
                        }
                    else
                        {
                            result =0;
                        }
                }
           return result;
        }
    
    //funcao que adiciona o caracter
    void acrescenta_char(char c, struct tabela *ptr, int freq)
    {
        int index;
        char ch='#';
        for (index=0;index<254;index++)
        {
            
            if(ptr[index].caracter!=ch)
            {
                ptr[index].caracter=c;
                ptr[index].frequencia=freq;
                index=255;
            }
        }
    }
    
    //funcao que actualiza a frequencia do caracter
    void actualiza_freq(struct tabela *ptr,char c)
    {
        int index;
        int value;
        for(index=0;index<254;index++)
        {
            if( (ptr[index]).caracter ==c)
                    {
                        value=ptr[index].frequencia;
                        ptr[index].frequencia =(value + 1);
                        index=255;
                    }
        }
    
    
    }
    
    void preenchearray(struct tabela *ptr )
        {
            int i;
            int j=0;
            char ch;
            FILE *in_file;
            //abre ficheiro
            in_file = fopen(FILE_NAME,"r");
            //verifica se ficheiro existe
            if (in_file == NULL) {
                printf("Cannot open %s\n", FILE_NAME);
                exit(8);
            }
    
            while((ch=fgetc(in_file))!=EOF)
            {
    
                        //preenche o primeiro caracter
                        if(j==0)
                            {
                                //printf("primeiro caracter %c indice, %d \n",ch,i);
                                ptr[0].caracter = ch;
                                ptr[0].frequencia= 1;
                            }
                            else
                                {
                                    //se o carater não existir preenche
                                    if(existechar(ch,ptr) == 0)
                                        {
                                            
                                            acrescenta_char(ch, ptr,contachar(ptr,ch));
                                            
                                        }
                                        else
                                            //caso o caracter exista actualiza a frequência
                                            if(existechar(ch,ptr) == 1) //ptr[i].caracter==ch
                                                {
                                                   actualiza_freq(ptr,ch);
                                            
                                                }
    
                                }
                        j++;
                
            }
    
            fclose(in_file);
            
            for (i=0;i<255;i++)
                {
                 printf("caracter: %c fre: %d index:%d \n", ptr[i].caracter, ptr[i].frequencia,i);
                }
    
            
        }
    //funcao que inicializa o array
    void inicializa_array(struct tabela *ptr)
    {
        int i;
        char ch='#';
        for (i=0;i<255;i++)
        {
            ptr[i].caracter=i;
            printf("char:%c",ptr[i].caracter);
    
        }
    }
    
    int main() {
         
         //tem 255 linhas porque é o mesmo nr de caracteres que tem a tabela ascii
         TABELA * dados_ptr;
         dados_ptr = dados;
         inicializa_array(dados_ptr);
         preenchearray(dados_ptr);
         
    }
    
    
    And That's a Wrap.
     

Partilhar esta Página