This module provides an interface to standard Erlang I/O servers.
The output functions all return
In the following description, all functions have an optional
parameter
For a description of the IO protocols refer to the
As of R13A, data supplied to the
If an IO device is set in binary mode, the functions
To work with binaries in ISO-latin-1 encoding, use the
For conversion functions between character encodings, see the
An IO device. Either
What the I/O-server sends when there is no data.
Retrieves the number of columns of the
Writes the characters of
Writes new line to the standard output (
Reads
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).
End of file was encountered.
Other (rare) error condition, for instance
Reads a line from the standard input (
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).
End of file was encountered.
Other (rare) error condition, for instance
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,
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.
Set options for the standard IO device (
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
The options and values supported by the current OTP IO devices are:
If set in binary mode (
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 (
Denotes if the terminal should echo input. Only supported for the standard shell I/O-server (
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
The function is called with the current line, upto
the cursor, as a reversed string. It should return a
three-tuple:
Trivial example (beep on anything except empty line, which
is expanded to
fun("") -> {yes, "quit", []};
(_) -> {no, "", ["quit"]} end
This option is supported by the standard shell only (
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
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
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.
The extended encodings are only supported on disk files (opened by the
Writes the term
Reads a term
The parsing was successful.
End of file was encountered.
The parsing failed.
Other (rare) error condition, for instance
Reads a term
The parsing was successful.
End of file was encountered.
The parsing failed.
Other (rare) error condition, for instance
Writes the items in
1> io:fwrite("Hello world!~n", []). Hello world! ok
The general format of a control sequence is
The following control sequences are available:
The character
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 (
2> io:fwrite("~tc~n",[1024]). \x{400} ok 3> io:fwrite("~c~n",[1024]). ^@ ok
The argument is a float which is written as
The argument is a float which is written as
The argument is a float which is written as
Prints the argument with the string syntax. The
argument is, if no Unicode translation modifier is present, an
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]]]}, ...
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.
Writes the data with standard syntax in the same way as
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
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
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
Writes data in the same way as
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
Writes data in the same way as
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
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
Like
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
1> io:fwrite("~.10#~n", [31]). 10#31 ok 2> io:fwrite("~.16#~n", [-31]). -16#1F ok
Like
Like
Like
Writes a new line.
Ignores the next term.
Returns:
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".
Reads characters from the standard input (
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
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
A decimal integer is expected.
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
An integer in base 2..36 with Erlang-style base
prefix (for example
A floating point number is expected. It must follow the Erlang floating point number syntax.
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 (
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]]}
Similar to
The Unicode translation modifier is not allowed (atoms can not contain characters beyond the latin1 range).
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
The Unicode translation modifier works as with
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]]}
Returns the number of characters which have been scanned up to that point, including white-space characters.
It returns:
The read was successful and
End of file was encountered.
The reading failed and
The read operation failed and the parameter
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 "]}
Retrieves the number of rows of the
Reads data from the standard input (
The tokenization succeeded.
End of file was encountered by the tokenizer.
End of file was encountered by the I/O-server.
An error occurred while tokenizing.
Other (rare) error condition, for instance
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}
Reads data from the standard input (
Reads data from the standard input
(
The parsing was successful.
End of file was encountered by the tokenizer.
End of file was encountered by the I/O-server.
An error occurred while tokenizing or parsing.
Other (rare) error condition, for instance
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}
Reads data from the standard input (
The parsing was successful.
End of file was encountered by the tokenizer.
End of file was encountered by the I/O-server.
An error occurred while tokenizing or parsing.
Other (rare) error condition, for instance
All Erlang processes have a default standard IO device. This
device is used when no
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
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
$ erl -noshell -noinput -eval 'io:format(standard_error,"Error: ~s~n",["error 11"]),'\ 'init:stop().' > /dev/null Error: error 11
The
{ErrorLocation, Module, ErrorDescriptor}
A string which describes the error is obtained with the following call:
Module:format_error(ErrorDescriptor)