| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
mario_tko
Registrado: 25 May 2011 Mensajes: 8
| Publicado: 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: 6586 Ubicación: Mexico
| Publicado: 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 _________________ Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short. -- Mentat Handbook |
| | Volver arriba | |  | mario_tko
Registrado: 25 May 2011 Mensajes: 8
| Publicado: 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
| Publicado: 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
| Publicado: 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: 6586 Ubicación: Mexico
| Publicado: 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 _________________ Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short. -- Mentat Handbook |
| | Volver arriba | |  | | mario_tko
Registrado: 25 May 2011 Mensajes: 8
| Publicado: 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
| Publicado: 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
| Publicado: 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: 6586 Ubicación: Mexico
| Publicado: 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 _________________ Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short. -- Mentat Handbook |
| | 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
|
|
| |