typedef struct
{
FILE* fp;
+ char* filename;
int next;
int more;
}
char* mergefile_makefilename(int i)
{
- size_t size = sizeof(MERGEFILE_TEMPLATE) + 20; /* 20 más para el int */
+ size_t size = sizeof(MERGEFILE_TEMPLATE) + 8; /* 8 más para el int */
char* filename = malloc(size);
if (!filename) return 0;
/* Hasta que me de la memoria para crear el nombre del archivo */
while (snprintf(filename, size, MERGEFILE_TEMPLATE, i) >= size) {
char* new;
- size += 20;
+ size += 8;
new = realloc(filename, size);
if (new) {
filename = new;
MERGEFILE* mergefile_new(int i)
{
MERGEFILE* mf = malloc(sizeof(MERGEFILE));
- char* filename = mergefile_makefilename(i);
- if (!mf || !filename) {
+ if (!mf) {
+ return 0;
+ }
+ /* asigno el nombre de archivo */
+ if (!(mf->filename = mergefile_makefilename(i))) {
free(mf);
- free(filename);
return 0;
}
/* abre archivo */
- mf->fp = fopen(filename, "rb");
- free(filename);
- if (!mf->fp) {
+ if (!(mf->fp = fopen(mf->filename, "rb"))) {
+ free(mf->filename);
free(mf);
return 0;
}
/* obtiene dato */
if (fscanf(mf->fp, "%i", &(mf->next)) <= 0) {
fclose(mf->fp);
+ free(mf->filename);
free(mf);
return 0;
}
{
assert(mf);
assert(mf->fp);
+ assert(mf->filename);
fclose(mf->fp);
+ remove(mf->filename);
+ free(mf->filename);
free(mf);
}
ret = mf->next;
/* obtiene dato, si no hay más, se activa el flag */
if (fscanf(mf->fp, "%i", &(mf->next)) <= 0) mf->more = 0;
- return mf->next;
+ return ret;
}
int mergefile_has_more(MERGEFILE* mf)
{
int n, min;
MERGEFILE** mfpool = malloc(sizeof(MERGEFILE) * i);
+ MERGEFILE* min_mf;
FILE* fp = fopen("salida.txt", "w");
assert(fp);
assert(mfpool);
+ printf("Abriendo archivos y buscando mínimo...\n");
for (n = 0; n < i; n++) {
mfpool[n] = mergefile_new(n);
assert(mfpool[n]);
+ printf("Archivo %i: leído = %i\n", n, mergefile_peek_next(mfpool[n]));
if (!n || mergefile_peek_next(mfpool[n]) < min) {
- min = mergefile_pop_next(mfpool[n]);
+ min = mergefile_peek_next(mfpool[n]);
+ min_mf = mfpool[n];
+ printf("min = %i\n", min);
}
}
+ printf("Iterando...\n");
while (1) {
- int current;
int assigned = 0;
/* guardo el mínimo en el archivo de salida */
fprintf(fp, "%i\n", min);
+ mergefile_pop_next(min_mf); /* lo saco del archivo */
/* obtengo el próximo mínimo */
for (n = 0; n < i; n++) {
+ if (mergefile_has_more(mfpool[n])) {
+ printf("Archivo %i: leído = %i\n", n, mergefile_peek_next(mfpool[n]));
+ } else {
+ printf("Archivo %i: No hay más datos\n", n);
+ }
if (mergefile_has_more(mfpool[n]) && (!assigned || mergefile_peek_next(mfpool[n]) < min)) {
assigned = 1;
- min = mergefile_pop_next(mfpool[n]);
+ min = mergefile_peek_next(mfpool[n]);
+ min_mf = mfpool[n];
+ printf("min = %i\n", min);
}
}
/* si no hay más datos en los archivos, salimos */