/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Mas preguntas sobre *.txt

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
reydetablistas



Registrado: 05 Nov 2006
Mensajes: 8

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com