6.2.3  Directivas de E/S de Archivos

Puedes abrir, leer, escribir y cerrar archivos de texto ASCII mientras se analiza la escena. Esta característica se ha diseñado principalmente como ayuda para pasar información entre los fotogramas de una animación. Puedes escribir valores en un archivo, como la posición de un objeto, y leer esta información en el siguiente fotograma. Un claro uso de esta característica sería permitir que una escena de POV-Ray generara sus propios archivos de inclusión o también escribir escenas que se modifiquen a sí mismas. Creemos que los usuarios serán capaces de encontrar otros usos interesantes de esta característica.

Nota: Algunas versiones de POV-Ray para ciertas plataformas (p.ej. Windows), proveen de medios para restringir la capacidad de los archivos de escenas para leer y escribir ficheros.

6.2.3.1  La Directiva #fopen

El usuario puede abrir un archivo de texto usando la directiva #fopen. La sintaxis es la siguiente:

DIRECTIVA_FOPEN:
    #fopen IDENTIFICADOR "nombre_de_archivo" TIPO_DE_APERTURA
TIPO_DE_APERTURA:
    read | write | append

Donde IDENTIFICADOR es un identificador no definido que se usará como manejador de archivo para hacer referencia al archivo, y "nombre_de_archivo" es cualquier literal o expresión de cadena que especifica el nombre del archivo. Los archivos abiertos con el tipo read se abren sólo para lectura. Aquéllos abiertos con write generan un archivo nuevo, con el nombre especificado, sobrescribiendo cualquier archivo existente con el mismo nombre. Finalmente, los que se abren con el tipo append se abren para escritura, pero añadiendo el texto al final del archivo existente con dicho nombre.

El manejador de archivo creado por #fopen es siempre global y permanece activo (y el archivo abierto) hasta que el análisis de la escena ha finalizado, o hasta que uses #fclose para cerrar el archivo. Puedes usar #ifdef IDENTIFICADOR_MANEJADOR_DE_ARCHIVO para comprobar si un fichero está abierto.

6.2.3.2  La Directiva #fclose

Los archivos abiertos con la directiva #fopen se cierran automáticamente cuando finaliza el análisis de la escena. Sin embargo, puedes cerrar un archivo usando en tu escena la directiva #fclose. La sintaxis es la siguiente:

DIRECTIVA_FCLOSE:
    #fclose IDENTIFICADOR_DEL_MANEJADOR_DE_ARCHIVO

Donde IDENTIFICADOR_DEL_MANEJADOR_DE_ARCHIVO es un fichero previamente abierto con la directiva #fopen. Mira la sección "La directiva #fopen".

6.2.3.3  La Directiva #read

Usando la Directiva #read, puedes leer cadenas, valores de coma flotante o matrices, directamente en variables de POV-Ray, desde un archivo de texto ASCII. El archivo debe ser abierto antes, en modo de lectura, usando la directiva #fopen. La sintaxis para la directiva #read es la siguiente:

DIRECTIVA_READ:
    #read( IDENTIFICADOR_DEL_MANEJADOR_DE_ARCHIVO, IDENTIFICADOR_DE_DATOS[,IDENTIFICADOR_DE_DATOS]...)
IDENTIFICADOR_DE_DATOS:
    IDENTIFICADOR_SIN_DEFINIR | IDENTIFICADOR_DE_COMA_FLOTANTE |
    IDENTIFICADOR_DE_MATRIZ| IDENTIFICADOR_DE_CADENA

Donde IDENTIFICADOR_DEL_MANEJADOR_DE_ARCHIVO es el fichero previamente abierto. Le sigue uno o más IDENTIFICADORES_DE_DATOS separados por comas. Los paréntesis encerrando la lista de identificadores son necesarios. Un IDENTIFICADOR_DE_DATOS es cualquier identificador sin declarar o cualquier identificador de cadena, coma flotante o matrices previamente definidos. Los identificadores no declarados se crearán globales y del tipo determinado por los datos leídos. Los identificadores definidos previamente permanecen con el alcance global o local que tenían cuando fueron creados. Se realiza una comprobación del tipo de datos para asegurar que coincide con el de estos identificadores.

El formato de los datos que se leen debe consistir en series de literales válidos de cadena, coma flotante o matrices, separados por comas. Las expresiones o identificadores no están permitidos, aunque el signo menos y la notación exponencial están permitidos en los valores de coma flotante.

Si intentas leer pasado el fin de archivo, éste se cierra automáticamente, y se borra el IDENTIFICADOR_DEL_MANEJADOR_DE_ARCHIVO de la tabla de símbolos. Ello significa que la función boleana defined(IDENTIFIER) puede usarse para detectar el final del archivo. Por ejemplo:

  #fopen MiArchivo "misdatos.txt" read
  #while (defined(MiArchivo))
    #read (MiArchivo,Var1,Var2,Var3)
    ...
  #end

6.2.3.4  La Directiva #write

Puedes escribir cadenas, valores de coma flotante o vectores, almacenados en variables POV-Ray, sobre un archivo de texto ASCII plano usando la directiva #write. El archivo debe ser primero abierto en modo de escritura (write) o en modo de adición (append) usando la directiva #fopen. La sintaxis de la directiva #write es la siguiente:

DIRECTIVA_WRITE:
    #write( IDENTIFICADOR_DEL_MANEJADOR_DE_ARCHIVO, ITEM_DE_DATOS[,ITEM_DE_DATOS]...)
ITEM_DE_DATOS:
    COMA_FLOTANTE | MATRIZ | CADENA

Donde IDENTIFICADOR_DEL_MANEJADOR_DE_ARCHIVO es el archivo previamente abierto. Le siguen uno o más ITEM_DE_DATOS separados por comas. Los paréntesis encerrando la lista de identificadores son necesarios. Un ITEM_DE_DATOS es cualquier expresión válida de cadenas, coma flotante o vectores. Las expresiones de coma flotante se evalúan y escriben como literales de coma flotante con signo. Si necesitas control sobre el formato, debes usar la función str(VALUE,L,P) para convertirla en una cadena formateada. Mira la sección "Funciones de Cadena" para más detalles acerca de la función str. Las expresiones de vectores se evalúan como tres constantes de coma flotante con signo, y se escriben encerrados entre los signos "<" y "" y separados por comas (la notación de vector habitual en POV-Ray). Las expresiones de cadenas se evalúan y escriben tal como se han especificado.

Observa que aunque los datos leídos por la directiva #read deben estar delimitados por comas y con comillas encerrando los datos de cadena, la directiva #write no escribe automáticamente comas ni comillas.

Por ejemplo, la siguiente directiva #read lee una cadena, un valor de coma flotante y una matriz:

 #read (MiArchivo,MiCadena,MiFlotante,MiMatriz)

Este código espera leer algo parecido a:

 "Una cadena delimitada por comillas", -123.45, <1,2,-3>

El código POV-Ray para escribir esto sería:

 #declare Val1 = -123.45;
 #declare Vect1 = <1,2,-3>;
 #write(MiArchivo,"\"El código POV-Ray para escribir esto sería:\",",Val1,",",Vect1,"\n")

Mira las secciones "Literales de Cadena" y "Formato de Texto" para más detalles sobre cómo escribir caracteres especiales como comillas, retorno de carro, etc...