14.2.11格式化输入

Octave提供scanf, fscanfsscanf用于读取格式化输入的函数。这些函数各有两种形式。一个可以用于从文件中提取数据向量,另一个更像“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,中的每个转换值template对应于单个标量返回值。这种形式更像“C”,也与以前版本的Octave兼容。中返回的成功转换数count

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

详见: fgets, fgetl, fread, scanf, sscanf, fopen.

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

这相当于调用fscanf具有fid= stdin.

当前调用无效scanf在交互式程序中。

详见: fscanf, sscanf, printf.

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

这就像fscanf,但字符取自字符串string而不是从流中。

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

详见: fscanf, scanf, sprintf.

广告

呼叫到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-2025 Octave中文网

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