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

GraBaR LisTa eNLaZaDa a FiCheRo

Estas en el tema de GraBaR LisTa eNLaZaDa a FiCheRo en el foro de C/C++ en Foros del Web. Ola!! Estoy acabando un proyecyo en la universidad y me estoy volviendo loco... he intentado de muchas maneras grabar una lista enlazada en un fichero, ...
  #1 (permalink)  
Antiguo 14/03/2008, 16:04
 
Fecha de Ingreso: marzo-2008
Mensajes: 3
Antigüedad: 16 años, 2 meses
Puntos: 0
GraBaR LisTa eNLaZaDa a FiCheRo

Ola!! Estoy acabando un proyecyo en la universidad y me estoy volviendo loco... he intentado de muchas maneras grabar una lista enlazada en un fichero, para posteriormente cargarla en algun nuevo inicio del programa pero no hay manera... Trabajo sobre Linux(ubuntu) y programo en C. Dejo parte del programa.

Código:
struct datos
{
	int codigo;
	char nombre[10];
};		// Estructura que define los datos a manejar por el programa

struct nodo
{
	struct datos dato;
   struct nodo *sig;
};

struct nodo * introducir( struct nodo *cabeza);
int menu();
void listar(struct nodo *cabeza);

void main ()
{
	struct nodo *primero=NULL;
   int opc;

   do
   {
   opc=menu();
   switch(opc)
   {
   	case 1:
         primero=introducir(primero);
      	break;
      case 2:
         listar(primero);
      	break;
   }
   }while(opc!=3);
}

int menu()
{
   int opcion;

	do
   {
		system("cls");
		printf("\n\n\t\tMeNu\n");
   	printf("\n\t1.- ReGisTraR uNa VeNTa.");
   	printf("\n\t2.- LiSTar.");
      printf("\n\t3.- SaLiR.");
      printf("\n\n\t\tIntroDuzCa uNa oPCioN... ");
   	scanf("%d",&opcion);
      if(opcion<=0 || opcion>3)
      	printf("\n\n\tMEEEEEC. 3RR0R");
   }while(opcion<=0 || opcion>3);

   return opcion;
}

struct nodo *introducir( struct nodo *cabeza)
{
	struct nodo *aux=cabeza;
   struct nodo *paux;

   aux=(struct nodo *)malloc(sizeof(struct nodo));
   if(aux==NULL)
   	exit(-1);

   aux->sig=NULL;

   printf("\nCoDiGo... ");
   scanf("%d",&aux->dato.codigo);
   fflush(stdin);
   printf("\nNomBre... ");
   scanf("%10[^\n]", &aux->dato.nombre);

   if(cabeza==NULL)
   	cabeza=aux;
	else
   {
   	paux=cabeza;
      while(paux->sig!=NULL)
      {
      	paux=paux->sig;
      }
      paux->sig=aux;
   }

return cabeza;
}

void listar(struct nodo *cabeza)
{
   struct nodo *paux;  // --> Se crea puntero auxiliar

   paux=cabeza; // --> Se igualan ambos. Esto se hace para recorrer con el
                // puntero y no el parametro cabeza.

   /*( Proceso... Como recorrer un puntero)*/

   while(paux!=NULL)
   {
      //(1). Si puntero aux es != nuLL...
      // Visualizo los datos de la venta registrados en el nodo paux

		printf("\n\n\t...ProDuCTo...\n\n");
      printf("\nCoDiGo.... %d",(paux->dato).codigo);
      printf("\nNoMBre.. %s",(paux->dato).nombre);

      //(2). Avanzo un nodo...
      paux=paux->sig;
   }
   return;
}
Seria crear una nueva funcion que reciba la estructura y que la guarde, no enviaria nada, seria void, puesto que ya acabaria el programa y esta solo se efectuaria a la salida!! Espero alguna ayudita jeje, gracias de todas formas.
Saludos
  #2 (permalink)  
Antiguo 14/03/2008, 18:33
Avatar de Mephisto  
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 18 años, 4 meses
Puntos: 3
Re: GraBaR LisTa eNLaZaDa a FiCheRo

Espero te ayude algo como esto...

stpRegFile es un apuntador a un archivo
E_stpRegArch es una estructura de tipo stRegFile

fseek(stpRegFile,iCount*(sizeof(stRegArch)+2),SEEK _SET);//Ubica la posicion en el archivo donde escribira
fwrite(E_stpRegArch,sizeof(stRegArch),1,stpRegFile );//Escribe en el archivo
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...
  #3 (permalink)  
Antiguo 15/03/2008, 05:22
 
Fecha de Ingreso: marzo-2008
Mensajes: 3
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: GraBaR LisTa eNLaZaDa a FiCheRo

Utilizar lseek? Jeje, buf, alguna vez lo e utilizado sobre todo para buscar caednas y comparar pero nunca para grabar una lista enlazada. Lo intentare!! Gracias. De mientras si alguien tiene alguna sugerencia para grabar mis nodos en un fichero, como "backup"... yo habia pensado en esto, pero no me funciona,admito sugerencias!!! :P:P

Código:
void guardar(struct Tnodo *primero)
{
   int df; // descriptor de fichero
   struct nodo *pact=NULL, *pant=NULL;

   pant=pact=primero;

   df=fopen("editor_texto.txt","O_CREAT | O_WRONLY ");

   if(df==-1)
   {
   	printf("\nErroRRRR de aPerTura FiCheRo");
      getch();
      exit(0);
   }
   else
   {
         // Aqui grabariamos el nodo!!
   	pact=primero;
      while(pact!=NULL)
      {
                // write ( descriptor de fichero, cadena o int a grabar, longitud )
      	write(df, &(pact->dato),sizeof(pact->dato));
         pact=pact->sigi;
      }
   }

   close(df);
   printf("\nDaTs GuaRDaDoS\n");
}
Pero el caso es que no m funciona!! Alguien sabe que tengo mal??? Muchas gracias Mephisto por su respuesta!! fue de gran ayuda!! :P
  #4 (permalink)  
Antiguo 18/03/2008, 12:06
Avatar de Mephisto  
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 18 años, 4 meses
Puntos: 3
Re: GraBaR LisTa eNLaZaDa a FiCheRo

Bueno, lo del fseek, solo es para colocar la posición del archivo donde vas a escribir por que en el codigo donde lo utilice actualizaba el archivo, pero en tu caso, sería siempre al final del archivo por lo que seria
fseek(df,0L,SEEK_END);

Por otro lado, la referencia que haces en el write pudiese ser el problema, pudieras intentar
write(df,&(pact->dato),sizeof(datos));

siempre que uses sizeof() utiliza el tipo de dato y no la variable definida. Otra cosa, de manera persona en vez de utilizar la estructura datos y despues definirla en la estructura nodo, emplearia una sola estructura y te evitas problemas de referencias... =D
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...
  #5 (permalink)  
Antiguo 18/03/2008, 15:41
 
Fecha de Ingreso: marzo-2008
Mensajes: 3
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: GraBaR LisTa eNLaZaDa a FiCheRo

Despues de 4 dias jeje, encontre el error en la definicion del write!!!

Código:
      	write(df, &pact->dato,sizeof(struct dato));
Y asi me funciono!! Consegui imprimir todos los datos del nodo, para que cuando el programa se iniciase se cargase sobre lo escrito en el fichero. Muchas muchas gracias Mephisto!!!!! De gran ayuda! Y para el que le sirva lo posteo
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:08.