17 #define MERGEFILE_TEMPLATE "sorted_chunk.%i"
28 char* mergefile_makefilename(int i)
30 size_t size = sizeof(MERGEFILE_TEMPLATE) + 8; /* 8 más para el int */
31 char* filename = malloc(size);
32 if (!filename) return 0;
33 /* Hasta que me de la memoria para crear el nombre del archivo */
34 while (snprintf(filename, size, MERGEFILE_TEMPLATE, i) >= size) {
37 new = realloc(filename, size);
48 MERGEFILE* mergefile_new(int i)
50 MERGEFILE* mf = malloc(sizeof(MERGEFILE));
54 /* asigno el nombre de archivo */
55 if (!(mf->filename = mergefile_makefilename(i))) {
60 if (!(mf->fp = fopen(mf->filename, "rb"))) {
66 if (fscanf(mf->fp, "%i", &(mf->next)) <= 0) {
76 void mergefile_delete(MERGEFILE* mf)
87 int mergefile_peek_next(MERGEFILE* mf)
95 int mergefile_pop_next(MERGEFILE* mf)
102 /* obtiene dato, si no hay más, se activa el flag */
103 if (fscanf(mf->fp, "%i", &(mf->next)) <= 0) mf->more = 0;
107 int mergefile_has_more(MERGEFILE* mf)
114 int cmp(void* x, void* y)
118 if (xx > yy) return 1;
119 if (xx < yy) return -1;
123 void buffer_dump(BUFFORD* b)
127 for (c = bufford_get_min(b); c; c = bufford_get_next(b, c))
132 int main(int argc, char* argv[])
136 BUFFORD* b = bufford_new(8, sizeof(int), &cmp);
138 if (!(fp = fopen(argv[1], "r"))) {
142 /* lleno el buffer */
145 fscanf(fp, "%i", ®);
147 if (!bufford_push(b, ®)) break;
149 printf("Buffer lleno, hago el primer lote...\n");
153 while (!bufford_empty(b)) {
158 snprintf(filename, sizeof(filename), "sorted_chunk.%i", i);
159 if (!(fpo = fopen(filename, "w"))) {
164 printf("Creando lote %i:\n", i);
165 for (c = bufford_pop_min(b); c; c = bufford_pop_next(b, &x)) {
166 /* si hay un valor en la entrada, lo inserto */
167 if (!feof(fp)) fscanf(fp, "%i", &x);
168 if (!feof(fp) && !bufford_push(b, &x)) {
169 /* ERROR: no se pudo insertar */
177 printf("%- 8i\t", x);
178 fprintf(fpo, "%i\n", x);
181 printf("Lote %i finalizado!\n\n", i);
189 MERGEFILE** mfpool = malloc(sizeof(MERGEFILE) * i);
191 FILE* fp = fopen("salida.txt", "w");
194 printf("Abriendo archivos y buscando mínimo...\n");
195 for (n = 0; n < i; n++) {
196 mfpool[n] = mergefile_new(n);
198 printf("Archivo %i: leído = %i\n", n, mergefile_peek_next(mfpool[n]));
199 if (!n || mergefile_peek_next(mfpool[n]) < min) {
200 min = mergefile_peek_next(mfpool[n]);
202 printf("min = %i\n", min);
205 printf("Iterando...\n");
208 /* guardo el mínimo en el archivo de salida */
209 fprintf(fp, "%i\n", min);
210 mergefile_pop_next(min_mf); /* lo saco del archivo */
211 /* obtengo el próximo mínimo */
212 for (n = 0; n < i; n++) {
213 if (mergefile_has_more(mfpool[n])) {
214 printf("Archivo %i: leído = %i\n", n, mergefile_peek_next(mfpool[n]));
216 printf("Archivo %i: No hay más datos\n", n);
218 if (mergefile_has_more(mfpool[n]) && (!assigned || mergefile_peek_next(mfpool[n]) < min)) {
220 min = mergefile_peek_next(mfpool[n]);
222 printf("min = %i\n", min);
225 /* si no hay más datos en los archivos, salimos */
226 if (!assigned) break;
229 for (n = 0; n < i; n++) {
230 mergefile_delete(mfpool[n]);