14.2.11 格式化输入

Octave 提供了 scanffscanfsscanf 函数来读取格式化输入。这些函数各有两种形式。一种形式用于从文件中提取数据向量,另一种形式更类似 C 语言风格。

 
[val, count, errmsg] = fscanf (fid, template, size)
[v1, v2, …, count, errmsg] = fscanf (fid, template, "C")

在第一种形式中,从 fid 读取数据,根据 template 进行转换,结果返回到矩阵 val 中。

可选参数 size 指定要读取的数据量,可以是以下之一:

Inf

尽可能多地读取,返回一个列向量。

nr

读取最多 nr 个元素,返回一个列向量。

[nr, Inf]

尽可能多地读取,返回一个具有 nr 行的矩阵。如果读取的元素数量不是 nr 的整数倍,则最后一列用零填充。

[nr, nc]

读取最多 nr * nc 个元素,返回一个具有 nr 行的矩阵。如果读取的元素数量不是 nr 的整数倍,则最后一列用零填充。

如果省略 size,则假定值为 Inf

如果 template 仅指定字符转换,则返回一个字符串。

成功读取的项目数在 count 中返回。

如果出现错误,errmsg 包含一个依赖于系统的错误消息。

在第二种形式中,从 fid 读取数据,根据 template 进行转换,模板中的每个转换说明符对应一个单独的标量返回值。这种形式更类似 C 语言风格,并且与之前版本的 Octave 兼容。成功转换的数量在 count 中返回。

有关模板字符串语法的完整描述,请参阅 GNU Octave 手册的格式化输入部分。

另请参阅: fgetsfgetlfreadscanfsscanffopen

 
[val, count, errmsg] = scanf (template, size)
[v1, v2, …, count, errmsg] = scanf (template, "C")

这相当于以 fid = stdin 调用 fscanf

目前在交互式程序中调用 scanf 没有实际用处。

另请参阅: fscanfsscanfprintf

 
[val, count, errmsg, pos] = sscanf (string, template, size)
[v1, v2, …, count, errmsg] = sscanf (string, template, "C")

这与 fscanf 类似,只是字符从字符串 string 中获取,而不是从流中读取。

到达字符串末尾被视为文件结束条件。除了 fscanf 返回的值之外,下一个要读取字符的索引在 pos 中返回。

另请参阅: fscanfscanfsprintf

scanf 的调用表面上类似于对 printf 的调用,都是在模板字符串的控制下读取任意参数。虽然模板中转换说明符的语法与 printf 非常相似,但模板的解释更偏向于自由格式输入和简单的模式匹配,而不是固定字段的格式化。例如,大多数 scanf 转换会跳过输入文件中任意数量的"空白字符"(包括空格、制表符和换行符),并且数字输入转换没有相应输出转换那样的精度概念。通常,模板中的非空白字符需要与输入流中的字符精确匹配。例如,请注意 sscanf 在混合使用数字和字符串输出类型时,会以不同方式解析字符串和空白字符:

teststr = "1 is a lonely number";
sscanf (teststr, "%s is a %s")
⇒   1lonelynumber

sscanf (teststr, "%g is a %s")
⇒ 
     1
   108
   111
   110
   101
   108
   121

[a, b, c] = sscanf ("1 is a lonely number", "%g is a %s %s", "C")
⇒   a =  1
⇒   b = lonely
⇒   c = number

当发生匹配失败时,scanf 立即返回,将第一个不匹配的字符作为下一个要从流中读取的字符,并且 scanf 返回所有已成功转换的项目。

格式化输入函数不像格式化输出函数那样频繁使用。这部分是因为正确使用它们需要一些小心谨慎。另一个原因是很难从匹配错误中恢复。

模板字符串中允许的特定标志和修饰符及其解释将在以下各节中详细描述。


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4