Recorrer un archivo recursivamente.

Iniciado por MatiDiyo, 5 Septiembre 2018, 16:33 PM

0 Miembros y 1 Visitante están viendo este tema.

MatiDiyo

Hola gente que tal?

Estoy atorado en un ejercicio de recursividad, en el cual tengo que buscar el menor elemento de un archivo de enteros. No le puedo encontrar la forma de recorrer el archivo recursivamente.


#include <windows.h>
#include <stdio.h>
#include <conio.h>

int main()
{
   FILE *fp;
   int *datos;

   printf("%i ", BuscarMenorArchivo_Recursiva(&fp, &datos));


}

int BuscarMenorArchivo_Recursiva(FILE *fp, int *datos)
{
   fp = fopen("datos.dat", "rb");

   fread(datos, sizeof(int), 1, archi);

   int menor = (*datos);

   if(feof(fp) != NULL)
   {
       menor = BuscarMenorArchivo_Recursiva(archi, datos);

       fread(datos, sizeof(int), 1, fp);

       if( (*datos) < menor)
           menor = (*datos);
   }

   fclose(fp);
   return menor;
}


Saludos gente  ;D

MAFUS

Para hacer algo bonito debes hacer uso de dos funciones: Una que usarás de interfaz y la otra quien realmente trabajará con la recursión.

Cuidado que el archivo puede estar vacío y deberías comprobar eso antes de usar estas funciones. Otra idea sería modificar la función inicial para que devuelva si ha habido error accediendo al archivo o éste se encuentra vacío y devuelva por referencia el valor conseguido.

static int f_interno(FILE *fp, int menor) {
    if(!feof(fp)) {
        int actual;
        int siguiente;
        fread(&actual, sizeof(int), 1, fp);
        siguiente = f_interno(fp, menor);
        menor = actual<siguiente? actual : siguiente;
    }
    return menor;
}

int f(FILE *fp) {
    int menor;
    fread(&menor, sizeof(int), 1, fp);
    menor = f_interno(fp, menor);

    return menor;
}

MatiDiyo

Hola MAFUS, gracias por la ayuda el código funciona de maravilla. Aunque tengo una duda del porque hiciste la función con el "static".

Muchas gracias y saludos  ;D

MAFUS

Sirve para que un objeto global no sea visto desde fuera del archivo, así si hicieras una librería esa sería la forma de ocultar esas función que no quieres que la gente use. Cómo un método private en POO.

MatiDiyo

Gracias por el dato, no lo sabía.

Saludos