| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
reydetablistas
Registrado: 05 Nov 2006 Mensajes: 8
| Publicado: 16/09/2007 3:16 pm | | | Título: Mas preguntas sobre *.txt |
| Hola soy yo de nuevo, gracias a DCelso y a daltomi por haberme pasado buenos tips, aunque aun tengo muchas dudas. Para llevar a cabo un programa que lea un archivo de texto y cuente el número de mayúsculas y minúsculas estoy usando como base el siguiente código, proporcionado por DCelso
| Código: | #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAX_BUFFER 5 void main() { FILE *archivo; char caracteres[MAX_BUFFER]; long int leidos,i; int contadores[3]={0,0,0};
archivo=fopen("entrada.txt","rb");
leidos=fread( caracteres, 1, MAX_BUFFER, archivo ); while (leidos>0) { for (i=0;i<leidos;i++) { if (islower(caracteres[i])) { contadores[0]++; } else if (isupper(caracteres[i])) { contadores[1]++; } else { contadores[2]++; } } leidos=fread( caracteres, sizeof(char), MAX_BUFFER, archivo ); }
fclose(archivo);
printf("minusculas:%d\n",contadores[0]); printf("mayusculas:%d\n",contadores[1]); printf("otros:%d\n",contadores[2]); }
|
Ahora necesito que el nombre del archivo lo proporcione el usuario (string), sin necesidad de que proporcione la terminación, y que el contenido del archivo de texto se despliegue en la pantalla; además necesito contar también el numero de vocales, el numero de consonantes, el numero de signos de puntuación, el numero de espacios en blanco, acentos y el numero de líneas y palabras en el texto. Una cosa más, podrían explicarme como funciona las siguientes expresiónes:
| Código: | leidos=fread( caracteres, 1, MAX_BUFFER, archivo );
leidos=fread( caracteres, sizeof(char), MAX_BUFFER, archivo );
|
Yo se que pido demasiado pero en serio necesito su ayuda y solo cuento con ustedes. Gracias de antemano y recuerden “El conocimiento no vale si no lo compartes” |
| | Volver arriba | |  | daltomi
Registrado: 28 Abr 2007 Mensajes: 114 Ubicación: Argentina
| Publicado: 16/09/2007 4:19 pm | | | Título: Sugerencias |
| Hola. Por favor, lee las aclaraciones de rir3760 en tú post anterior, ya que si no aplicas los mismos al código,que proviene de allí, será una "reacción en cadena" de errores y te llevará mucho tiempo en saber el por qué de los mismos, tanto para los que quieran ayudarte. Sobre todo ya que necesitas trabajar con cadena de caracteres y formatos de salto de línea, etc, etc.
Prototipo de fread:
| Cita: | size_t fread(void* ptr, size_t size, size_t count, FILE* stream)
Lee tantos elementos como "count" de tamaño como "size" cada uno.
|
Sobre lo que preguntabas sobre fread:
| Cita: | // lectura de MAX_BUFFER elementos de tamaño 1(size_t) cada uno.
leidos=fread( caracteres, 1, MAX_BUFFER, archivo );
// lectura de MAX_BUFFER elementos de tamaño sizeof(char) cada uno.
leidos=fread( caracteres, sizeof(char), MAX_BUFFER, archivo );
|
Saludos. _________________ El algoritmo es como la llave y el lenguaje la cerradura. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 16/09/2007 6:12 pm | | | Título: Re: Mas preguntas sobre *.txt |
| | reydetablistas escribió: | | Ahora necesito que el nombre del archivo lo proporcione el usuario (string), sin necesidad de que proporcione la terminación |
¿A que te refieres con "terminacion", a la extension?
Basta con leer una linea de texto de la entrada estandar con fgets, eliminar el caracter '\n' y utilizar esa cadena como el primer argumento de fopen:
| Código: | #include <stdio.h> /* FILENAME_MAX */
/* ... */
FILE *entrada; char nom_archivo[FILENAME_MAX]; char *nl;
/* ... */
printf("Nombre del archivo: "); fflush(stdout); fgets(nom_archivo, FILENAME_MAX, stdin); if ((nl = strchr(nom_archivo, '\n')) != NULL) *nl = '\0';
/* ... */
if ((entrada = fopen(nom_archivo, "rt")) == NULL)
/* ... */ |
| reydetablistas escribió: | | y que el contenido del archivo de texto se despliegue en la pantalla; |
Bien podrias procesar el contenido del archivo caracter por caracter:
| Código: | while ((ch = fgetc(entrada)) != EOF){ /* ... */ } if (ferror(entrada)){ /* manejo de error */ }
/* ... */ |
El caracter en turno lo procesas y a continuacion lo imprimes en la salida estandar con putchar, putc o fputc.
| reydetablistas escribió: | | además necesito contar también el numero de vocales, el numero de consonantes, el numero de signos de puntuación, el numero de espacios en blanco, acentos y el numero de líneas y palabras en el texto. |
Para verificar si un caracter es vocal o no la biblioteca estandar de C no provee una funcion pero uno puede desarrollar una propia basada en strchr:
| Código: | int es_vocal(int ch) { return strchr("aeiou", tolower(ch)) != NULL; } |
Para verificar si un caracter es consonante primero se verifica (en un bloque if ... else if ...) si este es una vocal con la funcion ya mencionada y a continuacion (en una sentencia else if) se verifica con la funcion isalpha, esta retorna verdadero en caso de que su argumento sea un caracter alfabetico.
Para verificar si un caracter es puntuacion o espacio blanco puedes utilizar las funciones ispunct e isspace, respectivamente.
Para contabilizar las lineas basta con verificar si el caracter en turno es igual a '\n'.
Para contabilizar las palabras la forma mas sencilla es verificando el espacio antes y despues de estas, me parece que hay temas en la base de datos de los foros sobre esto, es solo cuestion de utilizar el buscador del sitio.
En cuanto a contar acentos y otras [CENSORED] que no forman parte del juego de caracteres ASCII la mejor recomendacion es que no te molestes, honestamente no vale la pena.
| reydetablistas escribió: | | Yo se que pido demasiado pero en serio necesito su ayuda y solo cuento con ustedes. Gracias de antemano y recuerden “El conocimiento no vale si no lo compartes” |
No hay problema, toma esto como guia, desarrolla por tu cuenta el programa y cuando tengas un problema concreto con alguna parte de tu programa nosotros te ayudamos.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |