[ Stream I/O | The ECLiPSe Built-In Predicates | Reference Manual | Alphabetic Index ]

# open(++SourceSink, +Mode, ?Stream)

Opens the I/O source or sink SourceSink in mode Mode and associates it with the stream identifier Stream.

SourceSink
  Atom, string or structure.
Mode
  One of the atoms read, write, update, append.
Stream
  Atom or variable.

## Description

This predicate opens an ECLiPSe I/O stream.

The most common use is for opening files. In this case, SourceSink is a file name (atom or string).

Mode is one of the following

        read         open for reading
        write        open for writing
        update       open for reading and writing
        append       open for writing at the end

A file must already exist if it is to be opened in read mode. A file opened in append mode is opened in write mode at the end of the file. If an existing file is opened in write mode, it is truncated to zero size, i.e. its previous content is lost.

Stream is the identifier that is subsequently used to identify the stream. This identifier is either a name (atom) provided by the user, or a system-generated identifier (when the user passes a free variable).

If SourceSink is of the form string(InitialString), then a so-called string stream is opened. A string stream is basically an in-memory file and its initial contents is the string InitialString. A string stream can be used like any other stream, i.e. it is possible to read, write and seek like on a true file. The current contents of a string stream can at any time be retrieved as a whole using get_stream_info(Stream, name, Contents).

If SourceSink is of the form queue(InitialString), then a queue stream is opened. It behaves like a string that can be written at the end and read from the beginning. Seeking is not allowed on queues. The current contents of a queue can at any time be retrieved as a whole using get_stream_info(Stream, name, Contents). Queues are considered to be at end-of-file while they are empty. Queues can be configured to raise an event every time something is written to the previously empty queue (see open/4).

If SourceSink is of the form fd(Integer), then the stream in opened onto an existing operating system file descriptor.

Streams are not closed on backtracking through the call to open/3.

### Modes and Determinism

- open(++, +, -) is det
- open(++, +, +) is det

### Exceptions

(4) instantiation fault
  File or Mode is not instantiated.
(5) type error
  File is not an atom, string or structure.
(5) type error
  Mode is not an atom.
(5) type error
  Stream is not an atom or a variable.
(170) system interface error
  The operating system cannot open the file.
(192) illegal stream mode
  Mode is an atom, but is not a valid mode.

## Examples

        [eclipse 1]: open(file1, write, S), write(S, foo), close(S).
        S = 6
        yes.
        [eclipse 2]: open(file1, update, S), read(S,X), write(S,bar), close(S).
        X = foo
        S = 6
        yes.
        [eclipse 3]: open(file1, append, S), write(S, baz), close(S).
        S = 6
        yes.
        [eclipse 4]: open(file1, read, mystr), read(mystr,X), close(mystr).
        X = foobarbaz
        yes.

        [eclipse 1]: open(string("foo"), update, S),
                     read(S,X), write(S,bar),
                     get_stream_info(S, name, Contents), close(S).
        X = foo
        Contents = "foobar"
        yes.

        [eclipse 1]: open(queue(""), update, S),
                     write(S, hello), read(S, X), close(S).
        X = hello
        yes.

        [eclipse 1]: event_create(writeln(my_event_handler), Event),
                     open(queue(""), write, S, [event(Event)]),
                     write(S, hello).
        my_event_handler
        S = 6
        yes.

    Error:
           open(Var,update,s).      (Error 4).
           open(file1,Mode,s).      (Error 4).
           open(2,update,s).        (Error 5).
           open(file1,"str",s).     (Error 5).
           open(file1,update,9).    (Error 5).
           open(nonex,read,s).      (Error 170). % no such file
           open(file1,atom,s).      (Error 192). % no such mode

## See Also

at / 2, at_eof / 1, current_stream / 1, get_stream_info / 3, open / 4, pipe / 2, seek / 2, select / 3, stream_truncate / 1