Mi problema es que cuando creo el archivo e inicializo el encabezado (numero de registros igual 0) funciona perfecto, pero cuando voy a leer luego el encabezado en ese campo esta un valor "extraño".
El problema principal se debe a que en la función "subMenu" abres el archivo en modo "a+t" y con ello todas las operaciones de escritura se realizaran al final del archivo
sin importar el uso de funciones de posicionamiento como fseek y rewind. En su lugar debes abrir el archivo en el modo "r+b" cuidando que antes de cualquier operación de escritura te posiciones al principio o final del archivo (dependiendo si vas a escribir el encabezado o agregar un registro) mediante la función fseek.
Ademas se debe cambiar/corregir una parte significativa del programa:
* Si declaras una macro no debes darle un nombre que inicie con un guion bajo ya que esos nombres se reservan para la implementación (algunos ejemplos son __DATE__, __FILE__, __LINE__, etc.).
* Cuando se declara una función con paréntesis vacíos:
int readInt();
/* ... */
void menu();
Ello indica un numero no determinado de argumentos, para indicar que no recibe argumentos debes utilizar "(void)".
* Si no utilizas los argumentos pasados mediante la linea de comandos cambia la definición de la función principal a "int main(void) ..." o "int main() ...".
* La biblioteca estándar de C no incluye una función con el nombre "fgetchar", en su lugar utiliza getchar o mejor todavía elimina por completo esa llamada.
* En el bloque de prototipos falta la declaración de la función "seeAll".
* En la función "subMenu" en la llamada a "readLine":
readLine(&buffer.firstName, TAM_CADENA);
El operador "dirección de" (el '&') esta de mas en su primer argumento, eliminalo.
* En la función "readInt" no se especifica el valor a retornar si ocurre un error y si la linea es demasiado larga el restante se quedara en el bufer de la entrada estándar (para el caso mejor utiliza scanf para leer el entero y a continuación descarta el resto de la linea con un bucle.
* En la función "readLine" si el ultimo carácter no es el avance de linea no es necesario sobrescribir este con un '\0' porque fgets lo agrega automáticamente. Y el tipo de retorno de getchar es
int, la función hay que cambiarla a:
void readLine (char cadena[], int tam)
{
if (fgets(cadena
, tam
, stdin
) != NULL
){ size_t i
= strlen(cadena
) - 1;
if (cadena[i] == '\n')
cadena[i] = '\0';
else {
int ch;
while ((ch
= getchar()) != EOF
&& ch
!= '\n') ;
}
}
}
* En la funcion "seeAll" el bucle para imprimir todos los registros:
while (fread (&buffer
, 1, header.
recordLength, fd
) == 1){ /* ... */
}
No funcionara correctamente, las razones de ello te las explique en tu tema
Funcion que no puede retornar un struct [C].
Un saludo