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

Editar usuarios :.

Estas en el tema de Editar usuarios :. en el foro de C/C++ en Foros del Web. Saludos! Tengo una pequeña complicación con un programa en "C". Es un registro de usuarios, agrega información, los busca, etc... El problema es que al ...
  #1 (permalink)  
Antiguo 30/04/2013, 19:08
 
Fecha de Ingreso: diciembre-2012
Ubicación: Guadalajara
Mensajes: 14
Antigüedad: 12 años
Puntos: 1
Pregunta Editar usuarios :.

Saludos!

Tengo una pequeña complicación con un programa en "C".

Es un registro de usuarios, agrega información, los busca, etc...

El problema es que al editar un dato, al volver a hacer la consulta, se borra la información del registro excepto lo modificado.

Les dejo el código, mi problema es con "editar usuario" y que no se borre lo que NO se quiera modificar.


Ayuda, no se que hacer, al parecer se sobrescriben los datos...


Fragmento de código:
Cita:

void Modificar (FILE *clientzz) ///////////////////////////////////////// Modificar registro :.
{
int codigoBuscado;
int encontrado = 0;
int opcion;

FILE *clientzzx;

textcolor(LIGHTGREEN); gotoxy(3,5); cprintf("REG Modificar: ");
scanf("%d", &codigoBuscado);


textcolor(GREEN); gotoxy(60,5); cprintf("1.");
textcolor(WHITE); gotoxy(63,5); cprintf("Representante");

textcolor(GREEN); gotoxy(60,6); cprintf("2.");
textcolor(WHITE); gotoxy(63,6); cprintf("RFC");

textcolor(GREEN); gotoxy(60,7); cprintf("3.");
textcolor(WHITE); gotoxy(63,7); cprintf("Empresa");

textcolor(GREEN); gotoxy(60,8); cprintf("4.");
textcolor(WHITE); gotoxy(63,8); cprintf("Fecha Alta");

textcolor(GREEN); gotoxy(60,9); cprintf("5.");
textcolor(WHITE); gotoxy(63,9); cprintf("Servicio");

textcolor(GREEN); gotoxy(60,11); cprintf("6.");
textcolor(WHITE); gotoxy(63,11); cprintf("Total");

textcolor(GREEN); gotoxy(60,12); cprintf("7.");
textcolor(WHITE); gotoxy(63,12); cprintf("Cant. Recibida");

textcolor(LIGHTRED); gotoxy(60,14); cprintf("0.");
textcolor(WHITE); gotoxy(63,14); cprintf("Cancelar");


if ((clientzz = fopen("clientzz", "r")) == NULL)
{
printf ( "No existe registro" );
}
else
{
fread (&registro, sizeof(struct sRegistro), 1, clientzz);

while (!feof(clientzz) && (encontrado != 1))
{
if (codigoBuscado == registro.codigo)
encontrado = 1;
fread (&registro, sizeof(struct sRegistro), 1, clientzz);
}
}

fclose (clientzz);

if (encontrado == 0)
{
getchar();
sleep(1);
gotoxy(5,17); textcolor(LIGHTRED); cprintf("Registro no encontrado");
return;
}


if (encontrado == 1)
{
newregistro.newcodigo = codigoBuscado;


gotoxy(60,19);
printf("Opcion: ");
scanf("%d", &opcion);

switch(opcion)
{
case 1:
fflush(stdin);
textcolor(LIGHTGREEN); gotoxy(3,7); cprintf("Representante: ");
gets(newregistro.newNombre);
break;
case 2:
fflush(stdin);
textcolor(LIGHTGREEN); gotoxy(3,8); cprintf("RFC: ");
gets(newregistro.newRFC);
break;
case 3:
fflush(stdin);
textcolor(LIGHTGREEN); gotoxy(3,10); cprintf("Empresa: ");
gets(newregistro.newEmpresa);
break;
case 4:
fflush(stdin);
textcolor(LIGHTGREEN); gotoxy(3,11); cprintf("Fecha Alta: ");
gets(newregistro.newFecha);
break;
case 5:
fflush(stdin);
textcolor(LIGHTGREEN); gotoxy(3,13); cprintf("Servicio: ");
gets(newregistro.newServicio);
break;
case 6:
textcolor(LIGHTGREEN); gotoxy(3,13); cprintf("Total: ");
printf("$ "); scanf("%d", &newregistro.newCtotal);
break;
case 7:
textcolor(LIGHTGREEN); gotoxy(3,13); cprintf("Cant. Recibida: ");
printf("$ "); scanf("%d", &newregistro.newCrecibida);
break;
}

if ((clientzz = fopen("clientzz", "r")) == NULL)
printf ( "No existen registros" );
else
if ((clientzzx = fopen("clientzzx", "w")) == NULL)
printf ( "No existen registros" );
else
{
fread (&registro, sizeof(struct sRegistro), 1, clientzz);
while (!feof(clientzz))
{
if (newregistro.newcodigo == registro.codigo)
fwrite(&newregistro, sizeof(struct sRegistro), 1, clientzzx);
else
fwrite(&registro, sizeof(struct sRegistro), 1, clientzzx);
fread (&registro, sizeof(struct sRegistro), 1, clientzz);
}
fclose (clientzz);
fclose (clientzzx);

remove("clientzz");
rename("clientzzx", "clientzz");

sleep(1);
gotoxy(5,17); textcolor(YELLOW); cprintf("Registro modificado");
gotoxy(55,19); textcolor (RED); cprintf("Click para continuar");
getchar();
}
}
return;
}












El código es un poco largo, por lo que no puedo pegarlo... Dejo un enlace adjunto.
http://laboratoriosandoval.com/REG_Codigo.c

Última edición por Garibay1; 30/04/2013 a las 22:57
  #2 (permalink)  
Antiguo 01/05/2013, 09:04
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Editar usuarios :.

Has solucionado lo dificil y has pinchado en lo facil :)

Estas abriendo el archivo en modo "w" escritura/sobreescritura, por lo que si el archivo bajo la ruta indicada no existe se crea uno nuevo y si ya existe se abre, pero en ambos casos el puntero de escritura se situa al inicio (es decir que en tu caso el archivo existe y lo sobreescribe) aun cuando hayas movido el puntero de lectura. Intenta abrir en modo adicion/actualizacion "a+" para que el puntero de escritura se situe en el mismo sitio que el de lectura.

En tu otro thread http://www.forosdelweb.com/f96/c-est...datos-1049446/ ofreces 100.0 USD para solucionar el problema, en este tambien?

Saludos
vosk

Última edición por vosk; 01/05/2013 a las 09:13
  #3 (permalink)  
Antiguo 01/05/2013, 09:41
 
Fecha de Ingreso: diciembre-2012
Ubicación: Guadalajara
Mensajes: 14
Antigüedad: 12 años
Puntos: 1
Respuesta: Editar usuarios :.

10, no 100... Aunque lo analizaría si funciona...

Lo intente con a+ y el resultado continua no muy favorable...
  #4 (permalink)  
Antiguo 01/05/2013, 09:49
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Editar usuarios :.

"...Lo intente con a+ y el resultado continua no muy favorable..."

Te modifica el siguiente registro? Por 1000 te digo porque :))

Cuando estas buscando el registro objetivo el puntero de lectura siempre queda al final de la lectura:

Código:
...
fread (&registro, sizeof(struct sRegistro), 1, clientzz);
while (!feof(clientzz))
{
if (newregistro.newcodigo == registro.codigo)
...
Es decir que si la estructura del cliento ocupa 100 bytes, cada fread cargas 100bytes, y el puntero de lectura y escritura (en a+) avanza 100 bytes. Es decir que cuando has encontrado el cliente a modificar el puntero de escritura está sizeof(struct sRegistro) bytes delante de lo que realmente quieres modificar. La solucion es tan simple como parece: cuando has encontrado el objetivo haces un fseek sizeof(struct sRegistro) bytes atras y ya tienes posicionado el puntero de escritura para sobreescribir el objetivo.

Saludos
vosk
  #5 (permalink)  
Antiguo 01/05/2013, 10:40
 
Fecha de Ingreso: diciembre-2012
Ubicación: Guadalajara
Mensajes: 14
Antigüedad: 12 años
Puntos: 1
Respuesta: Editar usuarios :.

Comprendo, pero no estoy seguro como hacerlo...
  #6 (permalink)  
Antiguo 01/05/2013, 11:00
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Editar usuarios :.

Cuando has encontrado el objetivo obtienes la posicion actual 'pa' con 'ftell', ademas sabes que la struct ocupa 'ts' sizeof(struct sRegistro), y tambien sabes que puedes mover el puntero desde el inicio a la posicion objetivo 'po', echas mano a la amiga matematica para encontrar 'po'

po = pa - ts

Y ahora mueves el puntero con fseek indicando el calculo desde el inicio SEEK_SET y con un offset de 'po'. Con fwrite sobreescribiras la struct objetivo.

Saludos
vosk
  #7 (permalink)  
Antiguo 01/05/2013, 11:16
 
Fecha de Ingreso: diciembre-2012
Ubicación: Guadalajara
Mensajes: 14
Antigüedad: 12 años
Puntos: 1
Respuesta: Editar usuarios :.

Quizá no lo comprendo como dices, ya que marca varios errores...

¿Como lo escribo de manera apropiada?
  #8 (permalink)  
Antiguo 01/05/2013, 11:28
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Editar usuarios :.

Si marca errores de sintaxi deberias revisar tu manual de c

Estamos en la parte en que encuentras el objetivo:
Código:
int posicion_actual, posicion_objetivo, tamanyo_struct;

if (newregistro.newcodigo == registro.codigo) {
    posicion_actual = ftell(clientzz);
    tamanyo_struct = sizeof(struct sRegistro);
    posicion_objetivo = posicion_actual - tamanyo_struct;
    fseek(clientzz, posicion_objetivo, SEEK_SET);

    sprintf(newregistro.nombre, "Nuevo nombre");
    fwrite(&registro, sizeof(struct sRegistro), 1, clientzz);
}
El clientzzx ya puedes quitarlo, trabaja solo sobre un archivo. El codigo completo de la uri que dejaste no lo he mirado, pero se supone que 'newregistro' es igual de grande que 'sRegistro' (lo digo porque dentro tienes datos diferentes que parecen servir para lo mismo).

Saludos
vosk
  #9 (permalink)  
Antiguo 01/05/2013, 11:58
 
Fecha de Ingreso: diciembre-2012
Ubicación: Guadalajara
Mensajes: 14
Antigüedad: 12 años
Puntos: 1
Respuesta: Editar usuarios :.

Te envié un MP...
  #10 (permalink)  
Antiguo 01/05/2013, 12:41
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Editar usuarios :.

MP mejor no, lo siento. Si realmente necesitas la aplicacion y no consigues solucionarlo tal vez C no sea tu lenguaje, debes considerar la posibilidad de hacerlo con otros lenguajes (p.ej. con html, php y mysql haras lo mismo, mas facil y ademas podras acceder a los datos desde cualquier sitio), o incluso puedes encontrar alguna aplicacion gratis que haga eso y mucho mas. Si por el contrario lo necesitas para una asignatura entonces será mejor que revises tus apuntes, la finalidad no es guardar datos y cosas sino aprender como funciona para que puedas hacer eso y todo lo que quieras.

Saludos
vosk
  #11 (permalink)  
Antiguo 01/05/2013, 12:49
 
Fecha de Ingreso: diciembre-2012
Ubicación: Guadalajara
Mensajes: 14
Antigüedad: 12 años
Puntos: 1
Respuesta: Editar usuarios :.

PHP seria ideal y mas sencillo, pero fue solicitud de un cliente y francamente casi no utilizamos C.
  #12 (permalink)  
Antiguo 01/05/2013, 12:56
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Editar usuarios :.

Aun sin php puedes usar sqlite3 (o cualquier administrador de base de datos portable) que no requiere servidor y genera archivos de datos independientes http://www.sqlite.org/, echa un vistazo al manual de la seccion "SQLite In 5 Minutes Or Less" para ver lo facil que es solucionar la lista de clientes en C

Una cosa: es para un cliente y lo le haceis una aplicacion con entorno grafico?

Saludos
vosk
  #13 (permalink)  
Antiguo 01/05/2013, 13:00
 
Fecha de Ingreso: diciembre-2012
Ubicación: Guadalajara
Mensajes: 14
Antigüedad: 12 años
Puntos: 1
Respuesta: Editar usuarios :.

¿Entorno Gráfico? Por supuesto, pero como ejecutable en CMD.

Nos solicito el código hecho en C. Fue una solicitud no muy común para este viernes, por eso mi insistencia, ya que desconocemos como continuar...

Etiquetas: programa, usuario, usuarios
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




La zona horaria es GMT -6. Ahora son las 18:02.