-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathARCHIVOS.C
164 lines (140 loc) · 5.4 KB
/
ARCHIVOS.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
/****************************************************************************/
/* ARCHIVOS.C */
/* En este m¢dulo se encuentran las funciones que cargan, graban y orde- */
/* nar los datos de los diquetes catalogados. */
/* */
/****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <dir.h>
#include <stdlib.h>
#include "archivos.h"
#include "video.h"
/* Definimos un puntero a la estructura de la base de datos */
struct discos *disco;
/* Necesitamos acceder a las tres siguientes variables para restaurar
el modo de video y el directorio de trabajo */
extern char modo_anterior;
extern char unidad_anterior,direc_anterior[MAXDIR];
/* De esta forma podemos acceder a estas dos funciones de DISCAT.C */
unsigned char cogetecla(void);
unsigned char testmouse(int *coordx,int *coordy);
/* LOAD. Esta funci¢n carga los datos almacenados en el archivo
'nombrearchivo'. */
void load(char *nombrearchivo){
int cont=0; /* Declaramos un contador */
struct archivos temp; /* Declaramos una estructura para almacenar
temporalmente los datos de un fichero */
FILE *stream;
/* Si no se puede abrir 'nombrearchivo'... */
if ((stream = fopen(nombrearchivo, "rb")) == NULL) {
/* Necesitamos acceder a las tres siguientes variables para restaurar
el modo de video y el directorio de trabajo */
extern char modo_anterior;
extern char unidad_anterior,direc_anterior[];
char temp[35];
cventana(80,120,300,145);
print("ERROR",17,11,15,145);
strcpy(temp,"No se pudo leer ");
strcat(temp,nombrearchivo);
print(temp,(40-strlen(temp))/2,13,15,145);
while (cogetecla()==1 && !testmouse(NULL,NULL));
modovideo(modo_anterior);
setdisk(unidad_anterior);
chdir(direc_anterior);
exit(1);
}
/* Leemos los byteslibres y la nota del disco */
fread(&disco->byteslibres,sizeof(disco->byteslibres),1,stream);
fread(&disco->nota,sizeof(disco->nota),1,stream);
/* Y ahora leemos los datos correspondientes a los archivos catalogados */
while (1) {
/* Cargamos los datos de un archivo en temp */
fread(&temp, sizeof(temp), 1, stream);
/* Y lo a¤adimos a la estructura disco */
disco->archivo[cont]=temp;
/* Si no hay m s datos identificamos el final
de la matriz discos->archivo[] */
if (feof(stream)) {
disco->archivo[cont].nombre[0]=0;
break;
}
cont++; /* Incrementamos el contador */
};
fclose(stream); /* cerramos el fichero */
}
/* SAVE. Esta funci¢n graba los datos en el archivo 'nombrearchivo'. */
void save(char *nombrearchivo){
int cont=0; /* Declaramos un contador */
struct archivos temp; /* Declaramos una estructura para almacenar
teporalmente los datos de un fichero */
FILE *stream;
/* Si no se puede abrir el archivo... */
if ((stream = fopen(nombrearchivo, "wb")) == NULL) {
/* Necesitamos acceder a las tres siguientes variables para restaurar
el modo de video y el directorio de trabajo */
extern char modo_anterior;
extern char unidad_anterior,direc_anterior[];
char temp[35];
cventana(80,120,300,145);
print("ERROR",17,11,15,145);
strcpy(temp,"No se pudo grabar ");
strcat(temp,nombrearchivo);
print(temp,(40-strlen(temp))/2,13,15,145);
while (cogetecla()==1 && !testmouse(NULL,NULL));
modovideo(modo_anterior);
setdisk(unidad_anterior);
chdir(direc_anterior);
exit(1);
}
/* Grabamos los bytes libres y la nota del disco */
fwrite(&disco->byteslibres,sizeof(disco->byteslibres),1,stream);
fwrite(&disco->nota,sizeof(disco->nota),1,stream);
/* Mientras queden datos... */
while (disco->archivo[cont].nombre[0]!=0) {
/* Copiamos la informaci¢n de un archivo a temp */
temp=disco->archivo[cont];
/* grabamos la estructura temp */
fwrite(&temp, sizeof(temp), 1, stream);
cont++; /* Incrementamos el contador */
}
fclose(stream); /* cerramos el fichero */
}
/* ORDENAR(). Ordena los archivos de 'disco' por orden alfab‚tico mediante
el m‚todo de la burbuja, es decir, se compara cada nombre con el siguiente,
si el primero es mayor que el segundo se intercambian. As¡ hasta el £ltimo;
de esta forma el nombre mayor queda el £ltimo. Ahora se repite la operaci¢n
hasta el pen£ltimo, despu‚s hasta el antepen£ltimo y as¡ sucesivamente hasta
que se acaben los nombres o no se realize ning£n cambio. */
void ordenar(void){
unsigned char cambio=TRUE;
unsigned n=0;
unsigned conta;
struct archivos temp;
/* Calculamos el n£mero de registros */
while (disco->archivo[n].nombre[0]!=0) n++;
/* Mientras haya alg£n cambio y n>0... */
while (cambio && n>0){
cambio=FALSE;
for (conta=1;conta<n;conta++) {
if (strcmp(disco->archivo[conta-1].nombre,
disco->archivo[conta].nombre)>0)
{
temp=disco->archivo[conta-1];
disco->archivo[conta-1]=disco->archivo[conta];
disco->archivo[conta]=temp;
cambio=TRUE;
}
if (strcmp(disco->archivo[conta-1].nombre,disco->archivo[conta].nombre)
==0 && ((strcmp(disco->archivo[conta-1].extension,
disco->archivo[conta].extension))>0))
{
temp=disco->archivo[conta-1];
disco->archivo[conta-1]=disco->archivo[conta];
disco->archivo[conta]=temp;
cambio=TRUE;
}
}
n--;
}
}