asymptote: Files

 
 6.6 Files
 =========
 
 'Asymptote' can read and write text files (including comma-separated
 value) files and portable XDR (External Data Representation) binary
 files.
 
    An input file must first be opened with
 input(string name="", bool check=true, string comment="#", string mode="");
    reading is then done by assignment:
 file fin=input("test.txt");
 real a=fin;
 
    If the optional boolean argument 'check' is 'false', no check will be
 made that the file exists.  If the file does not exist or is not
 readable, the function 'bool error(file)' will return 'true'.  The first
 character of the string 'comment' specifies a comment character.  If
 this character is encountered in a data file, the remainder of the line
 is ignored.  When reading strings, a comment character followed
 immediately by another comment character is treated as a single literal
 comment character.
 
    One can change the current working directory for read operations to
 the contents of the string 's' with the function 'string cd(string s)',
 which returns the new working directory.  If 'string s' is empty, the
 path is reset to the value it had at program startup.
 
    When reading pairs, the enclosing parenthesis are optional.  Strings
 are also read by assignment, by reading characters up to but not
 including a newline.  In addition, 'Asymptote' provides the function
 'string getc(file)' to read the next character (treating the comment
 character as an ordinary character) and return it as a string.
 
    A file named 'name' can be open for output with
 file output(string name="", bool update=false, string comment="#", string mode="");
 If 'update=false', any existing data in the file will be erased and only
 write operations can be used on the file.  If 'update=true', any
 existing data will be preserved, the position will be set to the
 end-of-file, and both reading and writing operations will be enabled.
 For security reasons, writing to files in directories other than the
 current directory is allowed only if the '-globalwrite' (or '-nosafe')
 command-line option is specified.  The function 'string mktemp(string
 s)' may be used to create and return the name of a unique temporary file
 in the current directory based on the string 's'.
 
    There are two special files: 'stdin', which reads from the keyboard,
 and 'stdout', which writes to the terminal.  The implicit initializer
 for files is 'null'.
 
    Data of a built-in type 'T' can be written to an output file by
 calling one of the functions
 write(string s="", T x, suffix suffix=endl ... T[]);
 write(file file, string s="", T x, suffix suffix=none ... T[]);
 write(file file=stdout, string s="", explicit T[] x ... T[][]);
 write(file file=stdout, T[][]);
 write(file file=stdout, T[][][]);
 write(suffix suffix=endl);
 write(file file, suffix suffix=none);
    If 'file' is not specified, 'stdout' is used and terminated by
 default with a newline.  If specified, the optional identifying string
 's' is written before the data 'x'.  An arbitrary number of data values
 may be listed when writing scalars or one-dimensional arrays.  The
 'suffix' may be one of the following: 'none' (do nothing), 'flush'
 (output buffered data), 'endl' (terminate with a newline and flush),
 'newl' (terminate with a newline), 'DOSendl' (terminate with a DOS
 newline and flush), 'DOSnewl' (terminate with a DOS newline), 'tab'
 (terminate with a tab), or 'comma' (terminate with a comma).  Here are
 some simple examples of data output:
 file fout=output("test.txt");
 write(fout,1);                  // Writes "1"
 write(fout);                    // Writes a new line
 write(fout,"List: ",1,2,3);     // Writes "List: 1     2     3"
 
    A file may be opened with 'mode="xdr"', to read or write double
 precision (64-bit) reals and single precision (32-bit) integers in Sun
 Microsystem's XDR (External Data Representation) portable binary format
 (available on all 'UNIX' platforms).  Alternatively, a file may also be
 opened with 'mode="binary"' to read or write double precision reals and
 single precision integers in the native (nonportable) machine binary
 format.  The virtual member functions 'file singlereal(bool b=true)' and
 'file singleint(bool b=true)' be used to change the precision of real
 and integer I/O operations, respectively, for an XDR or binary file 'f'.
 Similarly, the function 'file signedint(bool b=true)' can be used to
 modify the signedness of integer reads and writes for an XDR or binary
 file 'f'.
 
    The virtual members 'name', 'mode', 'singlereal', 'singleint', and
 'signedint' may be used to query the respective parameters for a given
 file.
 
    One can test a file for end-of-file with the boolean function
 'eof(file)', end-of-line with 'eol(file)', and for I/O errors with
 'error(file)'.  One can flush the output buffers with 'flush(file)',
 clear a previous I/O error with 'clear(file)', and close the file with
 'close(file)'.  The function 'int precision(file file=stdout, int
 digits=0)' sets the number of digits of output precision for 'file' to
 'digits', provided 'digits' is nonzero, and returns the previous
 precision setting.  The function 'int tell(file)' returns the current
 position in a file relative to the beginning.  The routine 'seek(file
 file, int pos)' can be used to change this position, where a negative
 value for the position 'pos' is interpreted as relative to the
 end-of-file.  For example, one can rewind a file 'file' with the command
 'seek(file,0)' and position to the final character in the file with
 'seek(file,-1)'.  The command 'seekeof(file)' sets the position to the
 end of the file.
 
    Assigning 'settings.scroll=n' for a positive integer 'n' requests a
 pause after every 'n' output lines to 'stdout'.  One may then press
 'Enter' to continue to the next 'n' output lines, 's' followed by
 'Enter' to scroll without further interruption, or 'q' followed by
 'Enter' to quit the current output operation.  If 'n' is negative, the
 output scrolls a page at a time (i.e.  by one less than the current
 number of display lines).  The default value, 'settings.scroll=0',
 specifies continuous scrolling.
 
    The routines
 string getstring(string name="", string default="", string prompt="",
                  bool store=true);
 int getint(string name="", int default=0, string prompt="",
            bool store=true);
 real getreal(string name="", real default=0, string prompt="",
              bool store=true);
 pair getpair(string name="", pair default=0, string prompt="",
              bool store=true);
 triple gettriple(string name="", triple default=(0,0,0), string prompt="",
                  bool store=true);
 defined in the module 'plain' may be used to prompt for a value from
 'stdin' using the GNU 'readline' library.  If 'store=true', the history
 of values for 'name' is stored in the file '".asy_history_"+name' (See
 history).  The most recent value in the history will be used to
 provide a default value for subsequent runs.  The default value
 (initially 'default') is displayed after 'prompt'.  These functions are
 based on the internal routines
 string readline(string prompt="", string name="", bool tabcompletion=false);
 void saveline(string name, string value, bool store=true);
    Here, 'readline' prompts the user with the default value formatted
 according to 'prompt', while 'saveline' is used to save the string
 'value' in a local history named 'name', optionally storing the local
 history in a file '".asy_history_"+name'.
 
    The routine 'history(string name, int n=1)' can be used to look up
 the 'n' most recent values (or all values up to 'historylines' if 'n=0')
 entered for string 'name'.  The routine 'history(int n=0)' returns the
 interactive history.  For example,
 write(output("transcript.asy"),history());
 outputs the interactive history to the file 'transcript.asy'.
 
    The function 'int delete(string s)' deletes the file named by the
 string 's'.  Unless the '-globalwrite' (or '-nosafe') option is enabled,
 the file must reside in the current directory.  The function 'int
 rename(string from, string to)' may be used to rename file 'from' to
 file 'to'.  Unless the '-globalwrite' (or '-nosafe') option is enabled,
 this operation is restricted to the current directory.  The functions
 int convert(string args="", string file="", string format="");
 int animate(string args="", string file="", string format="");
 call the 'ImageMagick' commands 'convert' and 'animate', respectively,
 with the arguments 'args' and the file name constructed from the strings
 'file' and 'format'.