IO

IO

处理输入/输出(IO)的函数。

该模块中的许多功能都将IO设备作为参数。IO设备必须是表示进程的PID或原子。为方便起见,Elixir提供:stdio:stderr作为快捷方式Erlang的:standard_io:standard_error

大部分函数都需要chardata,即字符串或字符和字符串列表。如果有其他类型,函数将通过String.Chars协议转换为字符串(如typespecs中所示)。

以bin开头的函数希望将iodata作为参数,即二进制文件或字节和二进制文件的列表。

IO器件

IO设备可以是原子,也可以是PID。如果是原子,则原子必须是已注册进程的名称。此外,Elixir还提供了两个快捷方式:

  • :stdio- 用于:standard_io映射到Process.group_leader/0Erlang 当前的快捷方式

  • :stderr- Erlang提供的命名:standard_error进程的快捷方式

IO设备保持其位置,这意味着后续对任何读写功能的调用将从设备上次访问的位置开始。文件的位置可以使用:file.position/2功能。

摘要

类型

chardata()device()nodata()

功能

binread(device \ :stdio, line_or_chars)

从IO读取device。该操作是Unicode不安全的

binstream(device, line_or_bytes)

将IO device转换为IO.Stream。该操作是Unicode不安全的

binwrite(device \ :stdio, item)

item为给定的二进制文件device。没有Unicode转换发生。该操作是Unicode不安全的

chardata_to_string(string)

将chardata(表示代码点,列表和字符串的整数列表)转换为字符串

getn(prompt, count \ 1)

从IO设备获取若干字节。:stdio

getn(device, prompt, count)

从IO中获取若干字节。device

gets(device \ :stdio, prompt)

从IO读取一行device

inspect(item, opts \ [])

检查并写入给定的item到设备上

inspect(device, item, opts)

检查item根据使用IO给定的选项device

iodata_length(item)

返回iodata的大小。

iodata_to_binary(item)

将iodata(表示字节,列表和二进制文件的整数列表)转换为二进制文件。该操作是Unicode不安全的

puts(device \ :stdio, item)

写入item给定的device,类似于write/2,但在最后添加一个换行符

read(device \ :stdio, line_or_chars)

从IO读取device

stream(device, line_or_codepoints)

将IO device转换为IO.Stream

warn(message)

写一个messagestderr,以及当前的堆栈跟踪

warn(message, stacktrace)

写一个message给stderr,以及给定的stacktrace

write(device \ :stdio, item)

item给特定的device

类型

chardata()

chardata() :: :unicode.chardata

device()

device() :: atom | pid

nodata()

nodata() :: {:error, term} | :eof

功能

binread(device \ :stdio, line_or_chars)

binread(device, :all | :line | non_neg_integer) :: iodata | nodata

从IO读取device。该操作是Unicode不安全的。

如果device给出,则按给定的字节数或行逐行进行迭代:line。或者,如果:all给出,则整个device返回。

它返回:

  • data-输出字节

  • :eof - 遇到文件结尾

  • {:error, reason} - 其他(罕见)错误情况; 例如,{:error, :estale}如果从NFS卷volumeIf中读取数据:all:eof,则永远不会返回该数据,但在设备已达到EOF的情况下将返回一个空字符串。

  • data-输入字符

  • :eof-遇到档案末尾

  • {:error, reason} - - 其他(罕见)错误条件; 例如,如果从NFS卷读取,则为{:error,:estale}

gets(device \ :stdio, prompt)

gets(device, chardata | String.Chars.t) :: chardata | nodata

从IO读取一行device...

它返回:

  • data - 行中的字符以换行符(LF)或文件结尾(EOF)结尾

  • :eof-遇到档案末尾

  • {:error, reason} - 其他(罕见)错误情况; 例如,{:error, :estale}如果从NFS卷读取示例要显示“你叫什么名字?”作为提示并等待用户输入:IO.gets“你叫什么名字?\ n”inspect(item,opts \ [])inspect(item,关键字):: item当项目:varInspects并写入给定item的设备。重要的是要注意,它返回给定的item不变。这样可以通过IO.inspect/2在代码中几乎任何位置插入一个调用来“窥探”值,例如,在管道中间。它默认启用较好的打印,宽度为80个字符。可以通过显式传递:width选项来更改宽度。输出可以用标签进行修饰,通过提供:label可以轻松区分它的选项IO.inspect/2调用。标签将被检查前被打印item。见Inspect.Opts剩余格式化options.ExamplesIO.inspect << 0,1,2 >>,宽度的完整列表:40Prints:<< 0,1,2 >>

  • data-输出字符

  • :eof-遇到档案末尾

  • {:error, reason} - 其他(罕见)错误情况; 例如,{:error, :estale}如果从NFS卷读取

如果:all给出,:eof则永不返回,但在设备已达到EOF的情况下为空字符串。

stream(device, line_or_codepoints)

stream(device, :line | pos_integer) :: Enumerable.t

将IO device转换为IO.Stream

一个IO.Stream实现两个EnumerableCollectable并允许它用于读和写。

如果device给出,则按给定数量的字符或逐行进行迭代:line

这从IO读取为UTF-8。检出IO.binstream/2将IO作为原始二进制文件处理。

请注意,IO流有副作用,每次您遍历该流时,可能会得到不同的结果。

实例

下面是一个示例,说明我们如何从命令行模拟回送服务器:

Enum.each IO.stream(:stdio, :line), &IO.write(&1)

warn(message)

warn(chardata | String.Chars.t) :: :ok

写一个message到stderr,以及当前的堆栈跟踪。

如果成功则返回:ok

实例

IO.warn "variable bar is unused" #=> warning: variable bar is unused #=> (iex) evaluator.ex:108: IEx.Evaluator.eval/4

warn(message, stacktrace)

warn(chardata | String.Chars.t, Exception.stacktrace) :: :ok

写一个message给stderr,以及给定的stacktrace

这个函数还会通知编译器一个警告信息被打印出来(如果启用了错误警告)。如果成功则返回:ok

可以传递一个空列表来避免堆栈跟踪打印。

实例

stacktrace = [{MyApp, :main, 1, [file: 'my_app.ex', line: 4]}] IO.warn "variable bar is unused", stacktrace #=> warning: variable bar is unused #=> my_app.ex:4: MyApp.main/1

write(device \ :stdio, item)

write(device, chardata | String.Chars.t) :: :ok

item给特定的device

默认情况下,device是标准输出。如果成功则返回:ok

实例

IO.write "sample" #=> sample IO.write :stderr, "error" #=> error