Tengo desde hace varios meses la idea de una Aplicacion para escritorio y Movil con bastantes alcances y aunque ya he avanzado algo, todavía me falta terminar de armar el rompecabezas de Pedasos de código que tengo hasta ahorita.
Tal vez en 2 meses termine y les comparta la aplicación.
Eso puede dar problemas, por que si ya esta abierto por tu programa te puede dar error de lectura al momento de calular el tamaño de tu archivo. (Cantida de registros) y tal vez por eso no entre al for.
Estoy trabajando en algo similar, pero lo quiero haces mas generico usando una tabla de estados (AUTOMATA) para determinar en que punto de la peticion estoy, ya sea el GET el host, las cookies la conexion entre otros.
Si tengo unos 15.000 registros cual de los 2 métodos utilizarían, o tal vez haya alguna otra manera más eficiente que desconozco
Si tienes esa cantidad de registros yo utilizaria la primera opcion que dijiste, tener un campo donde este marcado si es registro activo, o eliminado.
El detalle esta en que dado que estas usando registros de longitud variable (Modo texto) y no modo binario es la opcion mas adecuada.
Tendrías que tener un programa adiconal que haga el trabajo pesado (Optimizar la base de datos) quitando los registros marcados como eliminados para NO ocupar mas espacio del necesario.
Con registros binarios (DE LONGITUD FIJA) es mas facil ya que es mas rapido dejar un segmento de X tamaño en ceros (NULL) y posteriormente ocuparlo con alguno de los registros nuevos.
O con ruta relativa (relativa al directorio actual de trabajo), suponiendo que estemos ya en el directorio usuario y asumiendo que el directorioX exita:
Si hay inconveniente ya que si por ejemplo en el realloc se mueve el bloque de memoria a otro lado, b va a seguir con el mismo apuntador.
Esto es
B apunta a 1000 (Direccion de memoria) Se pide a reelloc que reasigne el espacio para agregar X cantidad adicional a la existente. Realloc mueve el bloque que estaba en 1000 al bloque 2000 y retorna la nueva dirección de memoria Si B no se iguala a lo que devuelva realloc, entonces B seguira apuntado a 1000, si, ahi siguen tus valores anteriores, pero digamos que existe una variable C en la direccion 1003, entonces cuando tu escribas en tu apuntador B en esa posicion, estaras sobreescribiendo la variable C.
¿Que es lo que ocurre si hago free ( b ); y continuo usando a?
al hacer free, el programa marca el segmento de memoria dado como libre y si lo sigues usando podria ser sobreescrito en cualquiero otro momento por otra variable de tu programa.
¿El valor de retorno de realloc apunta a la nueva dirección con los datos que contenía el primer argumento (en este caso a[0] debería ser 20 y tendría que tener espacio para un int más)?
Si el valore regresado es el nuevo, podria ser el mismo o no, sin embargo veo que estas asignando a la variable "a" pero sigues usando "b", en el caso de que te devuelva una direccion diferente, b ya no aputara mas a un rango de memoria "asignado". b continua con una copia vieje del apuntador.
Por cierto asegurate de Inicializar la variable que le pasas por primera vez a realloc en NULL ya que es posible que contenga basura en la memoria y te marque segment fault Tengo aqui un video que realice sobre el tema: