Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: the_jocker en 11 Agosto 2012, 20:49 pm



Título: Problema al leer un archivo binario en C
Publicado por: the_jocker en 11 Agosto 2012, 20:49 pm
Buenas, estupendo foro, no hace mucho plantee una duda sobre un programa que quería hacer, como hace poco me desocuparon del trabajo(para no decir echaron), me dispuse a terminarlo, no sabia nada de estructura pero ahora me defiendo, yo creo un archivo y escribo en él, funciona perfecto, hago una consulta, de nuevo perfecto, pero cuando quiero que me tire datos en masa, osea que imprima por pantalla todos los datos, me salen caracteres raros como si el problema fuera de lectura.

Código
  1. void MOSTRAR_ARTICULOS()
  2. {
  3. FILE *stock;
  4.  
  5. struct articulos
  6. {
  7. int codigo;
  8. char art[50];
  9. int cantidad;
  10. float precio;
  11. }datos;
  12.  
  13. stock = fopen("Stock.in","rb");
  14. fread(&datos,sizeof(datos),1,stock);
  15. printf("\n_______________________________________________________");
  16. printf("\n%-12s%-18s%-10s%-10s","Codigo","Articulo","Cantidad",
  17. "Precio");
  18. while(!feof(stock))
  19. {
  20. printf("\n%-12d%-18s%-10d%10.2f",datos.codigo,datos.art,
  21. datos.cantidad,datos.precio);
  22. fread(&datos,sizeof(datos),1,stock);
  23. }
  24. printf("\n______________________________________________________\n");
  25. fclose(stock);
  26. system("read -p'Presione Enter para Continuar' var");
  27. system("clear");
  28. }
  29.  

Y si yo ingrese 10 productos lo da a los 10 pero con caracteres raros. Ya intente soluciones:
-Cambiar la extensión del archivo, primero era .dat, ahora en .in.
-Lo que vi yo era que la imagen del archivo guardado se asemeja más a una foto que a un archivo binario.     


Título: Re: Problema al leer un archivo binario en C
Publicado por: Khronos14 en 11 Agosto 2012, 21:20 pm
Define datos de esta forma y fuera de la función:

Código
  1. typedef struct articulos
  2. {
  3. int codigo;
  4. char art[50];
  5. int cantidad;
  6. float precio;
  7. }datos __attribute__ ((packed));
  8.  

Saludos.


Título: Re: Problema al leer un archivo binario en C
Publicado por: the_jocker en 11 Agosto 2012, 22:16 pm
Si, genial, ahora porque desde afuera funciona bien, y desde la misma función no,es más, hasta se me colorea la sintaxis de la estructura, que groso.

Edito:

Ya logre asignar valores desde una estructura hacia otra, pero no completa, yo tengo una estructura y otra de la misma caracteristica, a la segunda le debo modificar algo, entonces saco los valores y los asigo asi:

Código
  1. subtotal = y * datos.precio;
  2. datos_ventas.codigo_ventas = datos.codigo;
  3. datos_ventas.cantidad_ventas = y;
  4. datos_ventas.articulo_ventas = datos.articulo;
  5. datos_ventas.precio_ventas = datos.precio;
  6. datos_ventas.total = datos_ventas.total + subtotal;
  7. fwrite(&datos_ventas,sizeof(struct ventas),1,ventas_cont);
  8.  
Se escriben bien salvo la cuarta linea, que me dice que no puedo asignar char[50] a otro de tipo char * y no entiendo si articulo_ventas y articulo son de tipo char[50]


Título: Re: Problema al leer un archivo binario en C
Publicado por: rir3760 en 12 Agosto 2012, 00:51 am
En C no puedes utilizar el operador de asignación "=" con arrays, en su lugar debes utilizar la función "strcpy" (prototipo en <string.h>).

Un saludo


Título: Re: Problema al leer un archivo binario en C
Publicado por: the_jocker en 12 Agosto 2012, 17:42 pm
Gracias pude resolver mi problema, cunado esté terminado el programa, lo voy compartir para que los que se inicien en C puedan ver que con poco se puede hacer mucho.Gracias.


Título: Re: Problema al leer un archivo binario en C
Publicado por: CSQCasimiro en 13 Agosto 2012, 01:37 am
acordarte también, que si vas a sacar todos los datos del archivo de una, tenes que saber la cantidad de registros que contiene y almacenarlo en un vector de la estructura. osea, si yo tengo 5 registros del tipo de estructura "fulano" , al sacarlos de una debería hacer el sizeof de fulano y al siguiente parámetro ponerle 5 en vez de 1, y lo otro que te quería agregar, es que vos al archivo le podes poner la extensión que se te cante, ya sea .dat o .fulanoestuboaquiescribiendoextenciones