18 int cmp(void* x, void* y)
22 if (xx > yy) return 1;
23 if (xx < yy) return -1;
27 void buffer_dump(BUFFORD* b)
31 for (c = bufford_get_min(b); c; c = bufford_get_next(b, c))
36 int main(int argc, char* argv[])
40 BUFFORD* b = bufford_new(8, sizeof(int), &cmp);
42 if (!(fp = fopen(argv[1], "r"))) {
49 fscanf(fp, "%i", ®);
51 if (!bufford_push(b, ®)) break;
53 printf("Buffer lleno, hago el primer lote...\n");
57 while (!bufford_empty(b)) {
62 snprintf(filename, sizeof(filename), "sorted_chunk.%i", i);
63 if (!(fpo = fopen(filename, "w"))) {
68 printf("Creando lote %i:\n", i);
69 for (c = bufford_pop_min(b); c; c = bufford_pop_next(b, &x)) {
70 /* si hay un valor en la entrada, lo inserto */
71 if (!feof(fp)) fscanf(fp, "%i", &x);
72 if (!feof(fp) && !bufford_push(b, &x)) {
73 /* ERROR: no se pudo insertar */
82 fprintf(fpo, "%i\n", x);
85 printf("Lote %i finalizado!\n\n", i);
93 MERGEFILE** mfpool = malloc(sizeof(MERGEFILE) * i);
95 FILE* fp = fopen("salida.txt", "w");
98 printf("Abriendo archivos y buscando mínimo...\n");
99 for (n = 0; n < i; n++) {
100 mfpool[n] = mergefile_new(n);
102 printf("Archivo %i: leído = %i\n", n, mergefile_peek_next(mfpool[n]));
103 if (!n || mergefile_peek_next(mfpool[n]) < min) {
104 min = mergefile_peek_next(mfpool[n]);
106 printf("min = %i\n", min);
109 printf("Iterando...\n");
112 /* guardo el mínimo en el archivo de salida */
113 fprintf(fp, "%i\n", min);
114 mergefile_pop_next(min_mf); /* lo saco del archivo */
115 /* obtengo el próximo mínimo */
116 for (n = 0; n < i; n++) {
117 if (mergefile_has_more(mfpool[n])) {
118 printf("Archivo %i: leído = %i\n", n, mergefile_peek_next(mfpool[n]));
120 printf("Archivo %i: No hay más datos\n", n);
122 if (mergefile_has_more(mfpool[n]) && (!assigned || mergefile_peek_next(mfpool[n]) < min)) {
124 min = mergefile_peek_next(mfpool[n]);
126 printf("min = %i\n", min);
129 /* si no hay más datos en los archivos, salimos */
130 if (!assigned) break;
133 for (n = 0; n < i; n++) {
134 mergefile_delete(mfpool[n]);