Ver Mensaje Individual
  #4 (permalink)  
Antiguo 03/09/2015, 16:19
aguml
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Contador de palabras repetidas en un fichero necesito sAyuda

Lee carácter por carácter hasta encontrar un carácter de fin de palabra y añades esa palabra al array y vuelves a hacer lo mismo desde la siguiente posición y buscas la nueva palabra en el array con strcmp y si hay coincidencia incrementar su contador y si no la hay añades la nueva palabra al final del array. Lo ideal seria usar memoria dinámica. También puedes contabilizar el número de comas, puntos, espacios, o lo que sea.
Tienes que controlar que el primer carácter no sea un carácter de fin de palabra y si es así avanzas un carácter.

EDITO:
Aqui te pongo un codigo de cuando yo empecé donde hice algo muy similar pero yo tambien almacenaba los numeros y simbolos:

Código C:
Ver original
  1. //---------------------------------------------------------------------------
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. #define SIZESTRING 25
  7.  
  8. typedef struct{
  9.    char palabra[SIZESTRING];
  10.    int contador;
  11. }Lista;
  12.  
  13. Lista *AddToList(Lista *pLista, int *pos, int largoPalabra, char *palabra);
  14.  
  15. int main(int argc, char* argv[])
  16. {
  17.    FILE *archivo;
  18.    char palabra[SIZESTRING], caracter;
  19.    int largoPalabra=0, largoNumero=0, posListaPalabras=0, posListaNumeros=0, posListaSimbolos=0, i, encontrada;
  20.  
  21.    //Creamos 3 listas: una para palabras, otra para numeros y otra para simbolos
  22.    Lista *pListaPalabras=NULL, *pListaNumeros=NULL, *pListaSimbolos=NULL;
  23.  
  24.    //Abrimos el archivo a analizar
  25.    archivo = fopen("texto.txt","r");
  26.  
  27.    if(archivo != NULL){
  28.       printf("Archivo abierto satisfactoriamente.\n");
  29.  
  30.       do{ //Leemos el archivo caracter a caracter hasta el final
  31.          caracter = fgetc(archivo);
  32.          if((caracter >= 'A' && caracter <= 'Z') || (caracter >= 'a' && caracter <= 'z')){
  33.             //Si es alfabetico será una palabra asi que si ya teniamos un numero lo almacenamos en la lista de numeros
  34.             //Indicamos que ya no hay numero colocando su largo a 0
  35.             if(largoNumero > 0){
  36.                pListaNumeros = AddToList(pListaNumeros,&posListaNumeros,largoNumero,palabra);
  37.                largoNumero=0;
  38.                memset(palabra,0,SIZESTRING);
  39.             }
  40.             //Y guardamos el caracter de la palabra incrementando el largo para saber que contiene una palabra
  41.             palabra[largoPalabra] = caracter;
  42.             largoPalabra++;
  43.          }else if(caracter >='0' && caracter <= '9'){
  44.             //Si por el contrario es numerico será un numero asi que si ya teniamos una palabra la almacenamos en la lista de palabras
  45.             //Indicamos que ya no hay palabra colocando su largo a 0
  46.             if(largoPalabra > 0){
  47.                pListaPalabras = AddToList(pListaPalabras,&posListaPalabras,largoPalabra,palabra);
  48.                largoPalabra=0;
  49.                memset(palabra,0,SIZESTRING);
  50.             }
  51.             //Y guardamos el caracter del numero incrementando el largo para saber que contiene un numero
  52.             palabra[largoNumero] = caracter;
  53.             largoNumero++;
  54.          }else{
  55.             //Y si no es ninguno de los anteriores, es un simbolo
  56.             //Comprobamos si habia una palabra en el array y si es asi la almacenamos en la lista de palabras
  57.             if(largoPalabra > 0){
  58.                pListaPalabras = AddToList(pListaPalabras,&posListaPalabras,largoPalabra,palabra);
  59.  
  60.                //Y guardamos el simbolo en la lista de simbolos
  61.                if(!feof(archivo)){
  62.                   palabra[0]=caracter;
  63.                   palabra[1]='\0';
  64.                   pListaSimbolos = AddToList(pListaSimbolos,&posListaSimbolos,1,palabra);
  65.                }
  66.             //Comprobamos si habia un numero en el array y si es asi lo almacenamos en la lista de numeros
  67.             }else if(largoNumero > 0){
  68.  
  69.                pListaNumeros = AddToList(pListaNumeros,&posListaNumeros,largoNumero,palabra);
  70.                //Y guardamos el simbolo en la lista de simbolos
  71.                if(!feof(archivo)){
  72.                   palabra[0]=caracter;
  73.                   palabra[1]='\0';
  74.                   pListaSimbolos = AddToList(pListaSimbolos,&posListaSimbolos,1,palabra);
  75.                }
  76.             }else{
  77.                //Si no habia ni palabra ni numero en el array llegamos aqui y guardamos el simbolo en la lista de simbolos
  78.                if(!feof(archivo)){
  79.                   palabra[0]= caracter;
  80.                   palabra[1]= '\0';
  81.                   pListaSimbolos = AddToList(pListaSimbolos,&posListaSimbolos,1,palabra);
  82.                }
  83.             }
  84.             largoPalabra=0;
  85.             largoNumero=0;
  86.             memset(palabra,0,SIZESTRING);
  87.          }
  88.       }while(!feof(archivo));
  89.       if(posListaPalabras > 0){
  90.          printf("\nLista de palabras encontradas\n");
  91.          printf("-----------------------------\n");
  92.          for(i=0;i<posListaPalabras;i++){
  93.             printf("%s: %d veces\n",pListaPalabras[i].palabra,pListaPalabras[i].contador);
  94.          }
  95.  
  96.          if(pListaPalabras != NULL)
  97.             free(pListaPalabras);
  98.       }else{
  99.          printf("No se encontraron palabras en el archivo.");
  100.       }
  101.  
  102.       if(posListaNumeros > 0){
  103.          printf("\nLista de numeros encontrados\n");
  104.          printf("-------------------------------\n");
  105.          for(i=0;i<posListaNumeros;i++){
  106.             printf("%s: %d veces\n",pListaNumeros[i].palabra,pListaNumeros[i].contador);
  107.          }
  108.  
  109.          if(pListaNumeros != NULL)
  110.             free(pListaNumeros);
  111.       }else{
  112.          printf("No se encontraron numeros en el archivo.");
  113.       }
  114.  
  115.       if(posListaSimbolos > 0){
  116.          printf("\nLista de simbolos encontrados\n");
  117.          printf("-------------------------------\n");
  118.          for(i=0;i<posListaSimbolos;i++){
  119.             printf("%s: %d veces\n",pListaSimbolos[i].palabra,pListaSimbolos[i].contador);
  120.          }
  121.  
  122.          if(pListaSimbolos != NULL)
  123.             free(pListaSimbolos);
  124.       }else{
  125.          printf("No se encontraron simbolos en el archivo.");
  126.       }
  127.    }else{
  128.       printf("No se pudo abrir el archivo.");
  129.    }
  130.    printf("\n\nPulse INTRO para salir.");
  131.    getchar();
  132.    return 0;
  133. }
  134. //---------------------------------------------------------------------------
  135.  
  136. //Funcion encargada de almacenar la estructura en la lista
  137. Lista *AddToList(Lista *pLista, int *pos, int largoPalabra, char *palabra)
  138. {
  139.    int encontrada=0, i;
  140.  
  141.    for(i=0;i<*pos;i++){
  142.       if(strcmp(pLista[i].palabra, palabra)==0){
  143.          pLista[i].contador++;
  144.          encontrada=1;
  145.          break;
  146.       }
  147.    }
  148.    if(encontrada == 0){
  149.       if(pLista == NULL){
  150.          pLista = malloc(sizeof(Lista));
  151.       }else{
  152.          pLista = realloc(pLista,sizeof(Lista)*(*pos+1));
  153.       }
  154.       memset(pLista[*pos].palabra,0,SIZESTRING);
  155.       strncpy(pLista[*pos].palabra,palabra,largoPalabra);
  156.       pLista[*pos].contador++;
  157.       *pos+=1;
  158.    }
  159.    return pLista;
  160. }

Última edición por aguml; 09/09/2015 a las 10:03 Razón: Aportar mas imformacion: