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/0
Erlang 当前的快捷方式
: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)
写一个message
stderr,以及当前的堆栈跟踪
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的情况下将返回一个空字符串。- 注意:不要在Unicode模式下在IO设备上使用此函数,因为它将返回错误的result.binstream (device,line_or_bytes)binstream(device,:line | pos_integer):: Enumerable.t将IO
device
转换为IO.Stream
。该操作是Unicode不安全的。 - 一个
IO.Stream
实现了两者,Enumerable
与Collectable
允许它用于读和写。device
迭代了给定数量的字节或逐行if:line
给出。这将从IO设备读取为原始二进制文件。请注意,IO流具有副作用,并且每次检查流时都会得到不同的结果。最后,不要在Unicode模式下在IO设备上使用此函数,因为它将返回错误的结果.binwrite(device \:stdio,item) - binwrite(device,iodata):::ok | {:error,term}
item
以给定的二进制形式写入device
。没有Unicode转换发生。注意write/2
:不要在Unicode模式下在IO设备上使用此函数,因为它会返回错误的result.charata_to_string(string)chardata_to_string(chardata):: String.t | no_returnConverts chardata(表示代码点,列表和字符串的整数列表)转换为字符串。如果转换失败,它会引发UnicodeConversionError
。如果给出了字符串,则返回字符串本身。示例IO> “string”)“string”getn(prompt,count \ 1)getn(device,chardata | String.Chars.t):: chardata | nodatagetn(chardata | String.Chars.t,pos_integer):: chardata | nodata从IO设备获取大量字节:stdio
。如果:stdio
是Unicode设备,则count
表示要检索的Unicode码点数。否则,count
是要检索的原始字节数。请参阅返回IO.getn/3
值的描述。getn(device,prompt,count)getn(device,chardata | String.Chars.t,pos_integer):: chardata | nodata从IO获取大量字节device
。devicecount
意味着要检索的Unicode码点的数量。否则,count
是要检索的原始字节数。它返回:
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 >>- 我们可以使用
:label
选项以装饰输出:IO.inspect 1..100,label:“一个精彩的范围”打印:一个精彩的范围:1..100该:label
选项对管道尤其有用:[1,2,3] - |> IO.inspect(标签:“before”)
- |> Enum.map(&(&1 * 2))
- |> IO.inspect(label:“after”)
- |> Enum.sumPrints:before:[1,2,3] after:[2 ,4,6]检查(装置,项目,选择采用)检查(装置,物品,关键字)::项目时项目:varInspects
item
根据使用IO给定的选项device
。见inspect/2
获取完整的options.iodata_length(item)列表iodata_length(iodata):: non_neg_integer返回由编译器内置的iodata的大小.Examplesiex> IO.iodata_length([1,2 | << 3,4 >>])4iodata_to_binary (item)iodata_to_binary(iodata):: binaryConverts iodata(表示字节,列表和二进制文件的整数列表)转换为二进制文件。该操作是Unicode不安全的。注意这个函数将整数列表当作原始字节处理,并且不执行任何类型的编码转换。如果您想从charlist转换为字符串(UTF-8编码),请使用chardata_to_string/1
如果此函数接收到二进制文件,则由编译器返回相同的二进制文件. - Examplesiex> bin1 = << 1,2,3 >>
- iex> bin2 = << 4,5 >>
- iex> bin3 = << 6 >>
- iex> IO.iodata_to_binary([bin1,1,[2,3,bin2],4 | bin3])<< 1,2,3,1,2,3,4,5,4,6 >> iex> bin = << 1,2,3 >> iex> IO.iodata_to_binary(bin)<< 1,2,3 >> puts(device \:stdio,item)puts(device,chardata | String.Chars.t ):: okWrites
item
给定device
,类似于write/2
,但在end.read(device \:stdio,line_or_chars)read(device,:all |:line | non_neg_integer):: chardata | nodata从IO中读取device
。device
如果:line
给出,则由给定数量的字符或逐行重复读取。或者,:alldevice
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
实现两个Enumerable
与Collectable
并允许它用于读和写。
如果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
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com