Ir al contenido


Foto

Eliminar registros en casada en C


  • Por favor identifícate para responder
4 respuestas en este tema

#1 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 20 junio 2012 - 06:57

Hola como están!

Les quiero realizar la siguiente consulta.

Tengo un archivo en el que guardo los datos de equipos y otro archivo en el que guardo los datos de jugadores.

Para jugadores tengo realizada la alta, baja y modificación sin problemas.

En el caso de equipos me esta dando problemas.
Puedo dar de baja al equipo sin inconvenientes pero el el problema se presenta cuando intento dar de baja a los jugadores que tiene asociado ese equipo.

En la estructura jugador tengo un miembro "jugador.codigoequipo" que la relaciono con el miembro "equipo.codigoequipo"

Estuve probando el siguiente código y entra en un ciclo infinito, es decir nunca sale del while


cpp
  1. fread(&jugador, sizeof(struct jugadores), 1, archivo);               
  2. while (!feof(archivo))
  3.         {                 
  4.           if (jugador.codigoequipo==codigoequipo)
  5.             {                         
  6.             jugador.borrado=-1;
  7.             fseek(archivo, sizeof(struct jugadores)*(ftell(archivo)/(sizeof(struct jugadores))-1), 0);                         
  8.             fwrite(&jugador, sizeof(struct jugadores), 1, archivo);                                                 
  9.             }               
  10.           else
  11.             {                         
  12.               fread(&jugador, sizeof(struct jugadores), 1, archivo);
  13.               }
  14.         }

Lo que note es que el campo "jugador.codigoequipo" toma el valor "1" y no llega a tomar otro valor, por ejemplo "2" que es el codigo de otro equipo que tiene otro jugador que esta cargado en el archivo.

La variable "codigoequipo" tiene bien su valor, que es "1" por ejemplo y por eso siempre compara "1==1" y se queda ciclando infinitamente, necesitaria que el registro avance.

Gracias por la ayuda!
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 20 junio 2012 - 06:11

No se exactamente que necesitas hacer ni como. No se si estás obligado a usar C puro o C++. Tampoco entiendo porqué realizas directamente las operaciones en disco. Si puedes usar C++ lo mejor es hacer una clase para los jugadores y otra para equipos. Te creas algo parecido a una base de datos con sus funciones de insertar, borrar, asociar, leer del disco y escribir.

En C puro también es factible pero quizás sea mejor crear arrays de estructuras registro, para trabajar en memoria y reservar las lecturas y volcados a disco sólo cuando sea necesario. Es mas sencillo y rápido leer de un tirón o escribir que ir dato a dato directamente.

Todo depende de las ataduras que tengas.

Tu código está demasiado aislado y sin las definiciones de las estructuras con las que trabajas. Deberías colocarlo en una función independiente que se llame algo como "BorraElemento(char* Jugador)". Sin analizar demasiado el código, es posible que precise un flush.

Bueno, organiza tus ideas, necesidades y herramientas antes de escribir.  :)


Saludos.
  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 20 junio 2012 - 08:31

Hola,
escafandra, este hilo está relacionado con este otro. Creo que con eso te haces una mejor idea  ;)

Saludos,
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 21 junio 2012 - 06:26

escafandra, este hilo está relacionado con este otro. Creo que con eso te haces una mejor idea  ;)


Lo que pretende lo entiendo, lo que no entiendo es el "cómo".

No se las limitaciones en el uso del lenguaje que le imponen o se impone. Es por eso que comentaba el posible uso de C++ o no, para aprovechar las clases pues este tipo de problema se soluciona mejor con POO simulando una base de datos. En otro caso con arrays a estructuras y manejo en memoria de los mismos.

El uso de las funciones de archivo ANSI C con stream me hace pensar que quizás es una tarea o ejercicio "escolar" y que no tiene mucha libertad de movimiento. Y el código que expone queda inconexo, sin conocer a fondo las estructuras que usa.


Saludos.
  • 0

#5 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 25 junio 2012 - 01:23

Gracias por las respuestas! Y perdon por la tardanza en responder...

El problema que tenia era que no estaba manejando bien las funciones de archivos.

Me estaba faltando posicionarme en el registro anterior para poder recien realizar la modificacion. Lo solucione agregando..

[c]fseek(archivo, sizeof(struct jugadores)*(-1L), 1)[/c]

Ahora tengo otro problema y no se si crear un nuevo tema o consultarlo aqui.

El tema es que quiero modificar algunos campos de todos los registros de equipos.

Estos son puntos, partidos ganados, partidos perdidos y partidos empatados.
Crei que con solo recorrer el archivo y modificar como lo habia hecho anteriormente me saldria pero entra en un ciclo infinito, dejo el codigo que tengo...

   
cpp
  1.     fread(&equipo, sizeof(struct equipos), 1, archivoequipos);         
  2.     while (!feof(archivoequipos))
  3.           { 
  4.           fseek(archivoequipos, sizeof(struct equipos)*(-1L), 1);
  5.           fread(&equipo, sizeof(struct equipos), 1, archivoequipos);         
  6.           equipo.puntos=0;
  7.           equipo.partidosempatados=0;
  8.           equipo.partidosganados=0;
  9.           equipo.partidosperdidos=0;         
  10.           fseek(archivoequipos, sizeof(struct equipos)*(-1L), 1);
  11.           fwrite(&equipo, sizeof(struct equipos), 1, archivoequipos);         
  12.           }

 

Crei que despues de ejecutar esto, todos los registros quedarian modificados pero como dije, se queda en un ciclo infinito, nunca llega a fin de archivo?

Saludos!
  • 0




IP.Board spam blocked by CleanTalk.