查看源代码 io_lib (stdlib v6.2)
I/O 库函数。
此模块包含用于与字符串(字符列表)相互转换的函数。它们用于实现 io
模块中的函数。不能保证某些函数返回的字符列表是扁平的,它们可以是深层列表。函数 lists:flatten/1
可用于扁平化深层列表。
概述
函数
有关详细信息,请参阅 scan_format/2
。
如果 Term
是 Unicode 范围内的字符的扁平列表,则返回 true
,否则返回 false
。
如果 Term
是 Unicode 范围内的字符的(可能很深)列表,则返回 true
,否则返回 false
。
如果 Term
是 ISO Latin-1 范围内的字符的(可能很深)列表,则返回 true
,否则返回 false
。
尝试根据 Format
中的控制序列读取 String
。
这是可重入的格式化读取器。对函数的第一次调用延续必须为 []
。
返回一个字符列表,表示根据 Format
格式化的 Data
。
如果 String
已打印,则返回从 StartIndent
开始的缩进。
如果 Term
是 ISO Latin-1 范围内的字符的扁平列表,则返回 true
,否则返回 false
。
返回一个字符列表,表示换行符。
返回一个表示 Term
的字符列表,但将超过一行的表示形式分成多行,并适当地缩进每一行。
如果 Term
是可打印的 ISO Latin-1 字符的扁平列表,则返回 true
,否则返回 false
。
如果 Term
是可打印字符的扁平列表,则返回 true
,否则返回 false
。
如果 Term
是可打印的 Unicode 字符的扁平列表,则返回 true
,否则返回 false
。
返回与指定的格式字符串对应的列表,其中控制序列已替换为相应的元组。此列表可以传递给
有关详细信息,请参阅 scan_format/2
。
返回一个表示 Term
的字符列表。选项 Depth
控制写入结构的深度。
返回打印原子 Atom
所需的字符列表。
返回打印原子 Atom
所需的字符列表。非 Latin-1 字符会被转义。
返回在 Unicode 字符集中打印字符常量所需的字符列表。
返回在 Unicode 字符集中打印字符常量所需的字符列表。非 Latin-1 字符会被转义。
返回在 ISO Latin-1 字符集中打印字符常量所需的字符列表。
返回将 Latin1String
作为字符串打印所需的字符列表。
返回将 String
作为字符串打印所需的字符列表。
返回将 String
作为字符串打印所需的字符列表。非 Latin-1 字符会被转义。
类型
一个可能很深的列表,仅包含 char/0
。
-type chars_limit() :: integer().
-opaque continuation()
由 fread/3
返回的延续。
-type depth() :: -1 | non_neg_integer().
-type format_spec() :: #{control_char := char(), args := [any()], width := none | integer(), adjust := left | right, precision := none | integer(), pad_char := char(), encoding := unicode | latin1, strings := boolean(), maps_order => maps:iterator_order()}.
描述格式字符串内容的映射。
control_char
是控制序列的类型:$P
、$w
等。args
是控制序列使用的参数列表,如果控制序列不接收任何参数,则为空列表。width
是字段宽度。adjust
是调整。precision
是打印参数的精度。pad_char
是填充字符。- 如果存在转换修饰符
t
,则encoding
设置为true
。 - 如果存在修饰符
l
,则strings
设置为false
。 - 默认情况下,
maps_order
设置为undefined
,如果存在修饰符k
,则设置为ordered
,如果存在修饰符K
,则设置为reversed
或CmpFun
。
-type fread_error() :: atom | based | character | float | format | input | integer | string | unsigned.
-type latin1_string() :: [unicode:latin1_char()].
函数
-spec build_text(FormatList) -> chars() when FormatList :: [char() | format_spec()].
有关详细信息,请参阅 scan_format/2
。
如果 Term
是 Unicode 范围内的字符的扁平列表,则返回 true
,否则返回 false
。
如果 Term
是 Unicode 范围内的字符的(可能很深)列表,则返回 true
,否则返回 false
。
如果 Term
是 ISO Latin-1 范围内的字符的(可能很深)列表,则返回 true
,否则返回 false
。
等效于 fwrite(Format, Data)
。
-spec format(Format, Data, Options) -> chars() when Format :: io:format(), Data :: [term()], Options :: [Option], Option :: {chars_limit, CharsLimit}, CharsLimit :: chars_limit().
-spec fread(Format, String) -> Result when Format :: string(), String :: string(), Result :: {ok, InputList :: [fread_item()], LeftOverChars :: string()} | {more, RestFormat :: string(), Nchars :: non_neg_integer(), InputStack :: chars()} | {error, {fread, What :: fread_error()}}.
尝试根据 Format
中的控制序列读取 String
。
有关可用格式化选项的详细描述,请参阅 io:fread/3
。假设 String
包含整行。
该函数返回
{ok, InputList, LeftOverChars}
- 字符串已读取。InputList
是成功匹配和读取的项的列表,LeftOverChars
是未使用的输入字符。{more, RestFormat, Nchars, InputStack}
- 字符串已读取,但需要更多输入才能完成原始格式字符串。RestFormat
是剩余的格式字符串,Nchars
是扫描的字符数,InputStack
是到目前为止匹配的输入的反向列表。{error, What}
- 读取操作失败,参数What
提供了有关错误的提示。
示例
3> io_lib:fread("~f~f~f", "15.6 17.3e-6 24.5").
{ok,[15.6,1.73e-5,24.5],[]}
-spec fread(Continuation, CharSpec, Format) -> Return when Continuation :: continuation() | [], CharSpec :: string() | eof, Format :: string(), Return :: {more, Continuation1 :: continuation()} | {done, Result, LeftOverChars :: string()}, Result :: {ok, InputList :: [fread_item()]} | eof | {error, {fread, What :: fread_error()}}.
这是可重入的格式化读取器。对函数的第一次调用延续必须为 []
。
有关可重入输入方案如何工作的完整描述,请参阅 Armstrong、Virding、Williams:《Erlang 并发编程》第 13 章。
该函数返回
{done, Result, LeftOverChars}
- 输入完成。结果是以下之一{ok, InputList}
- 字符串已读取。InputList
是成功匹配和读取的项的列表,LeftOverChars
是剩余的字符。eof
- 遇到文件结尾。LeftOverChars
是未使用的输入字符。{error, What}
- 发生错误,参数What
提供了有关错误的提示。
{more, Continuation}
- 需要更多数据才能构建项。Continuation
必须在有更多数据可用时传递给fread/3
。
返回一个字符列表,表示根据 Format
格式化的 Data
。
有关可用格式化选项的详细描述,请参阅 io:fwrite/1,2,3
。如果格式字符串或参数列表包含错误,则会生成错误。
当且仅当格式化字符串中使用 Unicode 转换修饰符(即 ~ts
或 ~tc
)时,结果列表可以包含超出 ISO Latin-1 字符范围的字符(即数字 > 255)。如果出现这种情况,结果仍然是普通的 Erlang string/0
,并且可以在任何允许使用 Unicode 数据的上下文中使用。
-spec fwrite(Format, Data, Options) -> chars() when Format :: io:format(), Data :: [term()], Options :: [Option], Option :: {chars_limit, CharsLimit}, CharsLimit :: chars_limit().
返回一个字符列表,表示根据 Format
格式化的 Data
,方式与 fwrite/2
和 format/2
相同,但会额外接收一个参数,即选项列表。
有效选项
{chars_limit, CharsLimit}
- 返回的字符数的软限制。当达到字符数限制时,剩余的结构将被 "...
" 替换。CharsLimit
默认为 -1,表示不限制返回的字符数。
-spec indentation(String, StartIndent) -> integer() when String :: string(), StartIndent :: integer().
如果 String
已打印,则返回从 StartIndent
开始的缩进。
如果 Term
是 ISO Latin-1 范围内的字符的扁平列表,则返回 true
,否则返回 false
。
-spec nl() -> string().
返回一个字符列表,表示换行符。
-spec print(Term, Column, LineLength, Depth) -> chars() when Term :: term(), Column :: non_neg_integer(), LineLength :: non_neg_integer(), Depth :: depth().
返回一个表示 Term
的字符列表,但将超过一行的表示形式分成多行,并适当地缩进每一行。
还会尝试检测并输出可打印字符列表作为字符串。
Column
是起始列;默认为 1。LineLength
是最大行长度;默认为 80。Depth
是最大打印深度;默认为 -1,表示没有限制。
如果 Term
是可打印的 ISO Latin-1 字符的扁平列表,则返回 true
,否则返回 false
。
如果 Term
是可打印字符的扁平列表,则返回 true
,否则返回 false
。
在这种情况下,可打印字符由 Erlang VM 的启动标志 +pc
确定;请参阅 io:printable_range/0
和 erl(1)
。
如果 Term
是可打印的 Unicode 字符的扁平列表,则返回 true
,否则返回 false
。
-spec scan_format(Format, Data) -> FormatList when Format :: io:format(), Data :: [term()], FormatList :: [char() | format_spec()].
返回与指定的格式字符串对应的列表,其中控制序列已替换为相应的元组。此列表可以传递给
build_text/1
的效果与format(Format, Args)
相同unscan_format/1
获取对应的Format
和Args
对(每个*
和相应的参数都扩展为数值)
此函数的典型用途是在格式化为文本(例如,在记录器中)之前,将诸如 ~w
和 ~p
之类的无界大小的控制序列替换为深度限制的变体 ~W
和 ~P
。
-spec unscan_format(FormatList) -> {Format, Data} when FormatList :: [char() | format_spec()], Format :: io:format(), Data :: [term()].
有关详细信息,请参阅 scan_format/2
。
等效于 write(Term, -1)
。
-spec write(Term, Depth) -> chars() when Term :: term(), Depth :: depth(); (Term, Options) -> chars() when Term :: term(), Options :: [Option], Option :: {chars_limit, CharsLimit} | {depth, Depth} | {encoding, latin1 | utf8 | unicode}, CharsLimit :: chars_limit(), Depth :: depth().
返回一个表示 Term
的字符列表。选项 Depth
控制写入结构的深度。
当达到指定的深度时,此级别以下的所有内容都将替换为 "...
"。
Depth
默认为 -1,表示没有限制。选项 CharsLimit
对返回的字符数设置软限制。当达到字符数限制时,剩余的结构将被 "...
" 替换。CharsLimit
默认为 -1,表示不限制返回的字符数。
示例
1> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9})).
"{1,[2],[3],[4,5],6,7,8,9}"
2> lists:flatten(io_lib:write({1,[2],[3],[4,5],6,7,8,9}, 5)).
"{1,[2],[3],[...],...}"
3> lists:flatten(io_lib:write({[1,2,3],[4,5],6,7,8,9}, [{chars_limit,20}])).
"{[1,2|...],[4|...],...}"
返回打印原子 Atom
所需的字符列表。
-spec write_atom_as_latin1(Atom) -> latin1_string() when Atom :: atom().
返回打印原子 Atom
所需的字符列表。非 Latin-1 字符会被转义。
返回在 Unicode 字符集中打印字符常量所需的字符列表。
-spec write_char_as_latin1(Char) -> latin1_string() when Char :: char().
返回在 Unicode 字符集中打印字符常量所需的字符列表。非 Latin-1 字符会被转义。
-spec write_latin1_char(Latin1Char) -> latin1_string() when Latin1Char :: unicode:latin1_char().
返回在 ISO Latin-1 字符集中打印字符常量所需的字符列表。
-spec write_latin1_string(Latin1String) -> latin1_string() when Latin1String :: latin1_string().
返回将 Latin1String
作为字符串打印所需的字符列表。
返回将 String
作为字符串打印所需的字符列表。
-spec write_string_as_latin1(String) -> latin1_string() when String :: string().
返回将 String
作为字符串打印所需的字符列表。非 Latin-1 字符会被转义。