Вы находитесь на странице: 1из 6

#include <stdio.

h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define ERROR_ESCRITA "Error de escritura del archivo"


#define ERROR_APERTURA "Error abrir el archivo"
#define NOMBRE_FICHERO "personas.dat"
#define FICHERO_NUEVO "personas.new"
#define TIEMPO_DADO "tmp.dar"
#define MAX_NOMBRE 35
#define MAX_APELLIDO 50
#define MAX_NIF 9
#define MARCA_ESBORRAT '*'
#define MARCA_NO_ESBORRAT 'N'

typedef struct {
char nombre[MAX_NOMBRE+1];
char apellidos[MAX_APELLIDO+1];
int edad;
char nif[MAX_NIF+1];
char marcaEsborrat;
} Persona;

int menu();
int alta();
int baja();
int consultarPersona();
int modificacion();
int consultasborradas();
int borrarfichero();
int compactarfichero();
int accesodirecto();
int numeroderegistros();
int informe();
void entrarPersona(Persona *perso);
void escribirPersona(Persona perso);

int main()
{
int n;
do {
n=menu();
switch(n){
case 1: alta();break;
case 2: baja();break;
case 3: consultarPersona();break;
case 4: modificacion();break;
case 5: consultasborradas();break;
case 6: borrarfichero();break;
case 7: compactarfichero();break;
case 8: accesodirecto();break;
case 9: numeroderegistros();break;
case 10: generarinforme();break;
}
}while(n!=0);
return 0;
}

int menu(){
int n;

///deja introducir sólo valores entre 0-7


do{
system("clear || cls");
printf("\n\t\t\t\t**Menu**\n\n");
printf("\t\t\t\t1-Alta\n");
printf("\t\t\t\t2-Baja\n");
printf("\t\t\t\t3-Consultar Persona\n");
printf("\t\t\t\t4-Modificacion\n");
printf("\t\t\t\t5-Consultas Borradas\n");
printf("\t\t\t\t6-Borrar Ficheros\n");
printf("\t\t\t\t7-Compactar Fichero\n");
printf("\t\t\t\t8-Acceso Directo\n");
printf("\t\t\t\t9-Numero De Registro\n");
printf("\t\t\t\t10-Informe\n\n");
printf("\t\t\t\t0-Salida\n\n");
printf("\t\t\t\tOpciones entre (0 - 9): ");
scanf("%d",&n);while(getchar()!='\n');
}while(n>10 || n<0);
///n<=10 i n>=0
return n;
}

int alta(){ /// 1


Persona p1;
FILE *f1;
int n;
/// abrir para escribir en binario. Si existe el machaca sino el crea.
f1= fopen(NOMBRE_FICHERO,"ab");
if( f1 == NULL ) {
printf("Error al abrir el fichero ");
return -1;
}
entrarPersona(&p1);
n= fwrite(&p1,sizeof(Persona),1,f1);
if(n==0) {
printf("error de escritura");
return -1;
}
fclose(f1);
return 0;
}

int baja(){ /// 2


Persona p2;
FILE *f2;
int n;
char nifTmp[MAX_NIF+1];
f2 =fopen(NOMBRE_FICHERO,"rb+");
if ( f2 == NULL )
printf("\nIntroduce el NIF: ");
scanf("%9[^\n]",nifTmp); while(getchar()!='\n');
if((n=fread(&p2,sizeof(Persona),1,f2))!=1){
if(!feof(f2)){
if(n==0){printf("\nBaja:Error de lectura"); return -1;}
if(p2.marcaEsborrat!=MARCA_ESBORRAT && strcmp(p2.nif,nifTmp)==0){
if(fseek(f2,-(long)sizeof(Persona),SEEK_CUR)){return -2;} ///error
p2.marcaEsborrat='*';
n=fwrite(&p2,sizeof(Persona),1,f2);
if(n!=1){
printf("\nBaja: Error de escritura");
}
}
}
}
return 0;
}

int consultarPersona(){ /// 3


Persona p3;
FILE *f3;
int n;
///Abrir para leer con binario. El archivo debe existir.
f3= fopen(NOMBRE_FICHERO,"rb");
if( f3 == NULL ) {
printf("Error al abrir el fichero");
return -1;
}
do{
n = fread(&p3,sizeof(Persona), 1,f3);
if(!feof(f3)){
if(n==0) {
printf("Error de lectura");
}
escribirPersona(p3);
}
}while(!feof(f3));

fclose(f3);
printf("\n\noprime una tecla para continuar...");
getchar();
return 0;
}

int modificacion(){ /// 4


Persona p4;
FILE *f4;
int n;
char nifTmp[MAX_NIF+1];

f4 =fopen(NOMBRE_FICHERO,"rb+");
if ( f4 == NULL ) printf("error");
printf("\nIntroduccir el NIF: ");
scanf("%9[^\n]",nifTmp); while(getchar()!='\n');
do{
if((n=fread(&p4,sizeof(Persona),1,f4))!=1){ printf("error");return -1;}
if(!feof(f4)){
if(n==0){printf("\nBaja:Error de lectura"); return -2;}
if(p4.marcaEsborrat!=MARCA_ESBORRAT && strcmp(p4.nif,nifTmp)==0){
printf("\nLos datos actuales són: \n");
escribirPersona(p4);
printf("\nIntroduce los nuevos datos: \n");
entrarPersona(&p4);
n=fwrite(&p4,sizeof(Persona),1,f4);
if(n!=1){
printf("\nBaja: Error de escritura");
}
}
}

}while(!feof(f4));
return 0;
}

int consultasborradas(){ /// 5

{
Persona p5;
FILE *f5;
int n;
f5= fopen(NOMBRE_FICHERO,"rb");
if( f5 == NULL ) {
printf("Error al abrir el fichero");
return -1;
}
do{
n = fread(&p5,sizeof(Persona), 1,f5);
if(!feof(f5)){
if(n==0) {
printf("Error de lectura");
}
escribirPersona(p5);
}
}while(!feof(f5));

fclose(f5);
printf("\n\nOprime una tecla para continuar...");
getchar();
return 0;
}

}
int borrarfichero(){ /// 6

char borrar;
do{
printf("\nDesea borrar el fichero (s/n): ");
scanf("%c",&borrar); while(getchar()!='\n');
}while(borrar!='s' && borrar!='n');
if(borrar=='s') unlink("personas.dat");
return 0;
}

int compactarfichero(){ /// 7

Persona p7;
FILE *f1;
FILE *f2;
int n;
f1= fopen(NOMBRE_FICHERO,"rb");
if(f1==NULL) {
printf("Error al abrir el fichero");
return -1;
}

f2= fopen("personas.new","wb");
if(f2==NULL) {
printf("Error al abrir el fichero");
return -1;
}

do{
n = fread(&p7,sizeof(Persona), 1,f1);
if(!feof(f1)){
if(n==0) {
printf("Error de lectura");
return -2;
}
if(p7.marcaEsborrat!='*'){
n = fwrite(&p7,sizeof(Persona), 1,f2);
}
}

}while(!feof(f1));

fclose(f1);
fclose(f2);

unlink("personas.dat");

if(rename("tmp.dar","personas.dat")==-1){
printf("error de rencontrada");
}
printf("\n\noprime una tecla para continuar...");
getchar();
return 0;
}

int accesodirecto(){ /// 8

Persona p8;
FILE *f8;
int n;
int posicion=0;
int registros=0;

///abrir
f8= fopen(NOMBRE_FICHERO,"rb");
if(f8==NULL) {
printf("Error al abrir el fichero");
return -1;
}
printf("buscar el registro: ");
scanf("%d",&posicion);

while(posicion<=0 || posicion>registros);

n = posicion-1;
fseek(f8, (long) (n*sizeof(Persona)),SEEK_SET);

///leer
n = fread(&p8,sizeof(Persona), 1, f8);
if(!feof(f8)){
if(n==0){
printf("Error de lectura");
}
///imprimir
escribirPersona(p8);
getchar();
}

///cerrar f

fclose(f8);
return 0;
}

int numeroderegistros(long *nRegistros){ /// 9

FILE *f9;
*nRegistros=0;

f9 = fopen("personas.dat","rb");
if(f9==NULL) {
printf("error al abrir el fichero");
return -1;
}

fseek(f9 , (long) 0L , SEEK_END); /// situarse en el último registro


*nRegistros= ftell (f9);/// calcular el que ocupan los n-1 registros
*nRegistros= *nRegistros/sizeof(Persona); /// calcular el número de registros
/// Además deberíamos restar los registros marcados para borrar

printf("\nel numero de registros: %li",*nRegistros);


fclose(f9);

getchar();
return 0;
}

int informe(){ /// 10

Persona p10;
FILE *f10;
int n;

void entrarPersona(Persona *perso){


printf("\nIntroduce el nombre: ");
scanf("%15[^\n]",perso->nombre);while(getchar()!='\n');
printf("\nIntroduce los apellidos: ");
scanf("%35[^\n]",perso->apellidos);while(getchar()!='\n');
printf("\nIntroduce edad: ");
scanf("%d",&perso->edad);while(getchar()!='\n');
printf("\nIntroduce el NIF: ");
scanf("%9[^\n]",perso->nif);while(getchar()!='\n');
perso->marcaEsborrat=MARCA_NO_ESBORRAT;
}

void escribirPersona(Persona perso){


printf("\nel nombre: %s", perso.nombre);
printf("\nlos apellidos: %s",perso.apellidos);
printf("\nedad: %d",perso.edad);
printf("\nel NIF: %s\n",perso.nif);
}

Вам также может понравиться