/
Inicio :: Foros

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

Leer de fichero txt y copiar cadenas

 
      Índice del Foro elrincondelc.com -> Algoritmos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
mario_tko



Registrado: 25 May 2011
Mensajes: 8

MensajePublicado: 25/05/2011 1:07 pm
Título: Leer de fichero txt y copiar cadenas

Hola a todos, este es mi problema: vereis necesito un codigo que me lea un txt y me guarde en 2 variables (tipo enum) una serie de datos, y me tiene loco

Por ejemplo

(detro del txt)(prueba.txt)
123123123123(/t)
0101011010101(/n)
123213123552(/t)
000111010101(/n)

enum usuario{
int BI, //seria hasta '/t'
char FIRMA}; //sera hasta '/n'
y mi codigo es este:


Cita:


buffer_puntero= fopen ("prueba.txt", "r");

char *usuarios;

enum usuarios
{
int BI,
char FIRMA
};


char cadena_string;
int j,k;


for(j=0;j!='\t';j++)
{
fscanf("%d", &usuarios.BI);

for(k=0;k!='\n';k++)
fscanf("%s", usuarios.FIRMA);
}
}

printf("Imprimir los resultados: \n %d --> %s", &usuarios.BI, usuarios.FIRMA);

fclose(buffer_puntero);

}



Si alguien puede ayudarme se lo agradeceré
Volver arriba
rir3760



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

MensajePublicado: 25/05/2011 1:38 pm
Título:

Hola mario_tko

Bienvenido a los foros. Cuando tengas una duda por favor indica el lenguaje de programacion que estas utilizando, mas informacion en la pagina reglas de los foros.

Tambien necesitas de un buen curso o manual sobre C ya que el fragmento que publicas tiene demasiados errores. Para obtener opiniones puedes revisar la seccion "Cursos" de este sitio y tambien utilizar el motor de busqueda de los foros.

La forma mas sencilla de leer esa informacion es mediante la funcion fscanf, mas o menos asi:
Código:
#include <stdio.h>
#include <stdlib.h>

#define NOM_ARCHIVO  "prueba.txt"
#define LONG_MAX_CAMPO  64

struct registro {
   char bi[LONG_MAX_CAMPO];
   char firma[LONG_MAX_CAMPO];
};

#define MAX_NUM_REGS  128

int main(void)
{
   FILE *entrada;
   struct registro reg[MAX_NUM_REGS];
   int i;
   
   /* Abrimos el archivo para lectura */
   if ((entrada = fopen(NOM_ARCHIVO, "rt")) == NULL){
      perror(NOM_ARCHIVO);
      return EXIT_FAILURE;
   }
   
   /* Leemos el maximo posible de registros */
   for (i = 0; i < MAX_NUM_REGS; i++)
      /* Terminamos el bucle si no pueden extraerse los dos campos */
      if (fscanf(entrada, " %[^\t] %[^\n]", reg[i].bi, reg[i].firma) != 2)
         break;
   fclose(entrada);
   
   /* Procesamos aqui los "i" registros */
   
   return EXIT_SUCCESS;
}


Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
mario_tko



Registrado: 25 May 2011
Mensajes: 8

MensajePublicado: 25/05/2011 2:22 pm
Título:

Muchas gracias, ahora mismo estoy viendo lo de el curso. Con las prisas se me habia olvidado decir que era en lenguaje C.

Muchas gracias!
Volver arriba
mario_tko



Registrado: 25 May 2011
Mensajes: 8

MensajePublicado: 02/06/2011 4:18 am
Título:

Vuelvo a estar atascado, y nose como resolver el problema. Creo un vector con memoria dinamica, pero al ejecutar el programa de da "Violacion del segmento"

CODIGO:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
char bi[8];
char firma[2048];
}registro;



main()
{
FILE *buffer_puntero;

registro *reg, y;
buffer_puntero= fopen ("DANGER_DB_TINY.txt", "r");
reg = (registro*)malloc(100 * sizeof (registro));

int i;
char aux;


/* Leemos el maximo posible de registros */
while(i!=EOF)
{

if ((fscanf (buffer_puntero , " %[^\t] %[^\n]", reg[i].bi, reg[i].firma)) != 2)
break;
i++;
}



fclose(buffer_puntero);

}
Volver arriba
mario_tko



Registrado: 25 May 2011
Mensajes: 8

MensajePublicado: 02/06/2011 4:24 am
Título:

Necesito que el me guarde por cada linea un registro en el vertor, por ejemplo:



12312312312 \t 01010101010110101\n
12337494040 \t 01000011110101010\n

en reg[i].bi hasta la tabulacion por linea, y hasta reg[i].firma hasta el salto de linea \n
Volver arriba
rir3760



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

MensajePublicado: 02/06/2011 6:35 am
Título:

Sera mas facil ayudarte si publicas el codigo fuente completo del programa.

Para las operaciones de lectura debes verificar no se lean mas registros que los reservados y que la lectura del registro sea exitosa, mas o menos así:
Código:
/* Leemos el maximo posible de registros */
for (i = 0; i < 100; i++)
   if (scanf(buffer_puntero, " %[^\t] %[^\n]", reg[i].bi, reg[i].firma) != 2)
      break;

/* "i" es el numero de registros leidos del archivo */


En cuanto a las operaciones de escritura esta es fácil utilizando fprintf para imprimir el primer campo, un tabulador, el segundo campo y finalmente el avance de linea, mas o menos así:
Código:
FILE *archivo;

/* Apertura del archivo en modo escritura ... */

/* "num_registros" es el numero de registros */
for (i = 0; i < num_registros; i++)
   fprintf(archivo, "%s\t%s\n", reg[i].bi, reg[i].firma);


Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
mario_tko



Registrado: 25 May 2011
Mensajes: 8

MensajePublicado: 02/06/2011 8:07 am
Título:

Aqui esta el codigo entero. Donde quiero escribir es el el vector dinamico para hacer operaciones con él!

Código:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
   char bi[8];
   char firma[2048];
}registro;



//Algoritmo de Busqueda de la firma biometrica
funcioncargadora()
{   
   FILE *buffer_puntero;   //Apunte al inicio del buffer
   
   char ch;
   int respuesta;
   int eleccionfichero;
   int numerofirma;

      printf("\n\n*************************************");
      printf("\nMENU DE ELECCION DE FICHERO");
      printf("\n*************************************");
      printf("\n 1.- Elegir el archivo TINY");
      printf("\n 2.- Elegir el archivo SMALL");
      printf("\n 3.- Elegir el archivo LARGE");
      printf("\n*************************************\n\n");
      printf("\n\nIntroduce una accion: ");

      scanf("%d", &eleccionfichero);

      registro *reg, y;


      switch (eleccionfichero)
      {
         case 1: buffer_puntero= fopen ("DANGER_DB_TINY.txt", "r");   //Abre el archivo;
            reg = (registro*)malloc(100 * sizeof (registro));   //Asigna memoria
            break;
         case 2: buffer_puntero= fopen ("DANGER_DB_SMALL.txt", "r");   //Abre el archivo
            reg = (registro*)malloc(1000 * sizeof (registro));   //Asigna memoria
            break;
         case 3: buffer_puntero= fopen ("DANGER_DB_LARGE.txt", "r");   //Abre el archivo
            reg = (registro*)malloc(80181 * sizeof (registro));   //Asigna memoria
            break;
      }
   
     int i;
   char aux;
   

   /* Leemos el maximo posible de registros */
   for (i = 0; i < 100; i++)
         if (scanf(buffer_puntero, " %[^\t] %[^\n]", reg[i].bi, reg[i].firma) != 2)
               break;

   /* "i" es el numero de registros leidos del archivo */
   
   while(i!=EOF)
   {
      
      if ((fscanf (buffer_puntero , " %[^\t] %[^\n]", reg[i].bi, reg[i].firma)) != 2)
         break;
      i++;
      }



   fclose(buffer_puntero);//Cerramos el fichero porque ya no trabajamos con él

   //BUSQUEDA BIOMETRICA

   char *cadena_introducida;
   char *cadena_buscada;
   int valor_n, r=0, cuentavuelta=0, x=0;

   cadena_buscada=strstr(reg[i].firma ,cadena_introducida);
   
   printf("\n\nIntroduce el valor n deseado:  ");
   scanf("%d", &valor_n);
   printf("\n\nIntroduce el valor de la busqueda:  ");
   scanf("%c", cadena_introducida);
   printf("\n");

   

   

   if( cadena_introducida=cadena_buscada)
   {
      for(r=0;r<EOF;r++) //en substitucion a EOF deberia haber una variable linea q nos dijera cuantas lineas tiene el archivo-vector
      {   //Seria posible poner en vez de EOF el caracter '\0' ??
         printf("\n\nLa Distancia es 0\n\nEl Identificador es: %s", reg[i].bi);
         cuentavuelta++;
         if (cuentavuelta=valor_n)
            break;
      }      
   }
   else
   {
      if(cadena_introducida<cadena_buscada)
      {   

         for(r=0;cadena_introducida!=cadena_buscada;r++)
         {
            cadena_introducida[r]=cadena_introducida[x]-'1';   //SEGUN COMPILADOR FALLO INCOPATIBILIDAD DE ESTADOS
            cadena_buscada=strstr(reg[i].firma ,cadena_introducida);
            printf("\n\nLa Distancia es [%d]\n\nEl Identificador es: %s", &x, reg[i].bi); //FALLO COMPILADOR DE LINUX
            cuentavuelta++;
            if (cuentavuelta=valor_n)
               break;
         }      
         
      }         
   }

   


   
free (reg);
}


//----------------------------------------------------------------------


//FUNCION PRINCIPAL
main()
{

   

   int opcion=0;   

   while(opcion <= 0 || opcion > 3)
   {
      printf("\n\n*************************************");
      printf("\nMENU-DANGER_DB");
      printf("\n*************************************");
      printf("\n 1.- Lectura del fichero.");
      printf("\n 2.- Busqueda de la Firma Biometrica.");
      printf("\n 3.- Salir de la aplicacion.");
      printf("\n*************************************");
      printf("\n\nElige una opcion: ");

      scanf("%d", &opcion);
   
      if(opcion <= 0 || opcion > 3)
      {
         printf("\n\nERROR AL INTRODUCIR LA OPCION!!\n\n  Vuelva a intentarlo...\n");   
         opcion==0;
      }   
      
      switch (opcion)
      {
         case 1: funcionleerfichero();
         opcion=0;break;
         case 2: funcioncargadora();
            break;
         case 3: exit(1);
      }
      getchar();
      opcion=10;
   }
   
}




//Funcion Lectura e Impresion del Fichero



funcionleerfichero()
{
   FILE *buffer_puntero;   //Apunte al inicio del buffer
   
   char ch;
   int respuesta;
   int eleccionfichero;

      printf("\n\n*************************************");
      printf("\nMENU DE ELECCION DE FICHERO");
      printf("\n*************************************");
      printf("\n 1.- Elegir el archivo TINY");
      printf("\n 2.- Elegir el archivo SMALL");
      printf("\n 3.- Elegir el archivo LARGE");
      printf("\n*************************************\n\n");
      printf("\n\nIntroduce una accion: ");

      scanf("%d", &eleccionfichero);

      switch (eleccionfichero)
      {
         case 1: buffer_puntero= fopen ("DANGER_DB_TINY.txt", "r");   //Abre el archivo;
            break;
         case 2: buffer_puntero= fopen ("DANGER_DB_SMALL.txt", "r");   //Abre el archivo
            break;
         case 3: buffer_puntero= fopen ("DANGER_DB_LARGE.txt", "r");   //Abre el archivo
            break;
      }


   if(buffer_puntero==NULL)      //Se puede abrir??
      printf("\n\nError en la apertura del archivo");
   else
   {

      ch=getc(buffer_puntero);
      

      printf("\n\nQuiere usted imprimir el contenido del fichero por pantalla?(y/n)\n"); //Impresion por pantalla?
      printf("SI='0'\n");
      printf("NO='1'\n");

      printf("\n\n\n");
      scanf("%d", &respuesta);
      printf("\n\n\n");
      
      if(respuesta==0)
      {
         ch=getc(buffer_puntero);

         while(ch != EOF)
         {
            putchar(ch);
            ch= getc(buffer_puntero);      
         }
      }
      else
         printf("\nNegacion de la peticion\n");

         
      printf("\n\n");
   
   }
   fclose(buffer_puntero);
}

Volver arriba
mario_tko



Registrado: 25 May 2011
Mensajes: 8

MensajePublicado: 02/06/2011 9:33 am
Título:

Mi maxima preocupacion ahora es como guardo esto:



1234224\t ------> reg[i].bi (((reg[0].bi)))
01010101011010101\n ------> reg[i].firma (((reg[0].firma)))
9822637\t ------> reg[i].bi (((reg[1].bi)))
11100001010101011\n ------> reg[i].firma (((reg[1].firma)))
6394364\t ------> reg[i].bi (((reg[2].bi)))
00000001111101011\n ------> reg[i].firma (((reg[2].firma)))
6565657\t ------> reg[i].bi (((reg[3].bi)))
00111110010101101\n ------> reg[i].firma (((reg[3].firma)))
....
..
.
.
.
.
etc etc....
Volver arriba
mario_tko



Registrado: 25 May 2011
Mensajes: 8

MensajePublicado: 03/06/2011 9:29 am
Título:

Nadie me puede ayudar con esto?

Código:
funcioncargadora()
{   
   FILE *buffer_puntero;   //Apunte al inicio del buffer
   
   int eleccionfichero;
   registro *reg;

   menufichero();

   scanf("%d", &eleccionfichero);

   if(eleccionfichero<1 || eleccionfichero>3)
   {
      printf("\nEleccion erronea!!\n");
      exit(1);
   }

   switch (eleccionfichero)
   {
      case 1: buffer_puntero= fopen ("DANGER_DB_TINY.txt", "r");   //Abre el archivo;
         //reg = (registro*)malloc(101 * sizeof (registro));   //Asigna memoria
         break;
      case 2: buffer_puntero= fopen ("DANGER_DB_SMALL.txt", "r");   //Abre el archivo
         //reg = (registro*)malloc(1001 * sizeof (registro));   //Asigna memoria
         break;
      case 3: buffer_puntero= fopen ("DANGER_DB_LARGE.txt", "r");   //Abre el archivo
         //reg = (registro*)malloc(80182 * sizeof (registro));   //Asigna memoria
         break;
   }


   
   int i=0,h=0;
   char aux;
   
   //reg = (registro*)malloc(0 * sizeof (registro));
   reg=NULL;
   
   if(buffer_puntero == NULL)   
   {
      printf("\nERROR AL ABRIR FICHEIRO\n");
      system("pause");
      exit(0);
   }
   else
   {      
      while(fscanf(buffer_puntero,"%c", &aux)!=EOF)             
      {
         if(aux=='\n')
            reg = (registro*)realloc(reg,(++h)*sizeof(registro));
      }

      rewind(buffer_puntero);

      for (i = 0; i < h; i++)   
         fscanf(buffer_puntero, "%s\t",reg[i].bi);
               
   }


   /* "i" es el numero de registros leidos del archivo */


   printf("Una prueba: %s\n\n", reg[99].bi);
   printf("Una prueba: %s", reg[99].firma);

   fclose(buffer_puntero);//Cerramos el fichero porque ya no trabajamos con él
Volver arriba
rir3760



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

MensajePublicado: 04/06/2011 10:15 am
Título:

Estoy tomando como base tu ultimo programa completo mas la función que publicas en tu ultimo mensaje.

* La función "main" se debe modificar ya que el bucle principal esta mal estructurado y solo debe asignarse valor a la variable "opcion" mediante la función scanf.

---

* En la funcion "funcioncargadora" llamas a "menufichero" pero esta no aparece en el código fuente que presentas. Deberías crear una función que no solo presente el menú sino también valide la opción y la devuelva como su valor de retorno. De esa forma la validación la quitas de cualquier función que requiera el menú.

* Dependiendo del compilador sera valido (o no) intercalar declaraciones y sentencias, por ello es mejor mover todas las declaraciones incluyendo estas:
Código:
int i = 0, h = 0;
char aux;

Al principio de la función.

* Cuando se termina un programa por error no se debe retornar cero ya que este indica una salida sin errores, en su lugar debes utilizar un valor distinto, en caso de duda puede utilizarse la macro EXIT_FAILURE definida en <stdlib.h>.

* La lectura de datos esta mal ya que no haces nada con ellos. En este momento lo mejor (por sencillo) que puedes hacer es declarar un array de registros "global" declarado fuera de toda función y leer ahí los datos. Una vez el programa funcione correctamente puedes pasar a soluciones mas eficientes (y correctas) para almacenar esa información.

El código fuente del programa modificado hasta el momento es:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
   char bi[8];
   char firma[2048];
} registro;

#define NUM_REGISTROS  20
registro reg[NUM_REGISTROS];

void funcioncargadora(void);
void funcionleerfichero(void);


int main(void)
{
   int opcion;
   int ch;
   
   do {
      puts("*************************************");
      puts("MENU-DANGER_DB");
      puts("*************************************");
      puts(" 1.- Lectura del fichero.");
      puts(" 2.- Busqueda de la Firma Biometrica.");
      puts(" 3.- Salir de la aplicacion.");
      puts("*************************************");
     
      do {
         puts("Elige una opcion:");
         scanf ("%d", &opcion);
         if (opcion < 1 || opcion > 3)
            puts("Error al introducir la opcion!");
         /* Descartamos el resto de la linea */
         while ((ch = getchar()) != EOF && ch != '\n')
            ;
      }while (opcion < 1 || opcion > 3);
     
      switch (opcion){
      case 1:
         funcionleerfichero();
         break;
      case 2:
         funcioncargadora();
         break;
      case 3:
         /* Nada que hacer, es la opcion de salir */
         break;
      }
   }while (opcion != 3);
   
   return 0;
}


void funcioncargadora(void)
{
   FILE *entrada;
   int eleccionfichero;
   int i;
   int num_regs;
   
   /* menufichero(); */
   scanf("%d", &eleccionfichero);
   if (eleccionfichero < 1 || eleccionfichero > 3){
      printf ("\nEleccion erronea!!\n");
      exit (1);
   }
   
   switch (eleccionfichero){
   case 1:
      entrada = fopen("DANGER_DB_TINY.txt", "r");
      break;
   case 2:
      entrada = fopen("DANGER_DB_SMALL.txt", "r");
      break;
   case 3:
      entrada = fopen("DANGER_DB_LARGE.txt", "r");
      break;
   }
   if (entrada == NULL){
      puts("Error al abrir fichero\n");
      system("pause");
      exit(EXIT_FAILURE);
   }
   
   /*
   ** Leemos los registros hasta alcanzar el final del
   ** archivo o el maximo de registros permitidos.
   */
   for (i = 0; i < NUM_REGISTROS; i++)
      if (fscanf(entrada, "%s %s", reg[i].bi, reg[i].firma) != 2)
         break;
   fclose(entrada);
   
   /* Como prueba se imprimen los registros leidos */
   num_regs = i;
   for (i = 0; i < num_regs; i++){
      printf("reg[%d].bi == %s\n", i, reg[i].bi);
      printf("reg[%d].firma == %s\n\n", i, reg[i].firma);
   }
   
}


void funcionleerfichero(void)
{
   FILE *buffer_puntero;
   
   char ch;
   int respuesta;
   int eleccionfichero;
   
   printf ("\n\n*************************************");
   printf ("\nMENU DE ELECCION DE FICHERO");
   printf ("\n*************************************");
   printf ("\n 1.- Elegir el archivo TINY");
   printf ("\n 2.- Elegir el archivo SMALL");
   printf ("\n 3.- Elegir el archivo LARGE");
   printf ("\n*************************************\n\n");
   printf ("\n\nIntroduce una accion: ");
   
   scanf ("%d", &eleccionfichero);
   
   switch (eleccionfichero) {
   case 1:
      buffer_puntero = fopen ("DANGER_DB_TINY.txt", "r");
      break;
   case 2:
      buffer_puntero = fopen ("DANGER_DB_SMALL.txt", "r");
      break;
   case 3:
      buffer_puntero = fopen ("DANGER_DB_LARGE.txt", "r");
      break;
   }
   
   if (buffer_puntero == NULL)
      printf ("\n\nError en la apertura del archivo");
   else {
      printf ("\n\nQuiere usted imprimir el contenido del fichero por pantalla?(y/n)\n");
      printf ("SI='0'\n");
      printf ("NO='1'\n");
     
      printf ("\n\n\n");
      scanf ("%d", &respuesta);
      printf ("\n\n\n");
     
      if (respuesta == 0) {
         ch = getc (buffer_puntero);
         while (ch != EOF) {
            putchar (ch);
            ch = getc (buffer_puntero);
         }
      } else
         printf ("\nNegacion de la peticion\n");
         
      printf ("\n\n");
   }
   
   fclose (buffer_puntero);
}


Pero habrá que seguir trabajando en el para que realice la operación que deseas. De nuevo puedes tomar como guía el programa similar en el tema que te comente.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
      Índice del Foro elrincondelc.com -> Algoritmos
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