elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Insertar datos en Archivo Binario
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Insertar datos en Archivo Binario  (Leído 5,302 veces)
willy1855

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Insertar datos en Archivo Binario
« en: 16 Abril 2012, 00:33 am »

Hola a todos, soy nuevo programando C/C++ y en este foro pero leo los temas y me han ayudado bastante pero ahora quisiera pedirles ayuda, nos dejaron un proyecto en la escuela les detallo a continuacion cual es mi problema:

Tengo un archivo de texto con contenido mas o menos asi:
cargar(P001CGL,golpes en bumper frontal,1999,azul)
encontrar(P904DCL)
mostrar

y asi se repite unas 20 lineas y con diferentes datos

tengo que hacer que mi programa corte linea por linea y cada vez que encuentre la palabra CARGAR o MOSTRAR o ENCONTRAR o ELIMINAR cree un archivo binario e inserte los datos también tengo que crear otro archivo donde este ordenado por un indice. hice un codigo pero no me escribe nada en los archivos si alguien me puede ayudar..
Gracias..
Espero haberme explicado y les dejo mi codigo por si alguien me puede ayudar.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <fstream.h>
#include <ctype.h>

struct regv
{
char placa[10];
char descripcion[100];
char modelo[5];
char color[20];
}vehiculo;

struct regvehiculo
{
struct regv vehiculo;
}regmaestro[3];

struct auxiliar
{
char placa[10];
char descripcion[100];
char modelo[5];
char color[20];
char eliminar[1];
}aux;

struct index
   {
   char placa[7];
   int poss;
   }ind;


FILE *entrada;
FILE *salida;
FILE *procesos;
FILE *indice;

char linea[100];
char linea2[100];
char linea3[100];
char c[1];
int pos=0;
int pos1=0;

void leer()
{
   int d;
   entrada = fopen ("vehiculos.txt", "r");
   if (entrada==NULL)
{
    cout<<"Error al abrir el archivo \n";
}
else
{
   cout<<"Leyendo Archivo...";
}
   salida = fopen ("maestro.txt", "w+");
   while ( (d = fgetc(entrada)) != EOF)
   {
      fputc(d, salida);
   }
fclose(salida);
}

//proceso = fopen("registro.txt","w+");

//cortara el archivo...
void cortar()
{

int a=0,b=1,opc=0;

strcpy(linea3,"");
strcpy(vehiculo.placa,"");
strcpy(vehiculo.descripcion,"");
strcpy(vehiculo.modelo,"");
strcpy(vehiculo.color,"");

fgets(linea,100,entrada);

while(a<strlen(linea))
{
   if(linea[a]!='(')
   {
      c[0]=linea[a];
      strcat(linea3,c);
      a++;
   }
   else
   {
      a=strlen(linea);
   }
}//fin de while
while(b<strlen(linea))
{
   if(linea!=')')
   {
      if(linea!=',')
      {
         c[0]=linea;
         strcat(linea2,c);
         b++;
      }
   else
   {
   opc++;
   switch(opc)
      {
         case 1:    strcpy(regmaestro[pos].vehiculo.placa,linea2);
                  strcpy(linea2, " ");
                  break;

         case 2:   strcpy(regmaestro[pos].vehiculo.descripcion,linea2);
                  strcpy(linea2," ");
                  break;

         case 3:   strcpy(regmaestro[pos].vehiculo.modelo,linea2);
                  strcpy(linea2," ");
                  break;

      }//switch
   }//else
   }//if
   else
   {
      strcpy(regmaestro[pos].vehiculo.color,linea2);
      strcpy(linea2," ");
      break;
   }
}//fin de while
}

//ordena los datos del archivo
void ordenar()
{
for(int i=0;i<2;i++)
{
   for(int j=i+1;j<=3;i++)
   {
      strcpy(aux.placa," ");
      strcpy(aux.descripcion," ");
      strcpy(aux.modelo," ");
      strcpy(aux.color," ");
      if(strcmp(regmaestro.vehiculo.placa, regmaestro[j].vehiculo.placa)>0)
         {
         strcpy(aux.placa, regmaestro[j].vehiculo.placa);
         strcpy(aux.descripcion, regmaestro[j].vehiculo.descripcion);
         strcpy(aux.modelo, regmaestro[j].vehiculo.modelo);
         strcpy(aux.color, regmaestro[j].vehiculo.color);

         strcpy(regmaestro[j].vehiculo.placa," ");
         strcpy(regmaestro[j].vehiculo.descripcion," ");
         strcpy(regmaestro[j].vehiculo.modelo," ");
         strcpy(regmaestro[j].vehiculo.color," ");

         //posicion 1...
         strcpy(regmaestro[j].vehiculo.placa, regmaestro.vehiculo.placa);
         strcpy(regmaestro[j].vehiculo.descripcion, regmaestro.vehiculo.descripcion);
         strcpy(regmaestro[j].vehiculo.modelo, regmaestro.vehiculo.modelo);
         strcpy(regmaestro[j].vehiculo.color, regmaestro.vehiculo.color);

         strcpy(regmaestro.vehiculo.placa," ");
         strcpy(regmaestro.vehiculo.descripcion," ");
         strcpy(regmaestro.vehiculo.modelo," ");
         strcpy(regmaestro.vehiculo.color," ");

         //posicion 2...
         strcpy(regmaestro.vehiculo.placa,aux.placa);
         strcpy(regmaestro.vehiculo.descripcion,aux.placa);
         strcpy(regmaestro.vehiculo.modelo,aux.modelo);
         strcpy(regmaestro.vehiculo.color,aux.color);
         }//fin del if
   }//segundo for
}//primer for
}

//indice del archivo
void inde()
{
   strcpy(ind.placa,regmaestro[0].vehiculo.placa);
   fwrite(&ind,sizeof(index),1,indice);
   pos1++;
   ind.poss=pos1++;
   fwrite (&ind.poss,sizeof(index),0,indice);
}

void insertar()
{
indice = fopen("indice.dat", "ab+");
procesos = fopen("procesos.dat", "ab+");
pos++;

if(pos==3){
inde();
fseek (salida,0,SEEK_END);
fwrite(&regmaestro,sizeof(regv),3,procesos);
pos=0;
}

fclose(indice);
fclose(procesos);
}




void main()
{
leer();
cortar();
insertar();
fclose(procesos);
fclose(indice);

}


En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Insertar datos en Archivo Binario
« Respuesta #1 en: 16 Abril 2012, 01:25 am »

Hola! te marco algunos errores q veo, nose si son de tipeo pero lo marco igual
En la funcion cortar:
Código
  1. while(b<strlen(linea))
  2. {
  3.   if(linea!=')')
  4.   {
  5.      if(linea!=',')
  6.      {
  7.         c[0]=linea;
  8.         strcat(linea2,c);
  9.         b++;
  10.      }
Te falta los subindices del arreglo linea (linea). Tambien en la funcion ordenar te falta los subindices del arreglo regmaestro

En la funcion inde:
fwrite (&ind.poss,sizeof(index),0,indice); si pones 0 no vas a escribir nada

En la funcion insertar:
Código
  1. if(pos==3){
  2. inde();
  3. fseek (salida,0,SEEK_END);
  4. fwrite(&regmaestro,sizeof(regv),3,procesos);
  5. pos=0;
  6. }
No se guarda nada porque pos nunca es igual a 3, por lo tanto no entra al if. Por lo que vi pos vale 1

Ademas cerras dos veces los punteros indice y procesos. Lo cerras en el main y en la funcion insertar

Corregi esas cosas y contame. Saludos


En línea

Ahorrate una pregunta, lee el man
willy1855

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Insertar datos en Archivo Binario
« Respuesta #2 en: 16 Abril 2012, 03:13 am »

Hola durasno gracias por responder..
Solo con una pregunta antes de querrer hacer los cambios
me puedes explicar a que te referis con los subindices de linea y del arreglo regmaestro?

Ya elimine los cierres de punteros dobles que tenia.

Y en pos==3 lo iguale a 3 ya que a la hora que el arreglo este lleno con los 3 espacios los escriba y luego igualo otra vez pos a 0 para que vuelva a 0 cuando termine el ciclo de if o estoy mal en eso.?
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Insertar datos en Archivo Binario
« Respuesta #3 en: 16 Abril 2012, 03:58 am »

Con los subindices me refiero a que pongas los []
Tenes que hacer
Código
  1. if(linea[b][b][/b]!=')')
  2.   {
  3.      if(linea[b][b][/b]!=',')
  4.      {
  5.         c[0]=linea[b][b][/b];
  6.         strcat(linea2,c);
  7.         b++;
  8.      }

A pos solo lo incrementas una vez y es cuando llamas a la funcion insertar
En línea

Ahorrate una pregunta, lee el man
willy1855

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Insertar datos en Archivo Binario
« Respuesta #4 en: 16 Abril 2012, 04:26 am »

Mira este fue el cambio que hice

while(a<strlen(linea))
{
   if(linea[a]!='(')
   {
      c[0]=linea[a];
      strcat(linea3,c);
      a++;
   }

el subindice de linea es [a] pero me marca este error

Comparing signed and usigned values

y me sale en linea amarilla los 2 while:
While(a<strlen(linea))
while (b<strlen(linea))
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Insertar datos en Archivo Binario
« Respuesta #5 en: 16 Abril 2012, 04:45 am »

La verdad nose xq t marca ese error, igual yo te dije que el otro while estaba mal, el del )
while(b<strlen(linea))
{
   if(linea!=')')
   {
      if(linea!=',')
      {
         c[0]=linea;
         strcat(linea2,c);
         b++;
      }
En línea

Ahorrate una pregunta, lee el man
willy1855

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Insertar datos en Archivo Binario
« Respuesta #6 en: 16 Abril 2012, 04:46 am »

ya resolví el error Comparing signed and usigned values
asi lo resolvi

Citar
unsigned int a=0,b=1,opc=0;

a las variables que uso en el while ahora no me marca ningun error

pero sigue sin escribirme nada en los archivos

el fwrite quedo asi
Citar
strcpy(ind.placa,regmaestro[0].vehiculo.placa);
   pos1++;
   ind.poss=pos1++;
   fwrite (&ind.poss,sizeof(index),1,indice);
}

y el pos lo igual a 1 y no a 3.

ayuda!!!! ya no se que hacer!!! :-(
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Insertar datos en Archivo Binario
« Respuesta #7 en: 16 Abril 2012, 05:27 am »

pero tenes dos variables pos: una es "pos1" y la otra es "pos"
Vos incrementas "pos"

void insertar()
{
indice = fopen("indice.dat", "ab+");
procesos = fopen("procesos.dat", "ab+");
pos++;

if(pos==3){
inde();
fseek (salida,0,SEEK_END);
fwrite(&regmaestro,sizeof(regv),3,procesos);
pos=0;
}
En línea

Ahorrate una pregunta, lee el man
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines