Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1201
I Semestre 2010
[<=] [home] [<>] [\/] [=>]
CI-1201 Programación II

Tarea #2 [solución]

Reacomodo de la clase readDirPortable

/// Ejemplo de uso de \c readDirPortable.
void ejemplo() {
    using namespace std;
    readDirPortable hFile("../");
    hFile.setMask( "../*.*" ); // listado del directorio padre
    while ( hFile.hasNext() ) {
        cout << ' ' << setw(00) << hFile.getName() << endl;
        // ...
        hFile.next(); // siguiente archivo
    }
}
Figura 1: Uso del iterador readDirPortable

      El problema de la clase readDirPortable es que no se comporta como los iteradores Java, pues la invocación al método next() debe aparecer al final del ciclo, como se muestra en la Figura 1.

/// Ejemplo de uso de \c readDir.
void ejemplo() {
    using namespace std;
    readDir hFile("../");
    hFile.setMask( "../*.*" ); // listado del directorio padre
    while ( hFile.hasNext() ) {
        readDir& current = hFile.next(); // siguiente archivo
        // ...
        cout << ' ' << setw(00) << current.getName() << endl;
    }
}
Figura 2: Uso del iterador readDir

      En la Figura 2 se muestra que para la nueva clase readDir es necesario invocar el método next() al principio de cada nueva iteración, lo que contraste con la invocación al final del ciclo que requiere la clase readDirPortable. Implemente la nueva clase readDir.

Consulta:
Profe: ¿Solo hay que cambiar de lugar el hFile? Para eso no hace falta modificar readDirPortable.
Respuesta:
El ejemplo que está incluido en el el archivo readDirPortable.cpp saca la lista de archivos y carpetas de [ .. ] que es la carpeta padre:
#if 1 // programa de ejemplo
// ...
void ejemplo() {{ // test::ejemplo()
    using namespace std;
    readDirPortable hFile("../");
    hFile.setMask( "../*.*" ); // listado del directorio padre
    while ( hFile.hasNext() ) {
        // ...
        cout << ' ' << setw(00) << hFile.getName() << endl;
        hFile.next(); // siguiente nombre de archivo
    }
}}
Para obtener el listado de la carpeta actual hay que modificar el ejemplo usando una máscara de archivos diferente:
     hFile.setMask( "./*.*" ); // listado del directorio actual
Una vez que ya readDir funciona, el ejemplo quedaría así:
#if 1 // programa de ejemplo
// ...
void ejemplo() {{ // test::ejemplo()
    using namespace std;
    readDirPortable hFile("../");
    hFile.setMask( "../*.*" ); // listado del directorio padre
    while ( hFile.hasNext() ) {
        hFile.next(); // [DE PRIMERO] siguiente nombre de archivo
        // ...
        cout << ' ' << setw(00) << hFile.getName() << endl;
    }
}}

Si al usar readDir se pone la orden de avance hFile.next() al final del ciclo, el resultado es una falla (error) en la primera iteración, pues el valor de hFile no sería el correcto porque todavía no ha quedado sido inicializado por next().

      Entregue su tarea por correo electrónico, como lo hizo anteriormente.

[mailto:] Entrega de Tareas

Tiempo de entrega: 7 días
Modalidad: En parejas

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2010
Derechos de autor reservados © 2010
[home] <> [/\]