/
Inicio :: Foros

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

Como leer un archivo *.txt en Dev c++

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



Registrado: 05 Nov 2006
Mensajes: 8

MensajePublicado: 14/09/2007 4:11 pm
Título: Como leer un archivo *.txt en Dev c++

Que tal! tengo que realizar un programa en Dev c++, el cual tiene que leer un archivo *.txt para poder contar el numero de mayusculas y minusculas que en el existan. Mi problema es que no se como cargar el archivo ni cual es la mejor forma de almacenarlo para trabajar con el.
Les estare muy agradecido si pudieran mostrarme el codigo para poder solucionar mi problema.
Gracias
Volver arriba
daltomi



Registrado: 28 Abr 2007
Mensajes: 114
Ubicación: Argentina

MensajePublicado: 14/09/2007 4:25 pm
Título:

Hola.
Aqui, en el foro Principiante C/C++, Lectura de un archivo binario
Si estás de acuerdo, las dudas que tengas las puedas preguntar en ese tema ya que no hay mucha diferencia:
1. Código de lectura de archivo en C++.
2. Como leer un archivo.
3. Con los datos del archivo realizar tal(?) acción.

Saludos.
Volver arriba
DCelso



Registrado: 28 Abr 2004
Mensajes: 112

MensajePublicado: 14/09/2007 5:33 pm
Título:

No se exactamente cual necesitas, aqui hay tres métodos. Quizas el metodo2 sea el mejor ya que es el intermedio en accesos a disco y memoria necesitada.
Espero que te ayude con tu problema.
Saludos.
Código:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_BUFFER 5
void metodo1()
{
        FILE *archivo;
        char caracter;
        int contadores[3]={0,0,0};

        archivo=fopen("entrada.txt","rt");

        while(!feof(archivo)) {
                caracter=fgetc(archivo);
                if (islower(caracter)) {
                        contadores[0]++;
                } else if (isupper(caracter)) {
                        contadores[1]++;
                } else {
                        //if ((caracter!=EOF) && (caracter!='\n'){ )
                        contadores[2]++;
                        //}
                }
        }
        printf("minusculas:%d\n",contadores[0]);
        printf("mayusculas:%d\n",contadores[1]);
        printf("otros:%d\n",contadores[2]);
        fclose(archivo);

}
void metodo2()
{
        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]);
}

void metodo3()
{
        FILE *archivo;
        char *caracteres;
        long int comienzo, longitud,i;
        int contadores[3]={0,0,0};

        archivo=fopen("entrada.txt","rb");
        comienzo=ftell( archivo );
        fseek( archivo, 0L, SEEK_END );
        longitud = ftell( archivo )-comienzo;
        rewind( archivo );
        caracteres= (char*) malloc(longitud);
        fread( caracteres, 2, longitud, archivo );
        fclose(archivo);

        for (i=0;i<longitud;i++) {
                if (islower(caracteres[i])) {
                        contadores[0]++;
                } else if (isupper(caracteres[i])) {
                        contadores[1]++;
                } else {
                        contadores[2]++;
                }
        }

        printf("minusculas:%d\n",contadores[0]);
        printf("mayusculas:%d\n",contadores[1]);
        printf("otros:%d\n",contadores[2]);
        free( caracteres);
}

int main(int argc, char** argv)
{
        metodo1();
        metodo2();
        metodo3();
        return 0;
}


Volver arriba
daltomi



Registrado: 28 Abr 2007
Mensajes: 114
Ubicación: Argentina

MensajePublicado: 14/09/2007 6:20 pm
Título:

Hola.
Muy buena aportación DCelso. No he probado tú código pero a primera vista encontré lo que me parece un error, una llamada innecesaria a ftell:
Código:

archivo=fopen("entrada.txt","rb");

//Aquí
comienzo=ftell( archivo );
fseek( archivo, 0L, SEEK_END );
longitud = ftell( archivo )-comienzo;
rewind( archivo );

Como el archivo es abierto inmediatamente antes de la llamada a ftell, siempre devolverá 0(cero), recordemos que ftell devuelve el "cursor de posición" del archivo.

Saludos.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 16/09/2007 8:39 am
Título:

Lo que sigue es una critica constructiva (sobre C estandar) y espero que se tome como tal.

En el primer metodo que comenta DCelso no es correcto utilizar feof para controlar el bucle ya que se realizaria un iteracion de mas debido a que esta funcion solo devuelve verdadero despues que una funcion de lectura falla.

La funcion fgetc y similares devuelven un valor de tipo int, utilizar un objeto de tipo char no es correcto porque el valor devuelto puede ser cualquier caracter o el valor EOF y esto esta mas alla del rango de valores posibles de los tipos char, unsigned char y signed char (salvo casos excepcionales donde char e int tienen el mismo tamaño lo que genera otras problematicas ...).

Seria mejor implementar esa funcion de esta forma:
Código:
void metodo1(void)
{
   FILE *entrada;
   int ch;
   long minusc;
   long mayusc;
   long otros;
   
   if ((entrada = fopen("entrada.txt","rt")) == NULL){
     
      /* manejo de error */
     
   }
   
   minusc = mayusc = otros = 0;
   
   while ((ch = fgetc(entrada)) != EOF)
      if (islower(ch))
         minusc++;
      else if (isupper(ch))
         mayusc++;
      else
         otros++;
   if (ferror(entrada)){
     
      /* manejo de error */
     
   }
   fclose(entrada);
   
   printf("minusculas:%ld\n", minusc);
   printf("mayusculas:%ld\n", mayusc);
   printf("otros:%ld\n", otros);
}


En el caso del segundo metodo el archivo se abre en modo binario lo que desactiva la conversion automatica entre el caracter '\n' y lo que realmente se utilize para indicar el avanze de linea en la plataforma utilizada. Esto no tiene consecuencias en el caso de Linux y Mac pero generaria un numero incorrecto de caracteres en MS Windows, un caracter extra (el '\r') por cada linea en el archivo.

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