open(+FileSpec, +Mode, -Stream)

open(+FileSpec, +Mode, +Options, -Stream)

Creates a Prolog stream by opening the file FileSpec in mode Mode with options Options.


FileSpec file_spec
a file specification (see ref-fdi).
Mode one of [read,write,append]
an atom specifying the open mode of the target file. One of:

open FileSpec for input.
open FileSpec for output. A new file is created if FileSpec does not exist. If the file already exists, then it is set to empty and its previous contents are lost.
opens FileSpec for output. If FileSpec already exists, adds output to the end of it. If not, a new file is created.

Options list
a list of zero or more of the following.

Specifies that the file stream is a text stream. This sets the line border code to <LFD>, the file border code to -1, and turns on trimming. This is the default.
Specifies that the file stream is a binary stream. This sets the line border code to none, the file border code to -1, the format to variable, and turns off trimming.
Size is an integer value to specify the maximum record (line) size in the file. This also sets the internal buffer size to be used for input/output options on the stream to Size. If Size is 0, the opened stream operates in non-buffered mode. The value of Size should be greater than or equal to 0.
Under UNIX, the default is 256 for tty streams and 8192 for other stream.
EolCode is an integer value to specify the line (record) border code for the stream. EolCode is

Indicates there is no line border code.
ASCII code for EOL character. Default = <LFD> (ASCII code for <LFD>).

If an output predicate writes out the character whose code is the line border code of the stream, the Prolog system terminates the output record according to the format of the stream.
EofCode is an integer value to specify the file border code for an input stream.

Indicates there is no file border code for the stream. Reading at the end of file is same as reading past end of file.

The file border code is the value to be returned to an input predicate when an input stream reaches the end of file. The default file border code is -1.
Specifies what to do for reading past end of file. This option has no effect on an output stream. Action is one of the following.

It's an error to read past end of file. This is the default for text binary streams.
Return file border code as set in end_of_file option for reading past end of file.
Reset the stream and make an attempt to read for input past end of file. This is the default for tty stream.

Specifies what to do when output overflows the current record size. This option has no effect on an input stream. OvAction is one of the following.

It's an error.
Discard the overflow characters.
Write out the overflow partial record (line). No characters are discarded. This is the default under UNIX and Windows.

Request seeking method that will be performed on the file. SeekOption is defined as follows:

It's an error to issue a seeking command on the stream. This is the default for a tty stream.
The seeking request will be made only to a previous input/output position. stream_position/3 is the only predicate that can be used to seek on the stream. This is the default for both text and binary streams.
Seeking to an arbitrary byte position on the stream. This option also permits seek(previous). Both stream_position/3 and seek/4 work on the stream.
Seeking to the beginning of an arbitrary record in the file stream. This option is not available under UNIX or Windows.

Request flushing method for an output stream. This option has no effect on an input stream. It can be one of the following.

It's an error to try to flush an output stream.
Write out all the characters buffered. This is the default under UNIX and Windows.

Turns on the trimming on the file stream. Trimming means that trailing blanks are deleted in input records. The default is no trimming. See format below.
This option is provided to allow extensions.

must be an atom and is passed to the QU_open() function, which can be redefined by the user. The default version of QU_open() will report an error, causing a permission_error to be raised, if system(SysAttrs) is specified.

Specifies the file format (see fli-ios-sst-fmt). For Prolog running under UNIX and Windows, the default format is format(delimited(lf)) for text stream, format(variable) for binary stream, and format(delimited(tty)) for tty file. Users will not normally need to use the format(Format) options directly. Format is one of:

Each record in the file has its own length. There are no delimiter characters between records. The Prolog system removes the trailing blank characters for each input record it reads if the trim option is set.
For an application program's point of view, a single <LFD> (ASCII code 10) terminates each record in the file. Under Windows, however, what's actually stored in the file is the sequence <RET><LFD>.
FileSpec is a terminal device, a pseudo-terminal device, or a terminal emulator. The Prolog input/output system treats this format like QP_DELIM_LF as far as record termination is concerned.

If one of these delimiters is specified, the Prolog system removes the delimiter characters at the end of record for input. The line border code (specified by end_of_line option) is returned instead as the character code at the end of the record. Prolog system also puts delimiter characters at the end of record when a record is written out.

When no format has been specified, the format is decided as follows: if there is no line border code and trimming is off, then format(variable) is used; otherwise format(delimited(lf)) is used.
stream_object the resulting opened Prolog stream.


open/3 is equivalent to open/4 with Options=[].

open/4 is designed to work on various file systems under different operating systems.

Stream is used as an argument to Prolog input and output predicates.

Stream can also be converted to the corresponding foreign representation through stream_code/2 and used in foreign code to perform input/output operations.


Mode is not one of read, write or append. Options has an undefined option or an element in Options is out of the domain of the option.
FileSpec or Mode is not instantiated. Options argument is not ground.


FileSpec or Mode is not an atom type. Options is not a list type or an element in Options is not a correct type for open options.
The specified FileSpec does not exist.
Can not open FileSpec with specified Mode and Options.
There are too many files opened.


If an option is specified more than once the rightmost option takes precedence.

Prolog streams are in general classified as tty streams, text streams, or binary streams. A Prolog stream is a tty stream if the format of the stream is set to format(delimited(tty)), or if no format is specified and FileSpec refers to a terminal (decided by the function isatty(3)). Prolog provides a special service to print prompts for a tty input stream. A text stream corresponds to a text file. The Prolog system removes the control characters of the text stream. A binary stream is a stream of bytes; the Prolog system returns the actual characters stored in the file. Specifying binary or text along with trim and end_of_line options will result in a hybrid of binary and text streams.

Defaults are provided for Options in QU_stream_param() function. This description is based on those input/output defaults.

Format is seldom set by the user. It is only useful in case the user has redefined QU_open().


  1. Opening a stream that behaves like a C standard I/O stream without maintaining correct line count and line position.
              open(FileSpec, Mode, [binary, seek(byte),
                      eof_action(eof_code)], Stream).
  2. Opening a non-buffered stream
                   open(FileSpec, Mode, [record(0)], Stream).
  3. On UNIX systems, if FileSpec is /dev/tty, it means that the file is the default tty for the Prolog system. Terminal is used interactively.

See Also

open_null_stream/1, close/1, QP_prepare_stream/[3,4] QP_fopen(), QP_fdopen(), QU_open() fli-emb-how-iou