save()

save(<nombre de archivo>, <OFFSET dato>, <sizeof(dato)>)

Descripción:

Graba un bloque de datos desde la memoria del programa a un archivo en el disco para recuperarlos después, cuando se requiera, con la función load().

Para ello, la función requiere el nombre del archivo, el desplazamiento dentro de la memoria del ordenador de la variable, tabla o estructura guardada en el disco (el desplazamiento del dato se obtiene con OFFSET <nombre del dato>) y el número de posiciones de memoria que ocupa dicho dato (lo que se puede obtener con sizeof(<nombre del dato>)).

Es posible guardar varios datos (variables, tablas o estructuras) si estos se han definido dentro de la misma sección (GLOBAL, LOCAL o PRIVATE) y de forma consecutiva; en este caso se debe indicar como segundo parámetro el OFFSET del primer dato, y como tercer parámetro la suma de los sizeof() de todos los datos.

No es necesario especificar una ruta de acceso junto al nombre de archivo.

Programa ejemplo:
PROGRAM ejemplo_load;

PRIVATE
    tabla[9];
    contador;

BEGIN
    write (0, 0, 0, 0, "Pulse [ENTER] para borrar los datos.");
    write (0, 0, 10, 0, "Pulse [ESPACIO] para cargar los datos del disco");
    write (0, 0, 30, 0, "Valores actuales de los datos:");
    FROM contador=0 TO 9;
        tabla[contador]=rand(0, 100);
        write_int(0, 0, 40+(contador*10), 0, offset tabla[contador]);
    END

    save("help\help.dat", offset tabla, sizeof(tabla)); // Se graba el archivo.

    LOOP
        IF (key(_enter))
            FROM contador=0 TO 9;
                tabla[contador]=0;
            END
        END
        IF (key(_space))
            load("help\help.dat", offset tabla);
        END
        FRAME;
    END
END


Al inicio del ejemplo se crea una tabla de 10 posiciones (del 0 al 9) con valores aleatorios. Esta tabla se graba en el disco con la función save().

Cuando se pulsa la tecla ENTER se borran los valores de la tabla (se ponen a 0 las 10 posiciones).

Cuando se pulsa la barra espaciadora se cargan los valores de la tabla del disco con la función load().


Para grabar en el mismo archivo tabla[9] y la variable contador se debería haber llamado a la función save() de la siguiente forma:

  save("help\help.dat", offset tabla, sizeof(tabla)+sizeof(contador));

No variando la instrucción de carga (load("help\help.dat", offset tabla);), ya que ésta no requiere el número de datos.

El valor devuelto por sizeof() para cualquier variable (como contador) será siempre 1, y para una tabla el número de posiciones de la misma, luego la sentencia de grabación podría ponerse como (teniendo en cuenta que se van a grabar 11 datos, 10 de la tabla y 1 de la variable):

  save("help\help.dat", offset tabla, 11);


Ver: load() - OFFSET - sizeof()