Foros del Web » Programación para mayores de 30 ;) » C/C++ »

mostrar datos de un fichero binario por pantalla

Estas en el tema de mostrar datos de un fichero binario por pantalla en el foro de C/C++ en Foros del Web. Hola, el siguiente programa escribe cadenas en un fichero binario, luego los lee del fichero y finalmente las muestra por pantalla: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: ...
  #1 (permalink)  
Antiguo 15/06/2010, 05:00
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
mostrar datos de un fichero binario por pantalla

Hola, el siguiente programa escribe cadenas en un fichero binario, luego los lee del fichero y finalmente las muestra por pantalla:

Código C:
Ver original
  1. #include <stdio.h> //escribe una cadena en un fichero y después lo lee y escribe en pantalla
  2.  
  3.  
  4. struct registro{
  5.    char nombre[50];
  6. };
  7.  
  8.  
  9. int   main ()
  10.    {
  11.       FILE *fich;
  12.       char op;
  13.        
  14.       struct registro datos;
  15.       /* Escritura del float en el fichero */
  16.       if ((fich = fopen ("cadenas.dat", "wb")) == NULL)
  17.          {
  18.          printf ("Error de creación del fichero\n");
  19.          
  20.          }
  21.        else{
  22.           do{
  23.            printf("Introduce una cadena: ");
  24.            scanf("%49s",datos.nombre);
  25.            fwrite (&datos, sizeof (datos), 1, fich);
  26.            printf("¿Otra? (s/n)");
  27.            scanf("%1s",&op);
  28.           }while((op == 's') || (op == 'S'));
  29.        }
  30.        fclose (fich);
  31.       /* Lectura del float del fichero */
  32.       if ((fich = fopen ("cadenas.dat", "rb")) == NULL)
  33.          {
  34.          printf ("Error de existencia del fichero\n");
  35.          
  36.          }
  37.       else{
  38.           fread (&datos, sizeof(datos), 1, fich);
  39.           while(!feof){
  40.              fread (&datos, sizeof(datos), 1, fich);
  41.           }
  42.       }
  43.       fclose (fich);
  44.      
  45.       printf ("%s\n", datos.nombre);
  46.    }

Cuando lo compilo sólo me imprime la primera cadena, ¿por qué? Por favor, contestarme pronto esta tarde tengo examen. Gracias.
  #2 (permalink)  
Antiguo 15/06/2010, 18:36
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: mostrar datos de un fichero binario por pantalla

Puede k ya se aun poco tarde pero esta es una posible solucion.
dado que la longitud de la cadena es fija puedes hacer lo siguiente, al inicio del main debes declarar un puntero de tipo registro llamdo datosArreglo y una variable de tipo long llamada numRegistros.
Código C++:
Ver original
  1. fseek(fich, 0, SEEK_END);
  2. numRegistros= ftell(fich)/sizeof(registro);
  3. datosArreglo = new registro[numRegistros];
  4. rewind(fich);
  5. fread(datosArreglo, sizeof(registro), numRegistros, fich);
  6.  
  7. //fuera del if
  8. for(int cont = 0; cont < numRegistros; ++cont)
  9. {
  10.   printf("%s\n", datosArreglo[cont].nombre);
  11. }
  #3 (permalink)  
Antiguo 16/06/2010, 04:50
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: mostrar datos de un fichero binario por pantalla

Así, ¿ está bien?

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct registro{
  5.    char nombre[50];
  6. };
  7.  
  8.  
  9. int   main ()
  10.    {
  11.       FILE *fich;
  12.       char nom_fich[50];
  13.       char op;
  14.       long int num_registros;
  15.       int i;
  16.       struct registro datos;
  17.       struct registro *datos_arreglo;
  18.  
  19.       printf("Introduzca nombre del fichero: ");
  20.       scanf("%49s",nom_fich);
  21.       /* Escritura del float en el fichero */
  22.       if ((fich = fopen (nom_fich, "wb")) == NULL)
  23.          {
  24.          printf ("Error de creación del fichero\n");
  25.          
  26.          }
  27.        else{
  28.           do{
  29.            printf("Introduce una cadena: ");
  30.            scanf("%49s",datos.nombre);
  31.            fwrite (&datos, sizeof (datos), 1, fich);
  32.            printf("¿Otro? (s/n)");
  33.            scanf("%1s",&op);
  34.           }while((op == 's') || (op == 'S'));
  35.        }
  36.        fclose (fich);
  37.  
  38.        /* Lectura del float del fichero */
  39.              
  40.       if ((fich = fopen (nom_fich, "rb")) == NULL)
  41.          {
  42.          printf ("Error de existencia del fichero\n");
  43.          
  44.          }
  45.       else{
  46.            fseek(fich,0,SEEK_END);
  47.            num_registros=ftell/sizeof(registro);
  48.            datos_arreglo=registro[num_registros];
  49.            rewind(fich);
  50.            fread(datos_arreglo,sizeof(registro),num_registros,fich);
  51.       }
  52.       fclose (fich);
  53.      
  54.       for(i=0; i<num_registros; i++);
  55.            printf("%s\n", datos_arreglo[i].nombre);
  56. }

Cuando lo compilo me da este error: En la función ‘main’:
float.c:47: error: ‘registro’ no se declaró aquí (primer uso en esta función)
float.c:47: error: (Cada identificador no declarado solamente se reporta una vez
float.c:47: error: para cada funcion en la que aparece.)
  #4 (permalink)  
Antiguo 16/06/2010, 22:41
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: mostrar datos de un fichero binario por pantalla

no, tienes errores, checa bien como te lo escribi
  #5 (permalink)  
Antiguo 17/06/2010, 10:53
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: mostrar datos de un fichero binario por pantalla

Puedes explicarme por qué declaras un puntero de tipo registro llamado datosArreglo y en la linea 3 donde pone:
Código C++:
Ver original
  1. datosArreglo=new registro[numRegistros]
cómo lo adapto al lenguaje C. Esta linea que sigue es para calcular cuántos registros hay ¿no?
Código C:
Ver original
  1. num_registros=ftell/sizeof(registro);
. Lo he mirado bien, pero me sigue dando el mismo fallo. Gracias.
  #6 (permalink)  
Antiguo 17/06/2010, 15:24
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: mostrar datos de un fichero binario por pantalla

pidele a alguien mas que mire el codigo k yo te di y el que tu escribiste y te dira k no es verdad k es el mismo. Con respecto a como explique en la respuesta donde te puse el código el puntero lo debes declara al inicio del main. Esto es
Código C:
Ver original
  1. int main()
  2. {
  3. registro *datosArreglo =NULL;
  4. ...
  5. ...
  6. ...
  7. return 0;
  8. }

El porque es muy simple. El número de elementos lo puedes determinar, y la cadena es de tipo arreglo y no un puntero, si fuese un puntero no seria posible emplear la forma que te indique arriba.

Si quieres codificar en C Ansi, entoces debes emplear malloc de la siguiente forma
Código C:
Ver original
  1. datosArreglo= (registro*)malloc(sizeof(registro)*numRegistros);//el cast es necesario por que malloc regresa un puntero a void*
  #7 (permalink)  
Antiguo 18/06/2010, 05:29
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: mostrar datos de un fichero binario por pantalla

Cuando declaras en el main registro *datosArreglo delante ¿no deberías poner la palabra struct?.
  #8 (permalink)  
Antiguo 18/06/2010, 05:57
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: mostrar datos de un fichero binario por pantalla

He hecho la siguiente modificación:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct registro{
  5.    char nombre[50];
  6. };
  7.  
  8.  
  9. int   main ()
  10.    {
  11.       FILE *fich;
  12.       char op;
  13.       int i;
  14.       int num_registros=0;
  15.       struct registro datos;
  16.       struct registro *ptr_reg;  
  17.  
  18.      
  19.       /* Escritura del float en el fichero */
  20.       if ((fich = fopen ("cadenas.dat", "wb")) == NULL)
  21.          {
  22.          printf ("Error de creación del fichero\n");
  23.          
  24.          }
  25.        else{
  26.           do{
  27.            printf("Introduce una cadena: ");
  28.            scanf("%49s",datos.nombre);
  29.            fwrite (&datos, sizeof (datos), 1, fich);
  30.            printf("¿Otro? (s/n)");
  31.            scanf("%1s",&op);
  32.           }while((op == 's') || (op == 'S'));
  33.        }
  34.        fclose (fich);
  35.  
  36.        /* Lectura del float del fichero */
  37.              
  38.       if ((fich = fopen ("cadenas.dat", "rb")) == NULL)
  39.          {
  40.          printf ("Error de existencia del fichero\n");
  41.          
  42.          }
  43.       else{
  44.            fseek(fich, 0, SEEK_END); // Colocar el cursor al final del fichero
  45.            num_registros = ftell(fich)/sizeof (struct registro); // Tamaño en bytes
  46.            ptr_reg = (struct registro*)malloc(sizeof(struct registro)*num_registros);
  47.            rewind(fich);
  48.            fread(ptr_reg, sizeof(struct registro), num_registros, fich);
  49.       }
  50.       fclose (fich);
  51.      
  52.      
  53.       for(i = 0; i < num_registros; i++)
  54.            printf("%s\n", ptr_reg[i].nombre);
  55. }

Cuando lo compilo me da este error: En la función ‘main’:
float.c:46: aviso: declaración implícita incompatible de la función interna ‘malloc’
  #9 (permalink)  
Antiguo 18/06/2010, 08:56
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: mostrar datos de un fichero binario por pantalla

intenta poniendo la libreria stdlib.h
  #10 (permalink)  
Antiguo 18/06/2010, 11:01
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: mostrar datos de un fichero binario por pantalla

Ahora si muchísimas gracias.
  #11 (permalink)  
Antiguo 18/06/2010, 11:16
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: mostrar datos de un fichero binario por pantalla

Puedes explicarme por qué en el main hay que declarar
Código C:
Ver original
  1. struct registro *ptr_reg
. El fread este, el primer parámetro que se le pasa cuál es y por qué
Código C:
Ver original
  1. fread(ptr_reg, sizeof(struct registro), num_registros, fich);
. Finalmente, para imprimir los registros por qué uso ptr_reg
Código C:
Ver original
  1. printf("%s\n", ptr_reg[i].nombre);
.
  #12 (permalink)  
Antiguo 18/06/2010, 18:03
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: mostrar datos de un fichero binario por pantalla

ok, tratare de explicarte brevemente, aunque te recomiendo k leas lago de estructuras, y lectura de archivos relativos en C++.

ptr_reg es un puntero el cual se va asignar la primera posicion de un vector. Se declara al principio por dos situaciones la primera por sintaxis, acostumbrate a declarar todas o casi todas las variables que vayas a utilizar al inicio de una funcion(si main tambien es una funcion). y otra es por que no la puedes declarar dentro del {} que corresponde al else. ya que este apuntador solo puede ser utilizado dentro de los parentesis. puedes leer algo acerca del acance de las variable(http://www.modelo.edu.mx/univ/virtec...rac/cplus2.htm leete esto )

El por que es el primer parametro que se pasa en esta función. deberías de buscar en internet o en alguna otra fuente el uso de esta función.

El por utilizas pt_reg, cuando llamas a la funcion fread, los registos se almacenan en el vector al que aputnte este puntero.
  #13 (permalink)  
Antiguo 19/06/2010, 11:21
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: mostrar datos de un fichero binario por pantalla

Hola, quiero hacer el mismo ejercicio, pero usando la función calloc, puesto que ya sé de antemano cuántos registros voy a introducir, pero me da error: En la función ‘main’:
leer_fich_bin.c:50: error: expected expression before ‘)’ token

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define TAM 4
  6.  
  7. struct registro{
  8.    char nombre[50];
  9.    char edad[3];
  10. };
  11.  
  12.  
  13. int   main ()
  14.    {
  15.       FILE *fich;
  16.       char op;
  17.       int i;
  18.       struct registro datos;
  19.       struct registro *ptr_reg;
  20.        
  21.  
  22.      
  23.       /* Escritura del float en el fichero */
  24.       if ((fich = fopen ("cadenas.dat", "wb")) == NULL)
  25.          {
  26.          printf ("Error de creación del fichero\n");
  27.          
  28.          }
  29.        else{
  30.           do{
  31.            printf("Introduce una cadena: ");
  32.            scanf("%49s",datos.nombre);
  33.            printf("Edad: ");
  34.            scanf("%2s",datos.edad);
  35.            fwrite (&datos, sizeof (datos), 1, fich);
  36.            printf("¿Otro? (s/n)");
  37.            scanf("%1s",&op);
  38.           }while((op == 's') || (op == 'S'));
  39.        }
  40.        fclose (fich);
  41.  
  42.        /* Lectura del float del fichero */
  43.              
  44.       if ((fich = fopen ("cadenas.dat", "rb")) == NULL)
  45.          {
  46.          printf ("Error de existencia del fichero\n");
  47.          
  48.          }
  49.       else{
  50.            ptr_reg = (datos *)calloc(TAM,sizeof(datos));
  51.            fread(ptr_reg, sizeof(struct registro), TAM, fich);
  52.       }
  53.       fclose (fich);
  54.      
  55.      
  56.       for(i = 0; i < TAM; i++)
  57.            printf("%s %s\n", ptr_reg[i].nombre,ptr_reg[i].edad);
  58.            
  59. }
  #14 (permalink)  
Antiguo 19/06/2010, 13:27
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: mostrar datos de un fichero binario por pantalla

debes entender bien como es que se utilizan estas funciones, C a diferencia de C++ es un poco mas laborioso.

la forma correcta es:
ptr_reg = (struct registro*)calloc(TAM,sizeof(datos));

cuando no entidas una funcion, trata de buscarle aun cuando te tardes horas al principio al final veras que podras resolver problemas mas complejos y por ti...

Etiquetas: binario, fichero, pantalla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:20.