Home   Artículos   Recursos   Foros   
Artíclos recientes publicados en Latindevelopers:

Visual C++: NSDoubleEdit: Un control para el manejo de números decimales en Visual C++.
Visual C++: Implementando una Calculadora en Visual C++
Visual C++: CCommandLine: Una clase para el uso de la linea de comando
Visual C++: Una clase para el manejo del Registro


Problema estructuras en archivos binarios

Aqui programadores en la plataforma Win32 con Visual C++ de Microsoft...

Moderador: latindeveloper

Problema estructuras en archivos binarios

Notapor peugeot206 el Mié Nov 07, 2007 9:04 pm

Gente estoy teniendo un problema con una estructura. Cuando intento grabarla en un archivo binario va modificando su tamaño a medida que se le agregan registros. Aviso que uso la consola y no objetos, o sea Archivos .CPP

Código: Seleccionar todo
typedef struct
{
   char talle[2];
   char descripcion[20];
   float valor;
   int codart;
   int stockact;
   int codrubro;
   int activo;
   int codmarca;
}articulo;


Esta es la estructura que tengo creada para el articulo.

arcarticulos=fopen("articulos.dat","a");
fwrite(&auxart,sizeof(articulo),1,arcarticulos);

De esta forma hago que se vaya agregando al archivo binario, al final del mismo.

Ahora por alguna razon, cada vez que se envia informacion algo pasa.
Al comienzo cuando se graba 1 sola estructura son 49bytes, pero cuando se le agrega otra mas pasan a ser 98bytes, para cuando se agrega una 3ra pasan a ser 146.

Lo cual no me permite despues del segundo elemento buscar los siguientes sin hacer un toqueteo asqueroso en el codigo para que encuentre registro por registro casi manualmente.

Alguien sabe que sucede? o si esto es normal y como se puede arreglar?
peugeot206
Novato
Novato
 
Mensajes: 5
Registrado: Mié Nov 07, 2007 8:54 pm

Notapor peugeot206 el Mié Nov 07, 2007 9:05 pm

ACA DEJO TODO EL CODIGO A VER SI PUEDE ALGUIEN AYUDARME YA QUE MAÑANA TENGO QUE ENTREGARLO Y ESTO ME TIENE LOCO DESDE EL DOMINGO.

Código: Seleccionar todo
#include <stdio.h>
#include "Consola.h"
#include <Conio.h>
#include <fstream.h>
#include <dos.h>
#include <windows.h>
#include <string.h>
#include <io.h>

typedef struct
{
   char talle[4];
   char descripcion[20];
   float valor;
   int codart;
   int stockact;
   int codrubro;
   int activo;
   int codmarca;
}articulo;


void main (void)
{

   FILE *arcarticulos;
   articulo auxart;
   int conf=0,oks=0,maxarc=0,codigo;
   bool grabar=true,salir=false;
   do
   {
      clrscr();
      printf("\t\t\t\tMENU ARTICULOS\n");
      printf("\t\t\t\tALTA ARTICULOS\n");
      if ((arcarticulos=fopen("articulos.dat","r"))!=NULL)
      {
         fseek( arcarticulos,0,SEEK_END);
         maxarc=ftell(arcarticulos);
         codigo=((maxarc)/(sizeof(articulo)))+1;
         fclose(arcarticulos);
      }
      else
         codigo=1;
      printf("\nCodigo de Articulo: %d",codigo);
      printf("\nDescripcion: ");
      fflush(stdin);
      gets(auxart.descripcion);
      printf("\nTalle: ");
      fflush(stdin);
      gets(auxart.talle);
      printf("\nCodigo Rubro: ");
      scanf("%d",&auxart.codrubro);   
      printf("\nCodigo Marca: ");
      scanf("%d",&auxart.codmarca);
      printf("\nStock: ");
      scanf("%d",&auxart.stockact);
      printf("\nPrecio Unitario: ");
      scanf("%5.2f",&auxart.valor);
      arcarticulos=fopen("articulos.dat","a");
      auxart.activo=1;
      auxart.codart=codigo;
      fwrite(&auxart,sizeof(articulo),1,arcarticulos);
      fclose(arcarticulos);
   }while(!salir);
   fflush(stdin);

}
peugeot206
Novato
Novato
 
Mensajes: 5
Registrado: Mié Nov 07, 2007 8:54 pm

Re: Problema estructuras en archivos binarios

Notapor ivancp el Jue Nov 08, 2007 6:52 pm

hola,

Lo que acabas de describir es el comportamiento "normal" al momento de guardar registros en archivos.

Entiendo que: lo que quieres es buscar un registro específico, para ello puedes utilizar el metodo ISAM de almacenamiento/recuperacion de archivos:

en este post esta la idea fundamental: http://www.latindevelopers.com/forum/vi ... .2632.html

Tambien en: http://es.wikipedia.org/wiki/ISAM
ivancp
Programador Experimentado
Programador Experimentado
 
Mensajes: 301
Registrado: Jue Sep 06, 2007 12:57 pm

Notapor peugeot206 el Jue Nov 08, 2007 7:41 pm

Ivan sucede que lo que tu planteas no es justamente lo que necesito. Yo por el momento estoy trabajando con Consola y no con bases de datos.

Sino que son archivos binarios creados por el programa con la funcion

fwrite(registro a agregar, tamaño del registro, cantidad de registros, puntero al archivo)

sucede que en lo que es el tamaño del registro eso por alguna razon que ni mi profesor el dia de hoy pudo descifrar, porque el codigo esta bien, se va modificando cada vez que se agregan registros.

Ahora lo que hemos encontrado es que cuando agrego la DESCRIPCION del articulo y esta es mas cort que la ingresada anteriormente se almacenan los caracteres de la otra palabra.
EJ
Guardo Registro 1: Pantalon Verde
Guardo Registro 2: Buzo Verde

y cuando almacena el segundo registro aparece "Buzo Verdeerde

y linpio siempre el buffer con FFLUSH, como me han explicado. Si alguien mas me ayuda a entender este comportamiento extraño lo agradeceria.

Les recuerdo que es para Visual C++ CONSOLA
peugeot206
Novato
Novato
 
Mensajes: 5
Registrado: Mié Nov 07, 2007 8:54 pm

Notapor peugeot206 el Dom Nov 18, 2007 11:29 am

Les pido por facvor si alguien mas puede ver que se genere algun problema, porque nose que esta generando esto, ya que desarme la estructura articulos por completo, la separe en 5 estructuras diferentes y sigue generando el mismo error.

Mas por consejo del profesor, cree procedimientos aparte para guardar la estructura para leerla y que solo se maneje de 1 archivo por vez en cada procedimiento asi no hay problemas....

Alguien que sepa que sucede, porque el problema que se me esta generando ahora es el siguiente:

Cargo 8 articulos y se carga perfecto, ahora cuando carga el articulo 9, no lo guarda como corresponde, es como que la deja abierta o incompleta a la estructura, y recien la cierra cuando uno graba el articulo 10.
Entonces uno puede leer sin problemas hasta el 9 pero cuando busca el 10 y siguiente ya esta erronea la estructura del archivo.

a alguien le paso esto alguna vez?
alguna respuesta o idea de que sucede?

el que quiera el codigo completo del programa me lo pide y se lo envio... pero necesito su ayuda, me dieron plazo hasta el proximo jueves y sino perdere la materia por un puto compilador del orto del tio bill
peugeot206
Novato
Novato
 
Mensajes: 5
Registrado: Mié Nov 07, 2007 8:54 pm

Problema encontrado.

Notapor ivancp el Lun Nov 19, 2007 10:37 am

Hola otra vez

peugeot206 escribió:Guardo Registro 1: Pantalon Verde
Guardo Registro 2: Buzo Verde
y cuando almacena el segundo registro aparece "Buzo Verdeerde


lo que sucede es que estas utilizando una sola variable para guardar tu estructura:

articulo auxart;

Entonces cuando obtienes por primera vez "Pantalon Verde", a la siguiente vez sigue el puntero activo. Para solucionar el problema te recomiendo que cambies la linea:

Código: Seleccionar todo
gets(auxart.descripcion);


por:

Código: Seleccionar todo
char auxdescripcion[20];
gets(auxdescripcion);
strcpy(auxart.descripcion,auxdescripcion);


Y listo. Ahora cada vez que ingrese una nueva descripcion la variable estará limpia.


Por otro lado:
peugeot206 escribió:Cargo 8 articulos y se carga perfecto, ahora cuando carga el articulo 9, no lo guarda como corresponde, es como que la deja abierta o incompleta a la estructura, y recien la cierra cuando uno graba el articulo 10.
Entonces uno puede leer sin problemas hasta el 9 pero cuando busca el 10 y siguiente ya esta erronea la estructura del archivo.


No entiendo bien la pregunta, por que al decir "Cargo 8 articulos" te refieres a guardar o a abrir los registros de la base de datos. Cuando dices "guarda como corresponde" , podrías decirnos tambien que es lo que te hace pensar que no guarda, algun registro con basura?, cadenas incopletas?... ¿?

Saludos.
ivancp
Programador Experimentado
Programador Experimentado
 
Mensajes: 301
Registrado: Jue Sep 06, 2007 12:57 pm

Notapor peugeot206 el Lun Nov 19, 2007 1:04 pm

Explico un poco que paso y que hice para tratar de detectar el problema.

Como dije cada articulo deportivo tiene un Codigo de Rubro (codrub), un codigo de marca (codmarca), un codigo de articulo (codart), una descripcion, un stock, un valor y un estado (activo o eliminado).

Sucede que el primer problema de sobreposicion de nombres lo soluciones ya anteriormente como tu me lo planteas ahora. Pero el problema que contiua sucediendome es el siguiente.

Yo voy generando articulos nuevos y almacenando de a uno en el archivo de articulos, hasta ahi todo bien.
Ahora sucede que cuando grabo el articulo nro 9 (sea indistinto cual fuere, dado que tengo una lista de articulos y he probado intercambiarlos y sucede siempre lo mismo con el 9) no se cierra o no almacena por alguna razon el codigo del articulo.
Se preguntaran como lo se, facil abro el archivo binario y analizo una a una las estructuras que va guardando y cuando guarda el articulo 9 falta la parte del codigo de articulo, INT codart, y recien cuando guarda el 10mo articulo, guarda el codigo del 9, despues el articulo 10 y luego cierra el archivo, esto genera que cuando quiero leer el articulo 9 no haya problemas y lee bien, pero cuando intento leer el 10 o los siguiente esta desfasado por un byte.
Porque por un byte, porque la estructura tiene un tamaño de 48 bytes, al llegar a la 10ma estructura uno debe de suponer que son 480bytes que almacena, pues no, aparecen 479 bytes vaya uno a saber porque...

ese es el problema que no puedo solucionar, y lo peor de todo es que el profesor ha comparado el codigo con el de otro alumno de otra institucion que tiene el mismo ejercicio que yo y con el de alumnos que lo realizaron en años anteriores y son exactamente iguales, lo unico que los diferencia es la forma de pedir datos EJEMPLO: yo pongo printf("Ingrese el Codigo del rubro"); y ellos printf("ponga el rubro);
eso es lo mas extraño de todo, si quieres te paso el codigo entero de la carga de articulos para que lo analices y veas lo que digo.
peugeot206
Novato
Novato
 
Mensajes: 5
Registrado: Mié Nov 07, 2007 8:54 pm


Volver a Visual C++

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados