Muy buenas.
Pues tu programa, algo modificado para poder borrar y editar registros quedaria mas o menos como se muestra a continuacion. Se puede y, de hecho, se debe mejorar. Como ha comentado class_OpenGL deberias hacer que trabajara con una copia en memoria para trabajar con ella y el resultado volcarlo despues en el archivo. La modificacion es sustancial.
Sin mas demora aqui va tu programa medianamente funcional. Repasalo, intenta entender porque se hace cada cosa. Esta enteramente basado en funciones de libreria estandar. No encontraras problemas en seguirlo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#define CLSCR "cls"
#else
#define CLSCR "clear"
#endif
typedef struct {
char nombre[35];
char mail[25];
char telefono[14];
} Contacto;
const char* nombreArchivo = "agenda.bin";
void menu();
Contacto crearContacto();
void guardarContacto();
void mostrarAgenda();
void borrarContacto();
void modificarContacto();
void pausar();
int main() {
menu();
return 0;
}
void menu() {
int opcion;
do {
printf("1. Crear contacto\n"); printf("2. Consultar agenda\n"); printf("3. Borrar contacto\n"); printf("4. Modificar contacto\n"); printf("Ingresa una opcion: ");
if (opcion > 0 && opcion < 6) {
switch (opcion) {
case 1:
guardarContacto();
break;
case 2:
mostrarAgenda();
break;
case 3:
borrarContacto();
break;
case 4:
modificarContacto();
break;
case 5:
pausar();
break;
}
}
else {
printf("\nOpcion no contemplada\n"); pausar();
}
} while (opcion != 5);
}
Contacto crearContacto() {
Contacto contacto;
memset(&contacto
, 0, sizeof(Contacto
));
fgets(contacto.
nombre, sizeof(contacto.
nombre), stdin
); contacto.
nombre[strlen(contacto.
nombre) - 1] = '\0'; fgets(contacto.
mail, sizeof(contacto.
mail), stdin
); contacto.
mail[strlen(contacto.
mail) - 1] = '\0'; fgets(contacto.
telefono, sizeof(contacto.
telefono), stdin
); contacto.
telefono[strlen(contacto.
telefono) - 1] = '\0';
return contacto;
}
void guardarContacto() {
FILE *file;
Contacto contacto;
long int fcur; // Actual posicion dentro del archivo
long int fend; // Posicion de final de archivo
char c; // Caracter adquirido
file
= fopen(nombreArchivo
, "rb"); // Miro si el archivo existe if(file == NULL) { // No existe
file
= fopen(nombreArchivo
, "w+b"); // Pues lo abro nuevo if(file == NULL) { // No se ha podido crear
printf("No se ha podido generar un archivo para la agenda\n"); pausar();
}
else { // Si se ha podido crear. Guardo el primer registro
contacto = crearContacto();
fwrite(&contacto
, sizeof(contacto
), 1, file
); }
}
else { // Existe el archivo. Busco en el un registro vacio
if(c == '\0') {
fcur
= ftell(file
); // Encontrado en el primer registro }
else {
fseek(file
, 0, SEEK_END
); fseek(file
, 0, SEEK_SET
); while((c
= fgetc(file
)) != '\0' && ftell(file
) < fend
) { fseek(file
, sizeof(Contacto
), SEEK_CUR
); }
fcur
= ftell(file
); // Encontrado en posteriores registros if(fcur == fend) { // Si no hay registros vacios
file
= fopen(nombreArchivo
, "ab"); if(file == NULL) {
printf("No se ha podido generar un archivo para la agenda\n"); pausar();
}
else {
contacto = crearContacto();
fwrite(&contacto
, sizeof(contacto
), 1, file
); // Anado mi registro al final }
}
else {
file
= fopen(nombreArchivo
, "r+b"); if(file == NULL) {
printf("No se ha podido generar un archivo para la agenda\n"); pausar();
}
else {
fseek(file
, fcur
, SEEK_SET
); contacto = crearContacto();
fwrite(&contacto
, sizeof(contacto
), 1, file
); // Si habia vacio lo guardo en el }
}
}
}
}
void mostrarAgenda() {
FILE
* file
= fopen(nombreArchivo
, "rb"); Contacto contacto;
int i;
if(file == NULL) {
printf("Error al intentar acceder al archivo\n"); }
else {
printf("%s %-35s %-25s %-14s\n", "ID", "Nombre", "Correo-e", "Telefono"); for(i = 0; i < 3+36+26+14; ++i)
i = 0;
while (fread(&contacto
, sizeof(Contacto
), 1, file
)) { i++;
printf("%-2u %-35s %-25s %-14s\n", i
, contacto.
nombre, contacto.
mail, contacto.
telefono); }
}
pausar();
}
void borrarContacto() {
FILE
*file
= fopen(nombreArchivo
, "r+b"); Contacto vacio;
int buscar;
memset(&vacio
, 0, sizeof(Contacto
));
printf("BORRAR UN CONTACTO\n"); printf("==================\n\n");
if(file != NULL)
{
printf("Ingresa el ID de registro que deseas borrar: "); --buscar;
fseek(file
, 0, SEEK_END
); if(buscar
* sizeof(Contacto
) <= ftell(file
)) {
fseek(file
, buscar
* sizeof(Contacto
), SEEK_SET
); fwrite(&vacio
, sizeof(Contacto
), 1, file
); }
else {
printf("El indice proporcionado no corresponde a ninguna entrada\n\n"); }
}
else {
printf("No existe ninguna entrada en la agenda"); }
pausar();
}
void modificarContacto() {
FILE
*file
= fopen(nombreArchivo
, "r+b"); Contacto contacto;
int buscar;
printf("MODIFICAR UN CONTACTO\n"); printf("=====================\n\n");
if(file != NULL) {
printf("Ingresa el ID de registro que deseas modificar: "); --buscar;
fseek(file
, 0, SEEK_END
); if(buscar
* sizeof(Contacto
) <= ftell(file
)) {
contacto = crearContacto();
fseek(file
, buscar
* sizeof(Contacto
), SEEK_SET
); fwrite(&contacto
, sizeof(Contacto
), 1, file
); }
else {
printf("El indice proporcionado no corresponde a ninguna entrada\n\n"); }
}
else {
printf("No existe ninguna entrada en la agenda\n\n"); }
pausar();
}
void pausar() {
char c;
printf("Presione ENTER para continuar..."); }