-
Notifications
You must be signed in to change notification settings - Fork 0
/
ArchivoPrincipalABM.c
291 lines (271 loc) · 7.65 KB
/
ArchivoPrincipalABM.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
/*
sizeof(struct persona) es un tipo de dato y es lo importante a la hora de copiar los datos de memoria. Esto es lo que se pone a la hora del size of.
sizeof(struct persona alu[]) seria el tamaño de un puntero
Leer Arch
para leer el archivo hay que
fileSize
fseek mueve desde y hasta donde yo quiero pero tengo que tener cuidado de no pasarme del fin del archivo ni del principio.
parametros
*primer parametro para quien
*cuanto me quiero mover
*SEEKSET||SEEKCUR||SEEKEND en seek set se pueden poner numeros positivos y en end negativos, porque nos movemos del inicio para adelante en el caso de seekset y del fin para atras en el caso de
seek end. Si ponemos un valor positivo en seekend nos pasariamos del archivo y está mal.
Ejemplo
fseek(pf,oL,SEEKEND);
L
*/
// structuras abm de estructuras
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 100
#define ALTA 1
#define BAJA 2
#define MODIF 3
#define LISTA 4
#define SALIR 5
#define LNOM 32
#define LTEL 16
struct fecha
{
int d,m,a;
};
struct persona
{
char nombre [LNOM];
char tel [LTEL];
int dni;
struct fecha nacim;
};
int menu();
int altas (struct persona l[], int cant);
int ingresarCadena(char cad[],int tam,char mensaje[]);
int buscar(struct persona l[], int desde, int hasta, char busc[]);
int bajas (struct persona l[], int cant);
void ordenar(struct persona l[], int n);
void sacarEnterCola(void);
void listar (struct persona l[],int n);
void modificar (struct persona l[], int n);
void remplazar(struct persona l[],int cant,int pos,char nom[]);
void guardararchivos(struct persona alu[], int cant);
long int filesize(FILE*pf);
int leerarchivos(struct persona alu[]);
int main (void)
{
struct persona alu[MAX];
int cant=0, opcion;
while ((opcion =menu())!=SALIR)
{
switch (opcion)
{
case ALTA:
//printf("hola entraste\n");
cant=altas(alu,cant);
guardararchivos(alu,cant);
ordenar(alu,cant);
break;
case BAJA:
cant=bajas(alu,cant);// bajas no desordena por que se mueve todo uno para arriba.
break;
case MODIF:
modificar(alu,cant);
ordenar(alu,cant);// si hace falta
break;
case LISTA:
listar(alu,cant);
break;
}
}
return 0;
}
/*int menu(void)
{
int opc;
printf("1_Alta\n2_Baja\n3_Modif\n4_Listar\n5_Salir\n");
scanf("%d",&opc);//siempre hay que sacar la cola del teclado
fgetc("")
printf("\n");
return opc;
}*/
int menu(void)
{
int opc;
do {
printf("1.Altas\n");
printf("2.Bajas\n");
printf("3.Modificaciones\n");
printf("4.Listas\n");
printf("5.Salir\n");
printf("Opción: ");
scanf("%d",&opc); sacarEnterCola(); // se saca en el enter del buffer de teclado
}
while(opc<ALTA||opc>SALIR);
return opc;
}
int altas (struct persona l[], int cant)
{
char nom[LNOM];
ingresarCadena(nom,LNOM,"Nombre: ");
while(cant <MAX && strlen(nom)>0)
{
strcpy(l[cant].nombre,nom);
ingresarCadena(l[cant].tel,LTEL,"TE: ");
printf("DNI: ");
scanf("%d", &l[cant].dni);sacarEnterCola();
printf("Fecha nac(d/m/a)");
scanf("%d/%d/%d", &l[cant].nacim.d,&l[cant].nacim.m,&l[cant].nacim.a);
fgetc(stdin);
cant++;
if(cant<MAX)
ingresarCadena(nom,LNOM,"Nom: ");
}
return cant;
}
int ingresarCadena(char cad[],int tam,char mensaje[])
{
int i;
printf("%s",mensaje );
fgets (cad,tam,stdin);
i=0;
while (cad[i]!='\n'&& cad[i] !='\0')
i++;
if (cad[i]=='\0')
while(fgetc(stdin)!='\n');
else
cad[i]='\0';
return i;
}
int buscar(struct persona l[], int desde, int hasta, char busc[])
{
while(desde<hasta && strstr(l[desde].nombre,busc)==NULL)
desde++;
return desde<hasta?desde:-1; //si desde hasta es verdadero devuelve desde sino devuelve -1
}
int bajas(struct persona l[], int cant)
{
int j, desde;
char nom[LNOM], opc;
ingresarCadena(nom, LNOM, "Nom: ");
while (cant > 0 && strlen(nom) > 0)
{
desde = buscar(l, 0, cant, nom);
while (desde != -1 && desde < cant)
{
printf("%s", l[desde].nombre);
printf("desea darle la baja?(S/N)\n");
scanf("%c", &opc);
sacarEnterCola();
if (toupper(opc) == 'S')
{
cant--;
for (j = desde; j < cant; j++)
l[j] = l[j + 1];
desde = buscar(l, desde, cant, nom);
}
else
{
desde = buscar(l, desde + 1, cant, nom);
}
}
ingresarCadena(nom, LNOM, "Nom: ");
}
return cant;
}
void ordenar(struct persona l[], int n)
{
int ordenado=0,i=0,j;
struct persona aux;
while(!ordenado)
{
ordenado=1;
for(j=0;j<n-1-i;j++)
if(strcmp(l[j].nombre,l[j+1].nombre)>0)
{
ordenado=0;
aux=l[j];
l[j]=l[j+1];
l[j+1]=aux;
}
i++;
}
}
void sacarEnterCola(void)
{
while(fgetc(stdin)!='\n');
}
void listar (struct persona l[],int n)
{
for (int i = 0; i < n; ++i)
{
printf("%s\n", l[i].nombre);
printf("%s\n", l[i].tel);
printf("%d\n", l[i].dni);
printf("%d/%d/%d\n", l[i].nacim.d,l[i].nacim.m,l[i].nacim.a);
}
}
void modificar (struct persona l[], int n)
{
int esta;
char nom[LNOM];
ingresarCadena(nom,LNOM,"Nombre: ");
esta=buscar(l, 0, n, nom);
if (esta!=-1)
{
remplazar(l,n,esta,nom);
}
else
{
printf("el nombre no se encuentra\n");
}
}
void remplazar(struct persona l[],int cant,int pos,char nom[])
{
strcpy(l[pos].nombre,nom);
ingresarCadena(l[pos].tel,LTEL,"TE: ");
printf("DNI: ");
scanf("%d", &l[pos].dni);sacarEnterCola();
printf("Fecha nac(d/m/a)");
scanf("%d/%d/%d", &l[pos].nacim.d,&l[pos].nacim.m,&l[pos].nacim.a);
printf("se remplazo correctamente");
fgetc(stdin);
}
void guardararchivos(struct persona alu[], int cant)
{
FILE *pf;
pf = fopen("lista.dat", "wb"); //abro el archivo lista.dat donde voy a escribir (para guardarlo) y es binario por el .dat
if (pf) //Si pude abrir el archivo quiere decir esto. Si pude, voy a guardar mis datos en el archivo.
{
fwrite(alu, sizeof(struct persona), cant, pf); //le paso: donde esta la info a guardar(le paso el vector, es decir, la dirección del vector, le paso el tamaño, para eso uso SIZEOF, le paso la cantidad de registros que los saco de CANT Y por último el archivo pf
fclose(pf); //Cierro el archivo
}
else
{
printf("No se pudo abrir el archivo\n");
}
}
int leerarchivos(struct persona alu[])
{
FILE * pf = fopen("Lista.dat", "rb"); // inicializo y abro mi archivo
int cant = 0; //variable para guardar la cantidad de registros. Lo inicializa en cero, por que si no pude abrir el archivo, va a devolver cero
if (pf) //esto pregunta SI PUDE ABRIR EL ARCHIVO
{
cant = filesize(pf) / sizeof(struct persona); //esto da la cantidad de registros que hay.
fread(alu, sizeof(struct persona), cant, pf); //primer parametro la dirección deonde lo guardo (el vector), el tamaño de la estructura el segundo, la cantidad de registros y el archivo
fclose(pf);
}
else
{
printf("No se pudo leer el archivo\n");
}
return cant;
}
long int filesize(FILE*pf) //recibe un puntero a FILE
{
long int posicionactual, posicionfinal; //Long INT por que esto va a devolver eso el ftell (devuelve long int)
posicionactual = ftell(pf); //me dice a donde esta el indicador del archivo (que posición)
fseek(pf,0L,SEEK_END); //función que permite mover la posición dentro del archivo, le tengo que decir cuantos lugares me quiero mover y respecto de quien. Se permite mover al comienzo, posición actual o al final (byte que le sigue a lo último escrito). Se puede usar seekend, seekcur o seekset. La "L" es por ser LONG INT.
posicionfinal = ftell(pf); //le pregunto la posición actual que es la final, ahora tnego inicio y fin.
fseek(pf, posicionactual, SEEK_SET); //lo vuelvo a mover al inicio, lo muevo hacia el inicio desde "poisicionesactuales
return posicionfinal;
}