trusty (3) io.3erl.gz

Provided by: erlang-manpages_16.b.3-dfsg-1ubuntu2.2_all bug

NAME

       io - Standard I/O Server Interface Functions

DESCRIPTION

       This  module  provides an interface to standard Erlang I/O servers. The output functions all return ok if
       they are successful, or exit if they are not.

       In the following description, all functions have an optional parameter IoDevice. If included, it must  be
       the  pid  of  a  process  which  handles  the  IO  protocols.  Normally,  it  is the IoDevice returned by
       file:open/2.

       For a description of the IO protocols refer to the STDLIB User's Guide.

   Warning:
       As of R13A, data supplied to the put_chars function should be  in  the  unicode:chardata()  format.  This
       means  that  programs  supplying binaries to this function need to convert them to UTF-8 before trying to
       output the data on an IO device.

       If an IO device is set in binary mode, the functions get_chars and get_line may return  binaries  instead
       of lists. The binaries will, as of R13A, be encoded in UTF-8.

       To work with binaries in ISO-latin-1 encoding, use the file module instead.

       For conversion functions between character encodings, see the unicode module.

DATA TYPES

       device() = atom() | pid()

              An  IO  device.  Either  standard_io,  standard_error,  a  registered  name,  or a pid handling IO
              protocols (returned from file:open/2).

       opt_pair() = {binary, boolean()}
                  | {echo, boolean()}
                  | {expand_fun, expand_fun()}
                  | {encoding, encoding()}

       expand_fun() =
           fun((term()) -> {yes | no, string(), [string(), ...]})

       encoding() = latin1
                  | unicode
                  | utf8
                  | utf16
                  | utf32
                  | {utf16, big | little}
                  | {utf32, big | little}

       setopt() = binary | list | opt_pair()

       format() = atom() | string() | binary()

       location() = erl_scan:location()

       prompt() = atom() | unicode:chardata()

       server_no_data() = {error, ErrorDescription :: term()} | eof

              What the I/O-server sends when there is no data.

EXPORTS

       columns() -> {ok, integer() >= 1} | {error, enotsup}

       columns(IoDevice) -> {ok, integer() >= 1} | {error, enotsup}

              Types:

                 IoDevice = device()

              Retrieves the number of columns of the IoDevice (i.e. the width of a terminal). The function  only
              succeeds for terminal devices, for all other IO devices the function returns {error, enotsup}

       put_chars(CharData) -> ok

       put_chars(IoDevice, CharData) -> ok

              Types:

                 IoDevice = device()
                 CharData = unicode:chardata()

              Writes the characters of CharData to the I/O server (IoDevice).

       nl() -> ok

       nl(IoDevice) -> ok

              Types:

                 IoDevice = device()

              Writes new line to the standard output (IoDevice).

       get_chars(Prompt, Count) -> Data | server_no_data()

       get_chars(IoDevice, Prompt, Count) -> Data | server_no_data()

              Types:

                 IoDevice = device()
                 Prompt = prompt()
                 Count = integer() >= 0
                 Data = string() | unicode:unicode_binary()
                 server_no_data() = {error, ErrorDescription :: term()} | eof

              Reads Count characters from standard input (IoDevice), prompting it with Prompt. It returns:

                Data:
                  The  input  characters.  If  the IO device supports Unicode, the data may represent codepoints
                  larger than 255 (the latin1 range). If the I/O server is set to deliver binaries, they will be
                  encoded in UTF-8 (regardless of if the IO device actually supports Unicode or not).

                eof:
                  End of file was encountered.

                {error, ErrorDescription}:
                  Other (rare) error condition, for instance {error, estale} if reading from an NFS file system.

       get_line(Prompt) -> Data | server_no_data()

       get_line(IoDevice, Prompt) -> Data | server_no_data()

              Types:

                 IoDevice = device()
                 Prompt = prompt()
                 Data = string() | unicode:unicode_binary()
                 server_no_data() = {error, ErrorDescription :: term()} | eof

              Reads a line from the standard input (IoDevice), prompting it with Prompt. It returns:

                Data:
                  The  characters  in  the  line  terminated by a LF (or end of file). If the IO device supports
                  Unicode, the data may represent codepoints larger than 255 (the  latin1  range).  If  the  I/O
                  server  is  set  to  deliver  binaries, they will be encoded in UTF-8 (regardless of if the IO
                  device actually supports Unicode or not).

                eof:
                  End of file was encountered.

                {error, ErrorDescription}:
                  Other (rare) error condition, for instance {error, estale} if reading from an NFS file system.

       getopts() -> [opt_pair()]

       getopts(IoDevice) -> [opt_pair()]

              Types:

                 IoDevice = device()

              This function requests all available options and their current values for a  specific  IO  device.
              Example:

              1> {ok,F} = file:open("/dev/null",[read]).
              {ok,<0.42.0>}
              2> io:getopts(F).
              [{binary,false},{encoding,latin1}]

              Here  the  file  I/O-server returns all available options for a file, which are the expected ones,
              encoding and binary. The standard shell however has some more options:

              3> io:getopts().
              [{expand_fun,#Fun<group.0.120017273>},
               {echo,true},
               {binary,false},
               {encoding,unicode}]

              This example is, as can be seen, run in an environment where the terminal supports  Unicode  input
              and output.

       printable_range() -> unicode | latin1

              Return the user requested range of printable Unicode characters.

              The  user  can  request  a  range  of  characters that are to be considered printable in heuristic
              detection of strings by the shell and by the formatting functions. This is done by  supplying  +pc
              <range> when starting Erlang.

              Currently  the  only  valid values for <range> are latin1 and unicode. latin1 means that only code
              points below 256 (with the exception of control characters  etc)  will  be  considered  printable.
              unicode  means  that  all  printable  characters  in  all  unicode character ranges are considered
              printable by the io functions.

              By default, Erlang is started so that only the latin1 range of characters  will  indicate  that  a
              list of integers is a string.

              The  simplest  way  to  utilize the setting is to call io_lib:printable_list/1, which will use the
              return value of this function to decide if a list is a string of printable characters or not.

          Note:
              In the future, this function may return more values and ranges.  It  is  recommended  to  use  the
              io_lib:printable_list/1 function to avoid compatibility problems.

       setopts(Opts) -> ok | {error, Reason}

       setopts(IoDevice, Opts) -> ok | {error, Reason}

              Types:

                 IoDevice = device()
                 Opts = [setopt()]
                 Reason = term()

              Set options for the standard IO device (IoDevice).

              Possible  options  and  values  vary  depending  on  the actual IO device. For a list of supported
              options and their current values on a specific IO device, use the getopts/1 function.

              The options and values supported by the current OTP IO devices are:

                binary, list or {binary, boolean()}:
                  If set in binary mode (binary or {binary, true}), the I/O server sends binary data (encoded in
                  UTF-8) as answers to the get_line, get_chars and, if possible, get_until requests (see the I/O
                  protocol description in STDLIB User's  Guide  for  details).  The  immediate  effect  is  that
                  get_chars/2,3  and  get_line/1,2  return  UTF-8  binaries  instead  of  lists of chars for the
                  affected IO device.

                  By default, all IO devices in OTP are set in list mode, but the I/O functions can  handle  any
                  of these modes and so should other, user written, modules behaving as clients to I/O-servers.

                  This  option is supported by the standard shell (group.erl), the 'oldshell' (user.erl) and the
                  file I/O servers.

                {echo, boolean()}:
                  Denotes if the terminal should echo input. Only supported for the  standard  shell  I/O-server
                  (group.erl)

                {expand_fun, expand_fun()}:
                  Provide  a  function  for  tab-completion  (expansion) like the Erlang shell. This function is
                  called when the user presses the TAB key. The expansion is active  when  calling  line-reading
                  functions such as get_line/1,2.

                  The function is called with the current line, upto the cursor, as a reversed string. It should
                  return a three-tuple: {yes|no, string(), [string(), ...]}. The first element gives a  beep  if
                  no,  otherwise  the  expansion  is  silent, the second is a string that will be entered at the
                  cursor position, and the third is a list of possible expansions. If this  list  is  non-empty,
                  the list will be printed and the current input line will be written once again.

                  Trivial example (beep on anything except empty line, which is expanded to "quit"):

                 fun("") -> {yes, "quit", []};
                    (_) -> {no, "", ["quit"]} end

                  This option is supported by the standard shell only (group.erl).

                {encoding, latin1 | unicode}:
                  Specifies  how  characters  are input or output from or to the actual IO device, implying that
                  i.e. a terminal is set to handle Unicode input and output or a file is  set  to  handle  UTF-8
                  data encoding.

                  The  option  does  not affect how data is returned from the I/O functions or how it is sent in
                  the I/O-protocol, it only affects how the IO device is to handle  Unicode  characters  towards
                  the "physical" device.

                  The  standard  shell  will  be  set  for  either Unicode or latin1 encoding when the system is
                  started. The actual encoding is set  with  the  help  of  the  LANG  or  LC_CTYPE  environment
                  variables  on Unix-like system or by other means on other systems. The bottom line is that the
                  user can input Unicode characters and the IO device will be in {encoding, unicode} mode if the
                  IO  device  supports  it.  The mode can be changed, if the assumption of the runtime system is
                  wrong, by setting this option.

                  The IO device used when Erlang is started with the  "-oldshell"  or  "-noshell"  flags  is  by
                  default  set  to  latin1  encoding,  meaning  that any characters beyond codepoint 255 will be
                  escaped and that input is expected to be plain 8-bit ISO-latin-1. If the encoding  is  changed
                  to  Unicode,  input and output from the standard file descriptors will be in UTF-8 (regardless
                  of operating system).

                  Files can also be set in {encoding, unicode}, meaning that data is written and read as  UTF-8.
                  More encodings are possible for files, see below.

                  {encoding, unicode | latin1} is supported by both the standard shell (group.erl including werl
                  on Windows(R)), the 'oldshell' (user.erl) and the file I/O servers.

                {encoding, utf8 | utf16 | utf32 | {utf16,big} | {utf16,little} | {utf32,big} | {utf32,little}}:
                  For disk files, the encoding can be set to various UTF variants. This  will  have  the  effect
                  that  data is expected to be read as the specified encoding from the file and the data will be
                  written in the specified encoding to the disk file.

                  {encoding, utf8} will have the same effect as {encoding, unicode} on files.

                  The extended encodings are only supported on disk files (opened by the file:open/2 function)

       write(Term) -> ok

       write(IoDevice, Term) -> ok

              Types:

                 IoDevice = device()
                 Term = term()

              Writes the term Term to the standard output (IoDevice).

       read(Prompt) -> Result

       read(IoDevice, Prompt) -> Result

              Types:

                 IoDevice = device()
                 Prompt = prompt()
                 Result = {ok, Term :: term()}
                        | server_no_data()
                        | {error, ErrorInfo}
                 ErrorInfo = erl_scan:error_info() | erl_parse:error_info()
                 server_no_data() = {error, ErrorDescription :: term()} | eof

              Reads a term Term from the standard input (IoDevice), prompting it with Prompt. It returns:

                {ok, Term}:
                  The parsing was successful.

                eof:
                  End of file was encountered.

                {error, ErrorInfo}:
                  The parsing failed.

                {error, ErrorDescription}:
                  Other (rare) error condition, for instance {error, estale} if reading from an NFS file system.

       read(IoDevice, Prompt, StartLocation) -> Result

       read(IoDevice, Prompt, StartLocation, Options) -> Result

              Types:

                 IoDevice = device()
                 Prompt = prompt()
                 StartLocation = location()
                 Options = erl_scan:options()
                 Result = {ok, Term :: term(), EndLocation :: location()}
                        | {eof, EndLocation :: location()}
                        | server_no_data()
                        | {error, ErrorInfo, ErrorLocation :: location()}
                 ErrorInfo = erl_scan:error_info() | erl_parse:error_info()
                 server_no_data() = {error, ErrorDescription :: term()} | eof

              Reads  a  term  Term  from  IoDevice,  prompting  it  with  Prompt.  Reading  starts  at  location
              StartLocation.  The argument Options is passed on as the Options argument of the erl_scan:tokens/4
              function. It returns:

                {ok, Term, EndLocation}:
                  The parsing was successful.

                {eof, EndLocation}:
                  End of file was encountered.

                {error, ErrorInfo, ErrorLocation}:
                  The parsing failed.

                {error, ErrorDescription}:
                  Other (rare) error condition, for instance {error, estale} if reading from an NFS file system.

       fwrite(Format) -> ok

       fwrite(Format, Data) -> ok

       fwrite(IoDevice, Format, Data) -> ok

       format(Format) -> ok

       format(Format, Data) -> ok

       format(IoDevice, Format, Data) -> ok

              Types:

                 IoDevice = device()
                 Format = format()
                 Data = [term()]

              Writes the items in Data ([]) on the standard output (IoDevice) in accordance with Format.  Format
              contains  plain  characters  which  are  copied  to  the  output device, and control sequences for
              formatting, see below. If Format is an atom or a binary, it is first converted to a list with  the
              aid of atom_to_list/1 or binary_to_list/1.

              1> io:fwrite("Hello world!~n", []).
              Hello world!
              ok

              The  general  format of a control sequence is ~F.P.PadModC. The character C determines the type of
              control sequence to be used, F and P are optional numeric arguments. If F, P, or  Pad  is  *,  the
              next argument in Data is used as the numeric value of F or P.

              F  is  the  field  width of the printed argument. A negative value means that the argument will be
              left justified within the field, otherwise it will be  right  justified.  If  no  field  width  is
              specified,  the required print width will be used. If the field width specified is too small, then
              the whole field will be filled with * characters.

              P is the precision of the printed argument. A default value is used if no precision is  specified.
              The  interpretation of precision depends on the control sequences. Unless otherwise specified, the
              argument within is used to determine print width.

              Pad is the padding character. This is the character used to pad the printed representation of  the
              argument  so  that  it  conforms  to  the  specified  field  width and precision. Only one padding
              character can be specified and, whenever applicable, it is used  for  both  the  field  width  and
              precision. The default padding character is ' ' (space).

              Mod  is  the  control  sequence  modifier.  It is either a single character (currently only t, for
              Unicode translation, and l, for  stopping  p  and  P  from  detecting  printable  characters,  are
              supported) that changes the interpretation of Data.

              The following control sequences are available:

                ~:
                  The character ~ is written.

                c:
                  The  argument  is  a  number  that  will be interpreted as an ASCII code. The precision is the
                  number of times the character is printed and it defaults to the field  width,  which  in  turn
                  defaults to 1. The following example illustrates:

                1> io:fwrite("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c]).
                |     aaaaa|bbbbb     |ccccc|
                ok

                  If  the  Unicode translation modifier (t) is in effect, the integer argument can be any number
                  representing a valid Unicode codepoint, otherwise it should be an integer less than  or  equal
                  to 255, otherwise it is masked with 16#FF:

                2> io:fwrite("~tc~n",[1024]).
                \x{400}
                ok
                3> io:fwrite("~c~n",[1024]).
                ^@
                ok

                f:
                  The  argument  is a float which is written as [-]ddd.ddd, where the precision is the number of
                  digits after the decimal point. The default precision is 6 and it cannot be less than 1.

                e:
                  The argument is a float which is written as [-]d.ddde+-ddd, where the precision is the  number
                  of digits written. The default precision is 6 and it cannot be less than 2.

                g:
                  The argument is a float which is written as f, if it is >= 0.1 and < 10000.0. Otherwise, it is
                  written in the e format. The precision is the number of significant digits. It defaults  to  6
                  and  should  not  be  less  than 2. If the absolute value of the float does not allow it to be
                  written in the f format with the desired number of significant digits, it is also  written  in
                  the e format.

                s:
                  Prints  the  argument  with  the  string  syntax.  The  argument is, if no Unicode translation
                  modifier is present, an iolist(), a  binary(),  or  an  atom().  If  the  Unicode  translation
                  modifier  (t)  is  in effect, the argument is unicode:chardata(), meaning that binaries are in
                  UTF-8. The characters are printed without quotes. The string is first truncated by  the  given
                  precision and then padded and justified to the given field width. The default precision is the
                  field width.

                  This format can be used for printing any object  and  truncating  the  output  so  it  fits  a
                  specified field:

                1> io:fwrite("|~10w|~n", [{hey, hey, hey}]).
                |**********|
                ok
                2> io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).
                |{hey,hey,h|
                3> io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).
                |{hey,hey  |
                ok

                  A  list  with  integers  larger  than  255  is  considered an error if the Unicode translation
                  modifier is not given:

                4> io:fwrite("~ts~n",[[1024]]).
                \x{400}
                ok
                5> io:fwrite("~s~n",[[1024]]).
                ** exception exit: {badarg,[{io,format,[<0.26.0>,"~s~n",[[1024]]]},
                   ...

                w:
                  Writes data with the standard syntax. This is used to output Erlang terms. Atoms  are  printed
                  within  quotes  if  they  contain  embedded  non-printable  characters, and floats are printed
                  accurately as the shortest, correctly rounded string.

                p:
                  Writes the data with standard syntax in the same way as ~w, but  breaks  terms  whose  printed
                  representation is longer than one line into many lines and indents each line sensibly. It also
                  tries to detect lists of printable characters and to output  these  as  strings.  The  Unicode
                  translation modifier is used for determining what characters are printable. For example:

                1> T = [{attributes,[[{id,age,1.50000},{mode,explicit},
                {typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]},
                {typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}].
                ...
                2> io:fwrite("~w~n", [T]).
                [{attributes,[[{id,age,1.5},{mode,explicit},{typename,
                [73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit},{typena
                me,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}},{mode
                ,implicit}]
                ok
                3> io:fwrite("~62p~n", [T]).
                [{attributes,[[{id,age,1.5},
                               {mode,explicit},
                               {typename,"INTEGER"}],
                              [{id,cho},{mode,explicit},{typename,'Cho'}]]},
                 {typename,'Person'},
                 {tag,{'PRIVATE',3}},
                 {mode,implicit}]
                ok

                  The  field width specifies the maximum line length. It defaults to 80. The precision specifies
                  the initial indentation of the term. It defaults to the number of characters printed  on  this
                  line in the same call to io:fwrite or io:format. For example, using T above:

                4> io:fwrite("Here T = ~62p~n", [T]).
                Here T = [{attributes,[[{id,age,1.5},
                                        {mode,explicit},
                                        {typename,"INTEGER"}],
                                       [{id,cho},
                                        {mode,explicit},
                                        {typename,'Cho'}]]},
                          {typename,'Person'},
                          {tag,{'PRIVATE',3}},
                          {mode,implicit}]
                ok

                  When  the  modifier  l is given no detection of printable character lists will take place. For
                  example:

                5> S = [{a,"a"}, {b, "b"}].
                6> io:fwrite("~15p~n", [S]).
                [{a,"a"},
                 {b,"b"}]
                ok
                7> io:fwrite("~15lp~n", [S]).
                [{a,[97]},
                 {b,[98]}]
                ok

                  Binaries that look like UTF-8 encoded strings will be output with the  string  syntax  if  the
                  Unicode translation modifier is given:

                9> io:fwrite("~p~n",[[1024]]).
                [1024]
                10> io:fwrite("~tp~n",[[1024]]).
                "\x{400}"
                11> io:fwrite("~tp~n", [<<128,128>>]).
                <<128,128>>
                12> io:fwrite("~tp~n", [<<208,128>>]).
                <<"\x{400}"/utf8>>
                ok

                W:
                  Writes  data  in the same way as ~w, but takes an extra argument which is the maximum depth to
                  which terms are printed. Anything below this depth is replaced with .... For example, using  T
                  above:

                8> io:fwrite("~W~n", [T,9]).
                [{attributes,[[{id,age,1.5},{mode,explicit},{typename,...}],
                [{id,cho},{mode,...},{...}]]},{typename,'Person'},
                {tag,{'PRIVATE',3}},{mode,implicit}]
                ok

                  If  the maximum depth has been reached, then it is impossible to read in the resultant output.
                  Also, the ,... form in a tuple denotes that there are more elements in the tuple but these are
                  below the print depth.

                P:
                  Writes  data  in the same way as ~p, but takes an extra argument which is the maximum depth to
                  which terms are printed. Anything below this depth is replaced with .... For example:

                9> io:fwrite("~62P~n", [T,9]).
                [{attributes,[[{id,age,1.5},{mode,explicit},{typename,...}],
                              [{id,cho},{mode,...},{...}]]},
                 {typename,'Person'},
                 {tag,{'PRIVATE',3}},
                 {mode,implicit}]
                ok

                B:
                  Writes an integer in base 2..36, the default base  is  10.  A  leading  dash  is  printed  for
                  negative integers.

                  The precision field selects base. For example:

                1> io:fwrite("~.16B~n", [31]).
                1F
                ok
                2> io:fwrite("~.2B~n", [-19]).
                -10011
                ok
                3> io:fwrite("~.36B~n", [5*36+35]).
                5Z
                ok

                X:
                  Like  B,  but  takes an extra argument that is a prefix to insert before the number, but after
                  the leading dash, if any.

                  The prefix can be a possibly deep list of characters or an atom.

                1> io:fwrite("~X~n", [31,"10#"]).
                10#31
                ok
                2> io:fwrite("~.16X~n", [-31,"0x"]).
                -0x1F
                ok

                #:
                  Like B, but prints the number with an Erlang style #-separated base prefix.

                1> io:fwrite("~.10#~n", [31]).
                10#31
                ok
                2> io:fwrite("~.16#~n", [-31]).
                -16#1F
                ok

                b:
                  Like B, but prints lowercase letters.

                x:
                  Like X, but prints lowercase letters.

                +:
                  Like #, but prints lowercase letters.

                n:
                  Writes a new line.

                i:
                  Ignores the next term.

              Returns:

                ok:
                  The formatting succeeded.

              If an error occurs, there is no output. For example:

              1> io:fwrite("~s ~w ~i ~w ~c ~n",['abc def', 'abc def', {foo, 1},{foo, 1}, 65]).
              abc def 'abc def'  {foo,1} A
              ok
              2> io:fwrite("~s", [65]).
              ** exception exit: {badarg,[{io,format,[<0.22.0>,"~s","A"]},
                                          {erl_eval,do_apply,5},
                                          {shell,exprs,6},
                                          {shell,eval_exprs,6},
                                          {shell,eval_loop,3}]}
                   in function  io:o_request/2

              In this example, an attempt was made to output the single character 65 with the aid of the  string
              formatting directive "~s".

       fread(Prompt, Format) -> Result

       fread(IoDevice, Prompt, Format) -> Result

              Types:

                 IoDevice = device()
                 Prompt = prompt()
                 Format = format()
                 Result = {ok, Terms :: [term()]}
                        | {error, {fread, FreadError :: io_lib:fread_error()}}
                        | server_no_data()
                 server_no_data() = {error, ErrorDescription :: term()} | eof

              Reads  characters  from  the  standard  input (IoDevice), prompting it with Prompt. Interprets the
              characters in accordance  with  Format.  Format  contains  control  sequences  which  directs  the
              interpretation of the input.

              Format may contain:

                * White  space characters (SPACE, TAB and NEWLINE) which cause input to be read to the next non-
                  white space character.

                * Ordinary characters which must match the next input character.

                * Control sequences, which have the general format ~*FMC. The character * is an optional  return
                  suppression  character.  It  provides a method to specify a field which is to be omitted. F is
                  the field width of the input field, M is an optional translation modifier (of which t  is  the
                  only  currently  supported,  meaning Unicode translation) and C determines the type of control
                  sequence.

                  Unless otherwise specified, leading white-space is ignored for all control sequences. An input
                  field cannot be more than one line wide. The following control sequences are available:

                  ~:
                    A single ~ is expected in the input.

                  d:
                    A decimal integer is expected.

                  u:
                    An  unsigned integer in base 2..36 is expected. The field width parameter is used to specify
                    base. Leading white-space characters are not skipped.

                  -:
                    An optional sign character is expected. A sign character - gives the return value  -1.  Sign
                    character  +  or  none  gives  1.  The field width parameter is ignored. Leading white-space
                    characters are not skipped.

                  #:
                    An integer in base 2..36 with Erlang-style base prefix (for example "16#ffff") is expected.

                  f:
                    A floating point number is expected. It must follow the Erlang floating point number syntax.

                  s:
                    A string of non-white-space characters is read. If a field width has  been  specified,  this
                    number  of  characters  are  read  and  all trailing white-space characters are stripped. An
                    Erlang string (list of characters) is returned.

                    If Unicode translation is  in  effect  (~ts),  characters  larger  than  255  are  accepted,
                    otherwise  not.  With  the translation modifier, the list returned may as a consequence also
                    contain integers larger than 255:

                  1> io:fread("Prompt> ","~s").
                  Prompt> <Characters beyond latin1 range not printable in this medium>
                  {error,{fread,string}}
                  2> io:fread("Prompt> ","~ts").
                  Prompt> <Characters beyond latin1 range not printable in this medium>
                  {ok,[[1091,1085,1080,1094,1086,1076,1077]]}

                  a:
                    Similar to s, but the resulting string is converted into an atom.

                    The Unicode translation modifier is not allowed (atoms can not contain characters beyond the
                    latin1 range).

                  c:
                    The number of characters equal to the field width are read (default is 1) and returned as an
                    Erlang string. However, leading and trailing white-space characters are not omitted as  they
                    are with s. All characters are returned.

                    The Unicode translation modifier works as with s:

                  1> io:fread("Prompt> ","~c").
                  Prompt> <Character beyond latin1 range not printable in this medium>
                  {error,{fread,string}}
                  2> io:fread("Prompt> ","~tc").
                  Prompt> <Character beyond latin1 range not printable in this medium>
                  {ok,[[1091]]}

                  l:
                    Returns  the number of characters which have been scanned up to that point, including white-
                    space characters.

                  It returns:

                  {ok, Terms}:
                    The read was successful and Terms is the list of successfully matched and read items.

                  eof:
                    End of file was encountered.

                  {error, FreadError}:
                    The reading failed and FreadError gives a hint about the error.

                  {error, ErrorDescription}:
                    The read operation failed and the parameter ErrorDescription gives a hint about the error.

              Examples:

              20> io:fread('enter>', "~f~f~f").
              enter>1.9 35.5e3 15.0
              {ok,[1.9,3.55e4,15.0]}
              21> io:fread('enter>', "~10f~d").
              enter>     5.67899
              {ok,[5.678,99]}
              22> io:fread('enter>', ":~10s:~10c:").
              enter>:   alan   :   joe    :
              {ok, ["alan", "   joe    "]}

       rows() -> {ok, integer() >= 1} | {error, enotsup}

       rows(IoDevice) -> {ok, integer() >= 1} | {error, enotsup}

              Types:

                 IoDevice = device()

              Retrieves the number of rows of the IoDevice (i.e. the height of a terminal).  The  function  only
              succeeds for terminal devices, for all other IO devices the function returns {error, enotsup}

       scan_erl_exprs(Prompt) -> Result

       scan_erl_exprs(Device, Prompt) -> Result

       scan_erl_exprs(Device, Prompt, StartLocation) -> Result

       scan_erl_exprs(Device, Prompt, StartLocation, Options) -> Result

              Types:

                 Device = device()
                 Prompt = prompt()
                 StartLocation = location()
                 Options = erl_scan:options()
                 Result = erl_scan:tokens_result() | server_no_data()
                 server_no_data() = {error, ErrorDescription :: term()} | eof

              Reads  data  from  the  standard  input  (IoDevice),  prompting  it with Prompt. Reading starts at
              location StartLocation (1). The argument Options is passed on  as  the  Options  argument  of  the
              erl_scan:tokens/4  function.  The data is tokenized as if it were a sequence of Erlang expressions
              until a final dot (.) is reached. This token is also returned. It returns:

                {ok, Tokens, EndLocation}:
                  The tokenization succeeded.

                {eof, EndLocation}:
                  End of file was encountered by the tokenizer.

                eof:
                  End of file was encountered by the I/O-server.

                {error, ErrorInfo, ErrorLocation}:
                  An error occurred while tokenizing.

                {error, ErrorDescription}:
                  Other (rare) error condition, for instance {error, estale} if reading from an NFS file system.

              Example:

              23> io:scan_erl_exprs('enter>').
              enter>abc(), "hey".
              {ok,[{atom,1,abc},{'(',1},{')',1},{',',1},{string,1,"hey"},{dot,1}],2}
              24> io:scan_erl_exprs('enter>').
              enter>1.0er.
              {error,{1,erl_scan,{illegal,float}},2}

       scan_erl_form(Prompt) -> Result

       scan_erl_form(IoDevice, Prompt) -> Result

       scan_erl_form(IoDevice, Prompt, StartLocation) -> Result

       scan_erl_form(IoDevice, Prompt, StartLocation, Options) -> Result

              Types:

                 IoDevice = device()
                 Prompt = prompt()
                 StartLocation = location()
                 Options = erl_scan:options()
                 Result = erl_scan:tokens_result() | server_no_data()
                 server_no_data() = {error, ErrorDescription :: term()} | eof

              Reads data from the standard input  (IoDevice),  prompting  it  with  Prompt.  Starts  reading  at
              location  StartLocation  (1).  The  argument  Options  is passed on as the Options argument of the
              erl_scan:tokens/4 function. The data is tokenized as if it were an Erlang form - one of the  valid
              Erlang expressions in an Erlang source file - until a final dot (.) is reached. This last token is
              also returned. The return values are the same as for scan_erl_exprs/1,2,3 above.

       parse_erl_exprs(Prompt) -> Result

       parse_erl_exprs(IoDevice, Prompt) -> Result

       parse_erl_exprs(IoDevice, Prompt, StartLocation) -> Result

       parse_erl_exprs(IoDevice, Prompt, StartLocation, Options) ->
                          Result

              Types:

                 IoDevice = device()
                 Prompt = prompt()
                 StartLocation = location()
                 Options = erl_scan:options()
                 Result = parse_ret()
                 parse_ret() = {ok,
                                ExprList :: erl_parse:abstract_expr(),
                                EndLocation :: location()}
                             | {eof, EndLocation :: location()}
                             | {error,
                                ErrorInfo :: erl_scan:error_info()
                                           | erl_parse:error_info(),
                                ErrorLocation :: location()}
                             | server_no_data()
                 server_no_data() = {error, ErrorDescription :: term()} | eof

              Reads data from the standard input  (IoDevice),  prompting  it  with  Prompt.  Starts  reading  at
              location  StartLocation  (1).  The  argument  Options  is passed on as the Options argument of the
              erl_scan:tokens/4 function. The data is tokenized and parsed as if it were a  sequence  of  Erlang
              expressions until a final dot (.) is reached. It returns:

                {ok, ExprList, EndLocation}:
                  The parsing was successful.

                {eof, EndLocation}:
                  End of file was encountered by the tokenizer.

                eof:
                  End of file was encountered by the I/O-server.

                {error, ErrorInfo, ErrorLocation}:
                  An error occurred while tokenizing or parsing.

                {error, ErrorDescription}:
                  Other (rare) error condition, for instance {error, estale} if reading from an NFS file system.

              Example:

              25> io:parse_erl_exprs('enter>').
              enter>abc(), "hey".
              {ok, [{call,1,{atom,1,abc},[]},{string,1,"hey"}],2}
              26> io:parse_erl_exprs ('enter>').
              enter>abc("hey".
              {error,{1,erl_parse,["syntax error before: ",["'.'"]]},2}

       parse_erl_form(Prompt) -> Result

       parse_erl_form(IoDevice, Prompt) -> Result

       parse_erl_form(IoDevice, Prompt, StartLocation) -> Result

       parse_erl_form(IoDevice, Prompt, StartLocation, Options) -> Result

              Types:

                 IoDevice = device()
                 Prompt = prompt()
                 StartLocation = location()
                 Options = erl_scan:options()
                 Result = parse_form_ret()
                 parse_form_ret() = {ok,
                                     AbsForm :: erl_parse:abstract_form(),
                                     EndLocation :: location()}
                                  | {eof, EndLocation :: location()}
                                  | {error,
                                     ErrorInfo :: erl_scan:error_info()
                                                | erl_parse:error_info(),
                                     ErrorLocation :: location()}
                                  | server_no_data()
                 server_no_data() = {error, ErrorDescription :: term()} | eof

              Reads  data  from  the  standard  input  (IoDevice),  prompting  it with Prompt. Starts reading at
              location StartLocation (1). The argument Options is passed on  as  the  Options  argument  of  the
              erl_scan:tokens/4 function. The data is tokenized and parsed as if it were an Erlang form - one of
              the valid Erlang expressions in an Erlang source file - until a  final  dot  (.)  is  reached.  It
              returns:

                {ok, AbsForm, EndLocation}:
                  The parsing was successful.

                {eof, EndLocation}:
                  End of file was encountered by the tokenizer.

                eof:
                  End of file was encountered by the I/O-server.

                {error, ErrorInfo, ErrorLocation}:
                  An error occurred while tokenizing or parsing.

                {error, ErrorDescription}:
                  Other (rare) error condition, for instance {error, estale} if reading from an NFS file system.

STANDARD INPUT/OUTPUT

       All  Erlang processes have a default standard IO device. This device is used when no IoDevice argument is
       specified in the above function calls. However, it is sometimes desirable to  use  an  explicit  IoDevice
       argument  which refers to the default IO device. This is the case with functions that can access either a
       file or the default IO device. The atom standard_io has  this  special  meaning.  The  following  example
       illustrates this:

       27> io:read('enter>').
       enter>foo.
       {ok,foo}
       28> io:read(standard_io, 'enter>').
       enter>bar.
       {ok,bar}

       There  is  always a process registered under the name of user. This can be used for sending output to the
       user.

STANDARD ERROR

       In certain situations, especially when the  standard  output  is  redirected,  access  to  an  I/O-server
       specific  for  error  messages  might  be  convenient. The IO device standard_error can be used to direct
       output to whatever the current operating system considers a suitable IO device for error output.  Example
       on a Unix-like operating system:

       $ erl -noshell -noinput -eval 'io:format(standard_error,"Error: ~s~n",["error 11"]),'\
       'init:stop().' > /dev/null
       Error: error 11

ERROR INFORMATION

       The  ErrorInfo mentioned above is the standard ErrorInfo structure which is returned from all IO modules.
       It has the format:

       {ErrorLocation, Module, ErrorDescriptor}

       A string which describes the error is obtained with the following call:

       Module:format_error(ErrorDescriptor)