• Sábado 8 de Junio de 2024, 22:03

Autor Tema:  Contar las palabras de un archivo.  (Leído 8047 veces)

espartako84

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Contar las palabras de un archivo.
« en: Viernes 18 de Enero de 2008, 07:37 »
0
Saludos.

Tengo que contar el número de palabras de un texto. Se considera palabra, aquella separada por un espacio '\n', o la ultima del archivo.

Todo marcha bien, hasta que el programa se encuentra dos espacios, o dos saltos de linea seguidos, que se vuelve "loco" y me los cuenta como palabras.

El código que he escrito es el siguiente:

Código: Text
  1.   ...
  2.  
  3.   FILE *fil;
  4.   int x, acum;
  5.   char aux[100], e;
  6.  
  7.     if ((fil = fopen(aux, "r")) == NULL)
  8.       printf("No se pudo abrir el archivo. \n");
  9.     else {
  10.     acum=0;
  11.       while (!feof(fil)) {
  12.     e = fgetc(fil);
  13.     if ( ((e == ' ' ) || feof(fil)  || (e == '\n')) && (acum == 0))
  14.       acum = 0;
  15.     else {
  16.     if (((e == ' ' ) || feof(fil)  || (e == '\n')) && (acum != 0)) {
  17.       x++;
  18.       acum = 0;
  19.     } else
  20.       acum++;
  21.       }
  22.     }
  23.   fclose(fil);
  24.    printf("El número de palabras del archivo es %d\n", x);
  25. ...
  26.  
  27.  

Los saco con fegtc, en vez de con fscanf, porque tiene que leer cualquier tipo de archivo, no solo los de texto. Básicamente lo que hago es sacar el carácter, comprobar que no cumple ninguna condición para que  sea final de palabra, y aumentar el acumulador. Si se cumple una condición de final de palabra, y el acum es 0, lo vuelvo a poner a 0 y leo el siguiente carácter. Si es distinto de 0, aumento el contador de palabras (el x++), y vuelvo a poner el acum a 0, para seguir contando.

Si le mandamos contar un texto de este estilo, juntito y bien ordenado:
Citar
#include <stdio.h>
Lo cuenta perfectamente.

El problema lo da cuanto tiene que contar un texto de este estilo:
Citar
#include    <stdio.h>


Cuando el programa se encuentra con varios saltos de línea o espacios seguidos, que se vuelve loco, pasa de la primera condicion del if
Código: Text
  1.     if ( ((e == ' ' ) || feof(fil)  || (e == '&#092;n')) && (acum == 0))
  2.  
Y me cuenta esos saltos de línea, o espacios como palabras.

En fin. Llevo como 7 horas dándole vueltas, y no se que puede ser, quizá la culpa la tenga la falta de horas de sueño...

Es una cosa tan "simple" a primera vista, que estoy sumamente mosqueado por no conseguir hacerlo...

Bueno, gracias por adelantado a todos aquellos que me lean.

Chao.

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Contar las palabras de un archivo.
« Respuesta #1 en: Viernes 18 de Enero de 2008, 09:36 »
0
lo que puedes hacer es hacer ciclos segun lo encontrado:

o sea:

do {
While ( es un espacio);
while ( es una letra);
palabra++;
} while (!feof);

espartako84

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Contar las palabras de un archivo.
« Respuesta #2 en: Viernes 18 de Enero de 2008, 16:36 »
0
Cita de: "diego.martinez"
lo que puedes hacer es hacer ciclos segun lo encontrado:

o sea:

do {
While ( es un espacio);
while ( es una letra);
palabra++;
} while (!feof);
Muchas gracias por la ayuda, pero he intentado hacer lo que dices, pero me hace exactamente lo mismo. Cuando hay varios espacios o '\n' seguidos, no hace caso de las indicaciones, y los cuenta como 1 palabra(lo he probado de mil maneras).

Seguire probando aver.

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Contar las palabras de un archivo.
« Respuesta #3 en: Viernes 18 de Enero de 2008, 20:13 »
0
Es curioso, porque he probado tu codigo y a mi me funciona bien, lo he probado con Visual C++ Express 2005, y con Code::Blocks/mingw, solo le añadi las cabeceras correspondientes.

Código: Text
  1.  
  2. #include &#60;stdio.h&#62;
  3. #include &#60;stdlib.h&#62;
  4. #include &#60;string.h&#62;
  5.  
  6. int main()
  7. {
  8.   FILE *fil;
  9.   int x, acum;
  10.   char aux[100], e;
  11.  
  12.   x = 0;
  13.   strcpy(aux, &#34;prueba.txt&#34;);
  14.   if ((fil = fopen(aux, &#34;r&#34;)) == NULL)
  15.     printf(&#34;No se pudo abrir el archivo. &#092;n&#34;);
  16.   else {
  17.     acum=0;
  18.     while (!feof(fil)) {
  19.       e = fgetc(fil);
  20.       if ( ((e == ' ' ) || feof(fil)  || (e == '&#092;n')) && (acum == 0))
  21.         acum = 0;
  22.       else {
  23.         if (((e == ' ' ) || feof(fil)  || (e == '&#092;n')) && (acum != 0)) {
  24.           x++;
  25.           acum = 0;
  26.         } else
  27.           acum++;
  28.       }
  29.     }
  30.     fclose(fil);
  31.     printf(&#34;El número de palabras del archivo es %d&#092;n&#34;, x);
  32.   }
  33.   return 0;
  34. }
  35.  
  36.  

El archivo corto con el que lo probe:

Código: Text
  1.  
  2.  
  3.  
  4. #include
  5.  
  6.  
  7.  
  8.    &#60;stdi    o.h&#62;
  9.  
  10.  

A mi me conto tres palabras, a pesar de que deje saltos de linea al principio y espacios en medio y al principio.

Que compilador estas utilizando?

Sugerencia añadida: Depuralo paso a paso, para ver que valores toman las variables, estoy pensando que quizas es alguna variable que no inicializas, en mi caso, yo añadi x = 0;

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

espartako84

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Contar las palabras de un archivo.
« Respuesta #4 en: Viernes 18 de Enero de 2008, 21:08 »
0
ProfesorX, muchas gracias por la ayuda. EL compilador que uso es gcc, en un servidor de UNIX. Ya se porque no me funcionaba, era por que no incluía los '\t', '\v', ect... Y cuando había  mas de un espacio, o mas de un salto de línea me lo debía contar como tabulador.

Al final me ha quedado bastante sencillo:

Código: Text
  1. ...
  2.  
  3.   FILE *fil;
  4.   int x;
  5.   char aux[100], e[1];
  6.  
  7.       ...
  8.  
  9.     if ((fil = fopen(aux, &#34;r&#34;)) == NULL)
  10.       printf(&#34;No se pudo abrir el archivo. &#092;n&#34;);
  11.     else {
  12.   e[1] = ' ';
  13.   do {  
  14.   e[0] = e[1];
  15.   e[1] = fgetc(fil);
  16.   if ( (isspace(e[1]) && !(isspace(e[0])))  ) {  
  17.     x++;          
  18.   }
  19.  
  20.   } while(!feof(fil));
  21. ...
  22.  
  23.  

int isspace (int)  es una función de manejo de caracteres, que tienen por entrada un carácter, y te devuelve verdadero si el carácter es un carácter en blanco (considera caracteres en blanco: ' '. '\n', '\t', '\r', '\f', '\v' )

Me lee bien los archivos de txt, .c ect... Pero en los archivos binarios, cuenta 3 o 4 palabras mas de las que nos da la orden wc de UNIX (básicamente lo que estoy intentando es escribir el código de wc -w, que dado un archivo te cuente el número de palabras)

A ver si lo depuro un poco,

PD: He probado tu código, y tu archivo, y me sigue dando error. Supongo que seran las diferencias del compilador.

EDITO --> Se me olvidaba. Para que la función isspace funcione bien, hay que incluir la librería <ctype.h>