Problema al leer un archivo binario en C

Iniciado por the_jocker, 11 Agosto 2012, 20:49 PM

0 Miembros y 1 Visitante están viendo este tema.

the_jocker

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.


void MOSTRAR_ARTICULOS()
{
FILE *stock;

struct articulos
{
int codigo;
char art[50];
int cantidad;
float precio;
}datos;

stock = fopen("Stock.in","rb");
fread(&datos,sizeof(datos),1,stock);
printf("\n_______________________________________________________");
printf("\n%-12s%-18s%-10s%-10s","Codigo","Articulo","Cantidad",
"Precio");
while(!feof(stock))
{
printf("\n%-12d%-18s%-10d%10.2f",datos.codigo,datos.art,
datos.cantidad,datos.precio);
fread(&datos,sizeof(datos),1,stock);
}
printf("\n______________________________________________________\n");
fclose(stock);
system("read -p'Presione Enter para Continuar' var");
system("clear");
}


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.     

Khronos14

Define datos de esta forma y fuera de la función:


typedef struct articulos
{
int codigo;
char art[50];
int cantidad;
float precio;
}datos __attribute__ ((packed));


Saludos.

the_jocker

#2
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:


subtotal = y * datos.precio;
datos_ventas.codigo_ventas = datos.codigo;
datos_ventas.cantidad_ventas = y;
datos_ventas.articulo_ventas = datos.articulo;
datos_ventas.precio_ventas = datos.precio;
datos_ventas.total = datos_ventas.total + subtotal;
fwrite(&datos_ventas,sizeof(struct ventas),1,ventas_cont);

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]

rir3760

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
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

the_jocker

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.

CSQCasimiro

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
"Mejora el Algoritmo, no el Código"
"Buscando todos los días ser mejor que ayer"