Aplicacion explota en varios stream (FILE *)

Iniciado por Fire544, 3 Diciembre 2012, 03:36 AM

0 Miembros y 2 Visitantes están viendo este tema.

Fire544

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.
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

naderST

#1
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.

durasno

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
Ahorrate una pregunta, lee el man

Fire544

#3
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 !!.
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

durasno

Usa la funcion perror() para saber cual puede ser la causa


Saludos
Ahorrate una pregunta, lee el man

Fire544

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 !!
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

Fire544

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);
             }
             }
     }




"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

durasno

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
Ahorrate una pregunta, lee el man

Fire544

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.
"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language