Estoy desarrollando una aplicacion tipo Cuentas por Cobrar, intento reabrir un descriptor de fichero como lectura y modificacion binaria, para poder modificar contenido con fseek(), puedo modificar el contenido x veces en tiempo de ejecucion, cuando estoy intentando la 3ra modificacion, entonces explota, pero he verificado las salidas de los descriptores y solo el descriptor que utiliza la funcion getPos() devuelve error, al parecer no pudo abrir el descriptor, pero a que se debe, he cerrado todos los ficheros correctamente, he colocado reposicionamiento al SET 0 de mi descriptor utilizando fseek(), pero nada todo igual.
//codigo boton
posFich=getPos(cedulaPg);
getPosFich(posFich-1, modifFichero);
pagoActual=mntPagoClt(cedulaPg);
sumaPagada=sumar(mntPago, mntCount);
//suma de pago
pagoSumado=pagoActual-sumaPagada;
sprintf(usuario.deuda, "%i", pagoSumado);
//guardamos estructura de datos en fichero
fwrite(&usuario, sizeof(struct user), 1, modifFichero);
//cerramos fichero
fclose(modifFichero);
La funcion getPos(), con esta funcion devuelvo la posicion fisica actual del fichero.
int getPos(char *cedulaPago)
{
FILE *dato = fopen("fixcom.fix", "rb");
int pos=0;
//fseek(dato, 0L, SEEK_SET);
verificarFichero(dato,"dato");
while(fread(&usuario, sizeof(struct user), 1, dato)!=0)
{
pos++;
if(strcmp(cedulaPago, usuario.cedula)==0)
{
fclose(dato);
return pos;
}
}
}
La funcion mntPagoClt(), la utilizo para sacar el ultimo pago que realizo el cliente.
int mntPagoClt(char *cedula)
{
int prestamoD=0;
FILE *fichLeer=fopen("fixcom.fix", "rb");
while(fread(&usuario, sizeof(struct user), 1, fichLeer)!=0)
{
if(strcmp(cedula, usuario.cedula)==0)
{
fclose(fichLeer);
return prestamoD=atoll(usuario.deuda);
}
}
}
De esta manera estoy abriendo los descriptores de fichero:
modifFichero=fopen("fixcom.fix","rb+");//lectura binaria y para actualizar descriptor
fdiskR=fopen("fixcom.fix","rb");//leer el fichero completo hasta encontrar lo buscado con strcmp()
fdiskW=fopen("fixcom.fix","a"); //para guardar siempre en la ultima linea del fichero
La funcion getPosFich(). Con esta funcion me posiciono en donde quiero en el descriptor
void getPosFich(int pos, FILE *filePtr)
{
fseek(filePtr, pos*sizeof(struct user), SEEK_SET);
}
Nota: Todos los datos se alojan en un fichero, llamado fixcon.fix.
Valida que fopen no te esté retornando NULL y además verifica que no estés abriendo el fichero dos veces o algo por el estilo.
¿Qué tal si esta condición no se cumple?
strcmp(cedulaPago, usuario.cedula)==0
No se cerraría el fichero y ahí tenemos un problema.
Ademas de lo que te marcaron, tambien esta mal empleado los retornos en las funciones. Solo si entra al while y se cumple el if retornas un valor, y si nose cumple nada????
Tambien tendrias q cambiar la condicion de los bucles, mira el manual de fread:
http://c.conclase.net/librerias/?ansifun=fread
Saludos
naderST: Gracias por responder, si mira verifico que el descriptor ande bien !! fijate en esta funcion luego de abrir el descriptor verificarFichero(dato,"dato");, y su cuerpo:
void verificarFichero(FILE *fil, char *nameFich)
{
if(fil==NULL)
{
fprintf(stdout, "Error de fichero %s", nameFich);
}
}
Nota: Cuando intento verificar el descriptor, entonces me lanza error en el fichero de lectura. Tiene error para abrir creo, pero a que se debe esto !!!
He intentado rebobinar el descriptor con ayuda de rewind(), pero nada todo igual !!.
Usa la funcion perror() para saber cual puede ser la causa
Saludos
Si mira durasno, el mensaje que me lanza perror():
Fichero dato: No error
Fichero dato: No error
Fichero dato: No error
Fichero dato: Too many open files
Por lo que veo no detecta errores !!!, ahora voy a ver que pasa si modifico algo, lo que pasa es que trabajo con el motor grafico de SDL, para graficar y tengo que estar metiendo while() por todos lados !!
Voy a publica el codigo, pero creo que sera dificil leerlo, carece de organizacion (Optimizacion).
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
#include <sys/time.h>
#include "include/components.cpp"
#include "include/ventanas.c"
#include "include/struct_clientes.h"
#include "include/def_cv.h"
#include "include/suma.cpp"
//estructura para manejar datos clientes
void seccion_de_botones(int);
void presentar_fecha();
void save_array(int,int,char);
void save_disk();
float calculaPrest();
void dato_prestamo(int, int);
int getPos(char *);
void getPosFich(int, FILE *);
int mntPagoClt(char *);
char buscarCedula[TAM], cedulaPg[TAM];
int contPrestamo=0, pagos=0, verdad=DISABLE, cant=0, cuota=0, contCheckbox=0, posFich=0,
mntPago[TAM], mntCount=0, permit=ENABLE;
unsigned int sumaPagada=0, pagoActual=0, pagoSumado=0;
struct user{
char nombre[TAM],
apellido[TAM],
cedula[TAM],
fecha[TAM],
prestms[TAM],
prestamoPorCuota[TAM],
numeroPagos[TAM],
fFinal[TAM],
deuda[TAM];
int prest[TAM], numPagos[TAM];
}usuario;
typedef struct mesDia{
int mes, dia;
};
int main(int argc, char *argv[])
{
vent ventana[3];
check checkbox;
int color=AZUL, sig_boton, sig_y_boton, sig_tex, sig_y_tex;
int done = 0, bit_fecha=0, evento_keyboard=DISABLE,
active_texbox, checked=0, xsig, ysig;
char *texto_texbox="", fecha2[10], *texbox_texto=""/*accion*/;
crear_pantalla(600, 400, CARGA_PANT, "FIXCOM");
//inicializamos checkbox a DISABLE
checkbox.select=0;
// texto checkbox
inicializarTextoCheckbox[1]="2-C";
inicializarTextoCheckbox[2]="4-C";
inicializarTextoCheckbox[3]="6-C";
inicializarTextoCheckbox[4]="8-C";
//desactivamos ventanas
ventana[MENU].select=ENABLE; //dejamos menu porque es pantalla inicial
ventana[ADD_USERS].select=DISABLE;
ventana[LIST_USERS].select=DISABLE;
ventana[HACER_PAGOS].select=DISABLE;
//elementos ventanas
elementos_ventana();
//bucle o loop de aplicacion
while(done == DISABLE)
{
//esperamos eventos en cola
SDL_WaitEvent(&event);
//consultamos eventos en cola
if (event.type == SDL_QUIT)
{
done = 1;
}
//cambiamos apariencia a botones
create_button(sig_boton, sig_y_boton, texto_texbox, 10, color);
if(event.type==SDL_MOUSEBUTTONDOWN&CLICKPRESIONADO)
{fprintf(stdout, "X=%i, Y=%i\n", event.button.x, event.button.y);}
if(bit_texbox==ENABLE)
{
create_imagen(sig_tex,sig_y_tex,"images/tapa_label.jpg");
create_label(sig_tex,sig_y_tex,texbox_texto,15,AZUL);
}
bit_texbox=DISABLE;
color=AZUL;
checked=0;
//eventos botones ventana menu
if(ventana[MENU].select==ENABLE)
{
//boton agregar users
if((EVENTOX>=151&EVENTOX<=258)&&(EVENTOY>=84&EVENTOY<=113))
{
sig_boton=150;
sig_y_boton=80;
texto_texbox="Agregar Users";
color=BOTON_ILUM;
//click
if(EVENTOCLICK==1&CLICKLIBERADO)
{
//efecto boton
create_button_efecto(150, 80);
SDL_Delay(50);
create_button(150, 80, texto_texbox, 10, AZUL);
//codigo boton
ventana[MENU].select=DISABLE;
ventana[ADD_USERS].select=ENABLE;
//llama a ventana
sig_boton=-150,sig_y_boton=-150;
checkbox.select=DISABLE;
checked=DISABLE;
create_imagen(0,0,"images/imagen.jpg");
v(ADD_USERS);
//ejecutamos botones de ventanas
seccion_de_botones(ADD_USERS);
//fin codigo boton agregar users
}
}
//boton listar users
else if((EVENTOX>=148&EVENTOX<=260)&(EVENTOY>=155&EVENTOY<=185))
{
sig_boton=150;
sig_y_boton=150;
texto_texbox="Buscar Users";
color=BOTON_ILUM;
//click
if(EVENTOCLICK==1&CLICKLIBERADO)
{
//efecto boton
create_button_efecto(150, 150);
SDL_Delay(50);
create_button(150, 150, texto_texbox, 10, AZUL);
//codigo boton
//desactivamos ventana menu
ventana[MENU].select=DISABLE;
ventana[LIST_USERS].select=ENABLE; //activamos ventana listar users
create_imagen(0,0,"images/imagen.jpg");
sig_boton=-150,sig_y_boton=-150;
v(LIST_USERS);
seccion_de_botones(LIST_USERS);
//fin codigo boton listar_users
}
}
//boton hacer pagos
else if((EVENTOX>=151&EVENTOX<=258)&&(EVENTOY>=220&EVENTOY<=255))
{
sig_boton=151;
sig_y_boton=220;
texto_texbox="Hacer Pagos";
color=BOTON_ILUM;
//click
if(EVENTOCLICK==1&CLICKLIBERADO)
{
//efecto boton
create_button_efecto(150, 220);
SDL_Delay(50);
create_button(150, 220, texto_texbox, 10, AZUL);
//codigo boton
ventana[MENU].select=DISABLE;
ventana[HACER_PAGOS].select=ENABLE;
//llama a ventana
sig_boton=-150,sig_y_boton=-150;
create_imagen(0,0,"images/imagen.jpg");
v(HACER_PAGOS);
//ejecutamos botones de ventanas
seccion_de_botones(HACER_PAGOS);
//fin codigo boton agregar users
}
}
//fin eventos botones ventana menu
}
//sección botones add_users
if(ventana[ADD_USERS].select==ENABLE)
{
//eventos botones
//boton ir a menu
if(bit_fecha==0)
{
presentar_fecha();
bit_fecha=1;
}
if((EVENTOX>=349&EVENTOX<=463)&(EVENTOY>=355&EVENTOY<=382))
{
sig_boton=350;
sig_y_boton=350;
texto_texbox="Ir a Menu";
color=BOTON_ILUM;
//click
if(EVENTOCLICK==1&CLICKLIBERADO)
{
//efecto boton
create_button_efecto(350, 350);
SDL_Delay(50);
create_button(350, 350, texto_texbox, 10, AZUL);
//codigo boton
//desactivamos ventana menu
ventana[ADD_USERS].select=DISABLE;
ventana[MENU].select=ENABLE;
create_imagen(0,0,"images/imagen.jpg");
sig_boton=-150,sig_y_boton=-150;
sig_tex=-71,sig_y_tex=-18;
evento_keyboard=DISABLE;
bit_fecha=0;
pagos=0;
contPrestamo=0;
cant=0;
limpiarArray(usuario.apellido,TAM);
limpiarArray(usuario.nombre,TAM);
limpiarArray(usuario.cedula,TAM);
limpiarArray(usuario.deuda,TAM);
limpiarArray(usuario.fecha,TAM);
limpiarArray(usuario.fFinal,TAM);
limpiarArray(usuario.numeroPagos,TAM);
limpiarArray(usuario.prestamoPorCuota,7);
limpiarArray(usuario.prestms,TAM);
limpiarArray(buscarCedula,TAM);
limpiarArrayEntero(usuario.prest,3);
limpiarArrayEntero(usuario.numPagos,3);
elementos_ventana();
//fin codigo boton add_users
}
}
//boton limpiar
if((EVENTOX>=49&EVENTOX<=159)&(EVENTOY>=355&EVENTOY<=382))
{
sig_boton=50;
sig_y_boton=350;
texto_texbox="Limpiar";
color=BOTON_ILUM;
//click
if(EVENTOCLICK==1&CLICKLIBERADO)
{
//efecto boton
create_button_efecto(50, 350);
SDL_Delay(50);
create_button(50, 350, texto_texbox, 10, AZUL);
//codigo boton
//desactivamos ventana menu
sig_boton=-150,sig_y_boton=-150;
sig_tex=-71,sig_y_tex=-18;
evento_keyboard=DISABLE;
pagos=0;
contPrestamo=0;
cant=0;
//limpiamos cuadros de textos erroneos
clear_error(400, 150);
clear_error(400, 10);
create_imagen(5, 300, "images/tapa_error.jpg");
create_imagen(5, 315, "images/tapa_error.jpg");
limpiarArray(usuario.apellido,TAM);
limpiarArray(usuario.nombre,TAM);
limpiarArray(usuario.cedula,TAM);
limpiarArray(usuario.deuda,TAM);
limpiarArray(usuario.fecha,TAM);
limpiarArray(usuario.fFinal,TAM);
limpiarArray(usuario.numeroPagos,TAM);
limpiarArray(usuario.prestamoPorCuota,7);
limpiarArray(usuario.prestms,TAM);
limpiarArray(buscarCedula,TAM);
limpiarArrayEntero(usuario.prest,3);
limpiarArrayEntero(usuario.numPagos,3);
//fin codigo boton add_users
}
}
//evento boton agregar
if((EVENTOX>=194&EVENTOX<=312)&(EVENTOY>=355&EVENTOY<=382))
{
sig_boton=200;
sig_y_boton=350;
texto_texbox="Agregar";
color=BOTON_ILUM;
//click
if(EVENTOCLICK==1&CLICKLIBERADO)
{
//efecto boton
create_button_efecto(200, 350);
SDL_Delay(50);
create_button(200, 350, texto_texbox, 10, AZUL);
//codigo boton
active_texbox=SAVE_DISK;
if(pagos==0)
{
/*mensaje de error*/mod_error(400, 10, "Seleccione Pago", 10);
permit=DISABLE;
}
if(pagos!=0)
{
clear_error(400,10);
}
if(usuario.nombre[0]=='\0'||usuario.cedula[0]=='\0'||usuario.prestms[0]=='\0')
{/*mensaje de error*/
create_imagen(5, 300, "images/tapa_error.JPG");
create_label(5, 300, "ES OBLIGATORIO: Nombre, Cedula y Prestms", 10, ROJO);
//desactivamos los que nos permite guardar
permit=DISABLE;
}
if(usuario.nombre[0]!='\0'&usuario.cedula[0]!='\0'&usuario.prestms[0]!='\0')
{/*mensaje de error*/
create_imagen(5, 300, "images/tapa_error.JPG");
}
if(strlen(usuario.cedula)<=10)
{
clear_error(400,150);
mod_error(400, 150, "Cedula debe tener 11 Digitos", 10);
permit=DISABLE;
}
if(strlen(usuario.cedula)>=11)
{
clear_error(400,150);
}
if(permit==ENABLE)
{
clear_error(400,10);
save_disk();
create_imagen(5, 315, "images/tapa_error.jpg");
create_label(5, 315, "Datos guardados exitosamente", 10, AZUL);
}
evento_keyboard=DISABLE;
//fin codigo boton add_users
}
}
//checkbox 2 pagos
if((EVENTOX>=64&EVENTOX<=74)&&(EVENTOY>=178&EVENTOY<=188))
{
xsig=65, ysig=180;
if(EVENTOCLICK==1&CLICKPRESIONADO)
{
checkbox.select++;
if(checkbox.select==1)
{
checkbox_select(xsig,ysig);
//asignamos numero de pago
pagos=2;
permit=ENABLE;
}
if(checkbox.select==2)
{
create_checkbox(xsig,ysig);
checkbox.select=0;
pagos=0;
permit=DISABLE;
}
}
}
//checkbox 4 pagos
if((EVENTOX>=65&EVENTOX<=73)&&(EVENTOY>=200&EVENTOY<=208))
{
xsig=65, ysig=200;
if(EVENTOCLICK==1&CLICKPRESIONADO)
{
checkbox.select++;
if(checkbox.select==1)
{
checkbox_select(xsig,ysig);
//asignamos numero de pago
pagos=4;
permit=ENABLE;
}
if(checkbox.select==2)
{
create_checkbox(xsig,ysig);
checkbox.select=0;
pagos=0;
permit=DISABLE;
}
}
}
//checkbox 6 pagos
if((EVENTOX>=65&EVENTOX<=73)&&(EVENTOY>=220&EVENTOY<=228))
{
xsig=65, ysig=220;
if(EVENTOCLICK==1&CLICKPRESIONADO)
{
checkbox.select++;
if(checkbox.select==1)
{
checkbox_select(xsig,ysig);
//asignamos numero de pago
pagos=6;
permit=ENABLE;
}
if(checkbox.select==2)
{
create_checkbox(xsig,ysig);
checkbox.select=0;
pagos=0;
permit=DISABLE;
}
}
}
//checkbox 8 pagos
if((EVENTOX>=65&EVENTOX<=73)&&(EVENTOY>=240&EVENTOY<=248))
{
xsig=65, ysig=240;
if(EVENTOCLICK==1&CLICKPRESIONADO)
{
checkbox.select++;
if(checkbox.select==1)
{
checkbox_select(xsig,ysig);
//asignamos numero de pago
pagos=8;
permit=ENABLE;
}
if(checkbox.select==2)
{
create_checkbox(xsig,ysig);
checkbox.select=0;
pagos=0;
permit=DISABLE;
}
}
}
//revisamos si se llego al final de texbox
if(sig>=280)
{evento_keyboard=DISABLE;}
//eventos texbox
//texbox nombre
if((EVENTOX>=69&EVENTOX<=290)&(EVENTOY>=9&EVENTOY<=30))
{
bit_texbox=ENABLE;
texbox_texto="Nombre";
sig_tex=5,sig_y_tex=10;
active_texbox=NOMBRE;
create_label(sig_tex,sig_y_tex,"Nombre", 15, ROJO);
if(EVENTOCLICK==1&&CLICKPRESIONADO)
{
cant=0;
sig=71,sig_y=18;
evento_keyboard=ENABLE;
}
}
//texbox apellido
if((EVENTOX>=69&EVENTOX<=290)&(EVENTOY>=39&EVENTOY<=60))
{
bit_texbox=ENABLE;
texbox_texto="Apellido";
sig_tex=5,sig_y_tex=40;
active_texbox=APELLIDO;
create_label(sig_tex,sig_y_tex,"Apellido", 15, ROJO);
if(EVENTOCLICK==1&&CLICKPRESIONADO)
{
cant=0;
sig=71,sig_y=48;
evento_keyboard=ENABLE;
}
}
//texbox cedula
if((EVENTOX>=69&EVENTOX<=290)&(EVENTOY>=68&EVENTOY<=91))
{
bit_texbox=ENABLE;
texbox_texto="Cedula";
sig_tex=5,sig_y_tex=70;
active_texbox=CEDULA;
create_label(sig_tex,sig_y_tex,"Cedula", 15, ROJO);
if(EVENTOCLICK==1&&CLICKPRESIONADO)
{
cant=0;
sig=71,sig_y=78;
evento_keyboard=ENABLE;
}
}
//texbox prestamo
if((EVENTOX>=69&EVENTOX<=290)&(EVENTOY>=129&EVENTOY<=151))
{
bit_texbox=ENABLE;
texbox_texto="Prestms";
sig_tex=5,sig_y_tex=130;
active_texbox=PRESTMS;
create_label(sig_tex,sig_y_tex,"Prestms", 15, ROJO);
if(EVENTOCLICK==1&&CLICKPRESIONADO)
{
cant=0;
sig=71,sig_y=138;
evento_keyboard=ENABLE;
}
}
//terminar sección ventana agregar user
}
//sección de botones listar users
if(ventana[LIST_USERS].select==ENABLE)
{
//eventos botones
//boton ir a menu
if((EVENTOX>=349&EVENTOX<=463)&(EVENTOY>=355&EVENTOY<=382))
{
sig_boton=350;
sig_y_boton=350;
texto_texbox="Ir a Menu";
color=BOTON_ILUM;
//click
if(EVENTOCLICK==1&CLICKLIBERADO)
{
//efecto boton
create_button_efecto(350, 350);
SDL_Delay(50);
create_button(350, 350, texto_texbox, 10, AZUL);
//codigo boton
verdad=DISABLE;
//limpiamos todos los arrays de la estructura usuario
limpiarArray(usuario.apellido,TAM);
limpiarArray(usuario.nombre,TAM);
limpiarArray(usuario.cedula,TAM);
limpiarArray(usuario.deuda,TAM);
limpiarArray(usuario.fecha,TAM);
limpiarArray(usuario.fFinal,TAM);
limpiarArray(usuario.numeroPagos,TAM);
limpiarArray(usuario.prestamoPorCuota,TAM);
limpiarArray(usuario.prestms,TAM);
limpiarArray(buscarCedula,TAM);
limpiarArrayEntero(usuario.prest,3);
limpiarArrayEntero(usuario.numPagos,3);
//desactivamos ventana menu
ventana[LIST_USERS].select=DISABLE;
ventana[MENU].select=ENABLE;
create_imagen(0,0,"images/imagen.jpg");
sig_boton=-150,sig_y_boton=-150;
sig_tex=-71,sig_y_tex=-18;
evento_keyboard=DISABLE;
elementos_ventana();
//fin codigo boton listar_users
}
}
//parar eventos texbox
if(sig>=565&&active_texbox==BUSCAR_C)
{evento_keyboard=DISABLE;}
//evento boton buscar
if((EVENTOX>=349&EVENTOX<=463)&(EVENTOY>=114&EVENTOY<=145))
{
sig_boton=350;
sig_y_boton=110;
texto_texbox="Buscar";
color=BOTON_ILUM;
//click
if(EVENTOCLICK==1&CLICKLIBERADO)
{
//efecto boton
fdiskR=fopen("fixcom.fix","rb");
create_button_efecto(350, 110);
SDL_Delay(50);
create_button(350, 110, texto_texbox, 10, AZUL);
//codigo boton
//comprobamo si cedula contiene 13 digitos
if(strlen(buscarCedula)<=10)
{
clear_error(400, 200);
mod_error(400, 200, "Cedula debe tener 11 digitos", 10);
}
while(fread(&usuario,sizeof(struct user),1,fdiskR)!=0)
{
if(strcmp(buscarCedula,usuario.cedula)==0)
{
SDL_printf(73,18,usuario.nombre,10,AZUL);
SDL_printf(73,48,usuario.apellido,10,AZUL);
SDL_printf(73,108,usuario.prestms,10,AZUL);
SDL_printf(73,78,usuario.fecha,10,AZUL);
SDL_printf(73,198,usuario.prestamoPorCuota,10,AZUL);
SDL_printf(73,228,usuario.numeroPagos,10,AZUL);
SDL_printf(73,168,usuario.fFinal,10,AZUL);
SDL_printf(73,138,usuario.deuda,10,AZUL);
verdad=ENABLE;
}
}
if(verdad==DISABLE)
{
create_imagen(10, 285, "images/tapa_error.jpg");
create_label(10, 285, "ERROR: No existe cliente !", 10, ROJO);
}
sig_boton=-150,sig_y_boton=-150;
sig_tex=-71,sig_y_tex=-18;
evento_keyboard=DISABLE;
//fin codigo boton listar_users
}
}
//evento boton limpiar
if((EVENTOX>=192&EVENTOX<=313)&(EVENTOY>=350&EVENTOY<=383))
{
sig_boton=200;
sig_y_boton=350;
texto_texbox="Limpiar";
color=BOTON_ILUM;
//click
if(EVENTOCLICK==1&CLICKLIBERADO)
{
create_button_efecto(200, 350);
SDL_Delay(50);
create_button(200, 350, texto_texbox, 10, AZUL);
//codigo boton
//limpiamos errores comprobacion users y digitos cedula
clear_error(400, 200);
create_imagen(10, 285, "images/tapa_error.jpg");
//limpiamos arrays de estructuras
cant=0;
verdad=DISABLE;
limpiarArray(usuario.apellido,TAM);
limpiarArray(usuario.nombre,TAM);
limpiarArray(usuario.cedula,TAM);
limpiarArray(usuario.deuda,TAM);
limpiarArray(usuario.fecha,TAM);
limpiarArray(usuario.fFinal,TAM);
limpiarArray(usuario.numeroPagos,TAM);
limpiarArray(usuario.prestamoPorCuota,TAM);
limpiarArray(usuario.prestms,TAM);
limpiarArray(buscarCedula,TAM);
limpiarArrayEntero(usuario.prest,3);
limpiarArrayEntero(usuario.numPagos,3);
sig_boton=-150,sig_y_boton=-150;
sig_tex=-71,sig_y_tex=-18;
evento_keyboard=DISABLE;
//fin codigo boton listar_users
}
}
//eventos texbox
//texbox buscar cedula
if((EVENTOX>=348&EVENTOX<=570)&(EVENTOY>=68&EVENTOY<=89))
{
bit_texbox=ENABLE;
texbox_texto="Buscar C.";
sig_tex=350,sig_y_tex=50;
active_texbox=BUSCAR_C;
create_label(sig_tex,sig_y_tex,"Buscar C.", 15, ROJO);
if(EVENTOCLICK==1&&CLICKPRESIONADO)
{
cant=0;
sig=351,sig_y=78;
evento_keyboard=ENABLE;
}
}
//fin de eventos texbox listar users
}
//sección ventana hacer pagos
if(ventana[HACER_PAGOS].select==ENABLE)
{
//eventos botones
//boton ir a menu
modifFichero=fopen("fixcom.fix","rb+");
if((EVENTOX>=349&EVENTOX<=463)&(EVENTOY>=355&EVENTOY<=382))
{
sig_boton=350;
sig_y_boton=350;
texto_texbox="Ir a Menu";
color=BOTON_ILUM;
//click
if(EVENTOCLICK==1&CLICKLIBERADO)
{
//efecto boton
create_button_efecto(350, 350);
SDL_Delay(50);
create_button(350, 350, texto_texbox, 10, AZUL);
//codigo boton
//limpiamos todos los arrays de la estructura usuario
limpiarArray(usuario.apellido,TAM);
limpiarArray(usuario.nombre,TAM);
limpiarArray(usuario.cedula,TAM);
limpiarArray(usuario.deuda,TAM);
limpiarArray(usuario.fecha,TAM);
limpiarArray(usuario.fFinal,TAM);
limpiarArray(usuario.numeroPagos,TAM);
limpiarArray(usuario.prestamoPorCuota,TAM);
limpiarArray(usuario.prestms,TAM);
limpiarArrayEntero(usuario.prest,3);
limpiarArrayEntero(usuario.numPagos,3);
//desactivamos ventana menu
ventana[MENU].select=ENABLE;
ventana[HACER_PAGOS].select=DISABLE;
create_imagen(0,0,"images/imagen.jpg");
sig_boton=-150,sig_y_boton=-150;
sig_tex=-71,sig_y_tex=-18;
evento_keyboard=DISABLE;
elementos_ventana();
//fin codigo boton listar_users
}
}
//boton realizar
if((EVENTOX>=50&EVENTOX<=159)&(EVENTOY>=355&EVENTOY<=382))
{
sig_boton=50;
sig_y_boton=350;
texto_texbox="Realizar";
color=BOTON_ILUM;
//click
if(EVENTOCLICK==1&CLICKLIBERADO)
{
//efecto boton
create_button_efecto(50, 350);
SDL_Delay(50);
create_button(50, 350, texto_texbox, 10, AZUL);
//codigo boton
posFich=getPos(cedulaPg);
getPosFich(posFich-1, modifFichero);
pagoActual=mntPagoClt(cedulaPg);
sumaPagada=sumar(mntPago, mntCount);
//suma de pago
pagoSumado=pagoActual-sumaPagada;
sprintf(usuario.deuda, "%i", pagoSumado);
//guardamos estructura de datos en fichero
fwrite(&usuario, sizeof(struct user), 1, modifFichero);
//cerramos fichero
fclose(modifFichero);
//limpiamos arrays de elementos
limpiarArray(cedulaPg, TAM);
limpiarArrayEntero(mntPago, TAM);
//volvemos variables a su valor 0
sumaPagada=0;
pagoActual=0;
pagoSumado=0;
mntCount=0;
cant=0;
posFich=0;
//desactivamos ventana menu
ventana[MENU].select=DISABLE;
//activamos la ventana actual
ventana[HACER_PAGOS].select=ENABLE;
sig_boton=-150,sig_y_boton=-150;
sig_tex=-71,sig_y_tex=-18;
evento_keyboard=DISABLE;
//fin codigo boton hacer pagos
}
}
//fin acciones boton hacer pagos
//eventos texbox
//Cedula Cliente
if((EVENTOX>=261&EVENTOX<=480)&(EVENTOY>=70&EVENTOY<=90))
{
bit_texbox=ENABLE;
texbox_texto="Cedula C.";
sig_tex=260,sig_y_tex=50;
active_texbox=BUSCACEDULA;
create_label(sig_tex,sig_y_tex,"Cedula C.", 15, ROJO);
if(EVENTOCLICK==1&&CLICKPRESIONADO)
{
cant=0;
sig=261,sig_y=78;
evento_keyboard=ENABLE;
}
}
//Monto
if((EVENTOX>=261&EVENTOX<=480)&(EVENTOY>=118&EVENTOY<=142))
{
bit_texbox=ENABLE;
texbox_texto="Monto";
sig_tex=260,sig_y_tex=100;
active_texbox=MONTOPAGO;
create_label(sig_tex,sig_y_tex,"Monto", 15, ROJO);
if(EVENTOCLICK==1&&CLICKPRESIONADO)
{
cant=0;
sig=261,sig_y=128;
evento_keyboard=ENABLE;
}
}
//limite de eventos teclado en caso de
if(sig>=480)
{evento_keyboard=DISABLE;}
//fin eventos texbox
}
//inicio gestion eventos
if(evento_keyboard==ENABLE)
{
if(event.key.keysym.sym==SDLK_a&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "a", 10, ROJO);
save_array(active_texbox,cant,'a');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_b&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "b", 10, ROJO);
save_array(active_texbox,cant,'b');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_c&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "c", 10, ROJO);
save_array(active_texbox,cant,'c');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_d&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "d", 10, ROJO);
save_array(active_texbox,cant,'d');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_e&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "e", 10, ROJO);
save_array(active_texbox,cant,'e');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_f&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "f", 10, ROJO);
save_array(active_texbox,cant,'f');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_g&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "g", 10, ROJO);
save_array(active_texbox,cant,'g');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_h&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "h", 10, ROJO);
save_array(active_texbox,cant,'h');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_i&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "i", 10, ROJO);
save_array(active_texbox,cant,'i');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_j&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "j", 10, ROJO);
save_array(active_texbox,cant,'j');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_k&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "k", 10, ROJO);
save_array(active_texbox,cant,'k');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_l&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "l", 10, ROJO);
save_array(active_texbox,cant,'l');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_m&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "m", 10, ROJO);
save_array(active_texbox,cant,'m');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_n&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "n", 10, ROJO);
save_array(active_texbox,cant,'n');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_o&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "o", 10, ROJO);
save_array(active_texbox,cant,'o');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_p&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "p", 10, ROJO);
save_array(active_texbox,cant,'p');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_q&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "q", 10, ROJO);
save_array(active_texbox,cant,'q');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_r&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "r", 10, ROJO);
save_array(active_texbox,cant,'r');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_s&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "s", 10, ROJO);
save_array(active_texbox,cant,'s');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_t&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "t", 10, ROJO);
save_array(active_texbox,cant,'t');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_u&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "u", 10, ROJO);
save_array(active_texbox,cant,'u');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_v&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "v", 10, ROJO);
save_array(active_texbox,cant,'v');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_w&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "w", 10, ROJO);
save_array(active_texbox,cant,'w');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_x&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "x", 10, ROJO);
save_array(active_texbox,cant,'x');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_y&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "y", 10, ROJO);
save_array(active_texbox,cant,'y');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_z&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "z", 10, ROJO);
save_array(active_texbox,cant,'z');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_KP0&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "0", 10, ROJO);
save_array(active_texbox,cant,'0');
dato_prestamo(active_texbox,0);
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_KP1&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "1", 10, ROJO);
save_array(active_texbox,cant,'1');
dato_prestamo(active_texbox,1);
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_KP2&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "2", 10, ROJO);
save_array(active_texbox,cant,'2');
dato_prestamo(active_texbox,2);
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_KP3&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "3", 10, ROJO);
save_array(active_texbox,cant,'3');
dato_prestamo(active_texbox,3);
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_KP4&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "4", 10, ROJO);
save_array(active_texbox,cant,'4');
dato_prestamo(active_texbox,4);
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_KP5&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "5", 10, ROJO);
save_array(active_texbox,cant,'5');
dato_prestamo(active_texbox,5);
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_KP6&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "6", 10, ROJO);
save_array(active_texbox,cant,'6');
dato_prestamo(active_texbox,6);
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_KP7&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "7", 10, ROJO);
save_array(active_texbox,cant,'7');
dato_prestamo(active_texbox,7);
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_KP8&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "8", 10, ROJO);
save_array(active_texbox,cant,'8');
dato_prestamo(active_texbox, 8);
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_KP9&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "9", 10, ROJO);
save_array(active_texbox,cant,'9');
dato_prestamo(active_texbox, 9);
cant++;
sig+=10;
}
}
//fin gestion
}
}
//funcion aloja datos a array !!
void save_array(int active_texbox, int cant, char byte)
{
if(active_texbox==NOMBRE)
{
usuario.nombre[cant]=byte;
}
if(active_texbox==APELLIDO)
{
usuario.apellido[cant]=byte;
}
if(active_texbox==CEDULA)
{
usuario.cedula[cant]=byte;
}
if(active_texbox==PRESTMS)
{
usuario.prestms[cant]=byte;
contPrestamo++;
}
if(active_texbox==BUSCAR_C)
{
buscarCedula[cant]=byte;
}
if(active_texbox==BUSCACEDULA)
{
cedulaPg[cant]=byte;
}
}
//calculo de fecha final
float calculaPrest()
{
int prestamoTomado=0;
float media_prestamo=0.0, itbis=0.0, itSumado=0.0;
prestamoTomado=sumar(usuario.prest, contPrestamo+1);
media_prestamo=prestamoTomado/pagos;
itbis=media_prestamo*0.05;
itSumado=media_prestamo+itbis;
if(prestamoTomado>=10000&prestamoTomado<=20000)
{
itbis=media_prestamo*0.15;
itSumado=media_prestamo+itbis;
}
if(prestamoTomado>=20000&prestamoTomado<=30000)
{
itbis=media_prestamo*0.25;
itSumado=media_prestamo+itbis;
}
return itSumado;
}
//calculo fecha final
void fechaFinal()
{
int dia=0, mes=0, ano=0, totalF=0, obj=0, objDia=0;
totalF=15*pagos;
mes=fecha->tm_mon+1;
dia=fecha->tm_mday;
ano=fecha->tm_year+1900;
while(obj<totalF)
{
if(objDia>=30)
{
mes=mes+1;
dia=objDia;
objDia=0;
if(mes>=12)
{
mes=1;
ano=ano+1;
}
}
objDia++;
obj++;
}
limpiarArray(usuario.fFinal,TAM);
sprintf(usuario.fFinal, "%i/%i/%i", dia, mes, ano);
}
//escribir en disco
void save_disk()
{
time_t tiempo; //variable para el tiempo
time(&tiempo);//inicilizamos tiempo
fecha=localtime(&tiempo);//sacamos valores actuales de tiempo
sprintf(usuario.fecha,"%i/%i/%i",fecha->tm_mday,fecha->tm_mon+1,fecha->tm_year+1900);
float prestamoCalc=calculaPrest();
cuota=atoll(usuario.prestms);
sprintf(usuario.prestamoPorCuota,"%f",prestamoCalc);
sprintf(usuario.numeroPagos,"%i", pagos);
limpiarArray(usuario.fFinal, 7);
fechaFinal();
limpiarArray(usuario.deuda, TAM);
sprintf(usuario.deuda,"%i", cuota);
fdiskW=fopen("fixcom.fix","a");
fwrite(&usuario, sizeof(struct user), 1, fdiskW);
//limpiamos variables
cuota=0;
prestamoCalc=0.0;
cant=0;
contPrestamo=0;
//cerramos fichero
fclose(fdiskW);
}
void presentar_fecha()
{
time_t tiempo; //variable para el tiempo
time(&tiempo);//inicilizamos tiempo
struct tm *f=localtime(&tiempo);//sacamos valores actuales de tiempo
char fech[10];
sprintf(fech,"%i/%i/%i",f->tm_mday,f->tm_mon+1,f->tm_year+1900);
SDL_printf(73,108,fech,10,AZUL);
}
void dato_prestamo(int texbox, int dato)
{
if(texbox==PRESTMS)
{
usuario.prest[contPrestamo]=dato;
}
if(texbox==MONTOPAGO)
{
mntPago[mntCount]=dato;
mntCount++;
}
}
int getPos(char *cedulaPago)
{
FILE *dato = fopen("fixcom.fix", "rb");
int pos=0;
//fseek(dato, 0L, SEEK_SET);
verificarFichero(dato,"dato");
while(fread(&usuario, sizeof(struct user), 1, dato)!=0)
{
pos++;
if(strcmp(cedulaPago, usuario.cedula)==0)
{
fclose(dato);
return pos;
}
}
}
void getPosFich(int pos, FILE *filePtr)
{
fseek(filePtr, pos*sizeof(struct user), SEEK_SET);
}
int mntPagoClt(char *cedula)
{
int prestamoD=0;
FILE *fichLeer=fopen("fixcom.fix", "rb");
while(fread(&usuario, sizeof(struct user), 1, fichLeer)!=0)
{
if(strcmp(cedula, usuario.cedula)==0)
{
fclose(fichLeer);
return prestamoD=atoll(usuario.deuda);
}
}
}
CitarPor lo que veo no detecta errores !!!
y este error "Fichero dato: Too many open files" ??? Por el tipo de error te esta fallando el cierre de los archivos ocasionando tener varios abiertos a la vez y seguramente superando a FOPEN_MAX... Revisa esto por ahi sea este el error
Saludos
PD: tambien deberias cambiar lo que te marque antes del fread
Gracias durasno, si claro mira estoy verificando si ocurre algun evento erroneo en el descriptor antes de fread() con la funcion verificaFichero(), que recibe dos argumentos, el FILE* y char*, que es el nombre del descriptor, para poder verificar si devuelve NULL.
naderST y durasno ya te dieron la respuesta: en las dos funciones de tu primer mensaje (getPos y mntPagoClt) cierras el archivo y retornas un valor solo si encuentras el registro buscado, si no existe eso resulta (eventualmente) en el mensaje de error "Too many open files".
Aparte de eso utilizas el operador "&" cuando deberías utilizar "&&", hay que revisar la documentación de SDL ya que este bloque es extremadamente largo:
if(event.key.keysym.sym==SDLK_a&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "a", 10, ROJO);
save_array(active_texbox,cant,'a');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_b&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "b", 10, ROJO);
save_array(active_texbox,cant,'b');
cant++;
sig+=10;
}
else if(event.key.keysym.sym==SDLK_c&EVENTOCLICK)
{
SDL_printf(sig, sig_y, "c", 10, ROJO);
save_array(active_texbox,cant,'c');
cant++;
sig+=10;
}
/* ... */
Por ultimo tienes otro error lógico en las funciones de posicionamiento en el archivo:
int getPos(char *cedulaPago)
{
FILE *dato = fopen("fixcom.fix", "rb");
int pos=0;
//fseek(dato, 0L, SEEK_SET);
verificarFichero(dato,"dato");
while(fread(&usuario, sizeof(struct user), 1, dato)!=0){
pos++;
if(strcmp(cedulaPago, usuario.cedula)==0){
fclose(dato);
return pos;
}
}
}
void getPosFich(int pos, FILE *filePtr)
{
fseek(filePtr, pos*sizeof(struct user), SEEK_SET);
}
El problema: si el registro buscado es el primero el desplazamiento desde el inicio del archivo (indicado por SEEK_SET) debe ser cero mientras que tu indicas que es uno, mismo caso con cualquier otro registro (debes utilizar indices de posición similares al uso de un array: 0 .. N-1).
Un saludo
Hola gracias por responder rir3760: claro siempre empieza desde 0, es que confundes esta sintaxis getPosFich(posFich-1, modifFichero);, porque le paso los valores devueltos por getPos() -1.
He cerrado todos los ficheros al terminar el evento, pero el flujo de ejecucion aun sigue cortandose !!