Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

fscanf

读取文本文件中的数据

说明

示例

A = fscanf(fileID,formatSpec) 将打开的文本文件中的数据读取到列向量 A 中,并根据 formatSpec 指定的格式解释文件中的值。fscanf 函数在整个文件中重新应用该格式,并将文件指针定位在文件结尾标记处。如果 fscanf 无法将 formatSpec 与数据相匹配,将只读取匹配的部分并停止处理。

该文本文件由文件标识符 fileID 指示。使用 fopen 打开文件,指定字符编码,以及获取 fileID 值。读取文件后,请调用 fclose(fileID) 来关闭文件。

示例

A = fscanf(fileID,formatSpec,sizeA) 将文件数据读取到维度为 sizeA 的数组 A 中,并将文件指针定位到最后读取的值之后。fscanf 按列顺序填充 AsizeA 必须为正整数或采用 [m n] 的形式,其中 mn 为正整数。

示例

[A,count] = fscanf(___) 还将返回 fscanf 读取到 A 中的字段数。对于数值数据,这是已读取的值数。您可以将此语法与前面语法中的任何输入参数结合使用。

示例

全部折叠

创建一个包含浮点数的示例文本文件。

x = 100*rand(8,1);
fileID = fopen('nums1.txt','w');
fprintf(fileID,'%4.4f\n',x);
fclose(fileID);

查看文件的内容。

type nums1.txt
81.4724
90.5792
12.6987
91.3376
63.2359
9.7540
27.8498
54.6882

打开要读取的文件并获取文件标识符 fileID

fileID = fopen('nums1.txt','r');

定义要读取的数据的格式。使用 '%f' 指定浮点数。

formatSpec = '%f';

读取文件数据并按列顺序填充输出数组 Afscanf 在整个文件中重新应用格式 formatSpec

A = fscanf(fileID,formatSpec)
A = 8×1

   81.4724
   90.5792
   12.6987
   91.3376
   63.2359
    9.7540
   27.8498
   54.6882

A 是一个包含该文件中的数据的列向量。

关闭文件。

fclose(fileID);

创建一个包含整数和浮点数的示例文本文件。

x = 1:1:5;
y = [x;rand(1,5)];
fileID = fopen('nums2.txt','w');
fprintf(fileID,'%d %4.4f\n',y);
fclose(fileID);

查看文件的内容。

type nums2.txt
1 0.8147
2 0.9058
3 0.1270
4 0.9134
5 0.6324

打开要读取的文件并获取文件标识符 fileID

fileID = fopen('nums2.txt','r');

定义要读取的数据的格式和输出数组的形状。

formatSpec = '%d %f';
sizeA = [2 Inf];

读取文件数据并按列顺序填充输出数组 Afscanf 在整个文件中重新使用格式 formatSpec

A = fscanf(fileID,formatSpec,sizeA)
A = 2×5

    1.0000    2.0000    3.0000    4.0000    5.0000
    0.8147    0.9058    0.1270    0.9134    0.6324

fclose(fileID);

转置该数组,以便 A 与文件中数据的方向匹配。

A = A'
A = 5×2

    1.0000    0.8147
    2.0000    0.9058
    3.0000    0.1270
    4.0000    0.9134
    5.0000    0.6324

跳过示例文件中的特定字符并仅返回数值数据。

创建一个包含温度值的示例文本文件。

str = '78°C 72°C 64°C 66°C 49°C';
fileID = fopen('temperature.dat','w');
fprintf(fileID,'%s',str);
fclose(fileID);

读取文件中的数字并跳过文本 °C。此外,还返回 fscanf 读取的值数。扩展的 ASCII 代码 176 表示度数符号。

fileID = fopen('temperature.dat','r');
degrees = char(176);
[A,count] = fscanf(fileID, ['%d' degrees 'C'])
fclose(fileID);
A =

    78
    72
    64
    66
    49


count =

     5

A 是一个包含文件中的数值的向量。count 指示 fscanf 读取五个值。

输入参数

全部折叠

已打开文本文件的文件标识符,指定为整数。使用 fscanf 读取文件之前,您必须使用 fopen 打开文件并获取 fileID

数据类型: double

文件中数据字段的格式,指定为字符向量或由一个或多个转换设定符组成的字符串标量。fscanf 在读取文件时,会尝试将数据与 formatSpec 指定的格式进行匹配。

数值字段

下表列出了可用于数值输入的转换设定符。fscanf 将值转换为其十进制(以 10 为基数)的表示形式。

数值字段类型转换设定符详细信息

有符号整数

%d

以 10 为基数

%i

文件中的值确定相应基数:

  • 默认值以 10 为基数。

  • 如果初始数字为 0x0X,则值为十六进制(以 16 为基数)。

  • 如果初始数字为 0,则值为八进制(以 8 为基数)。

%ld%li

64 位值,以 10、8 或 16 为基数

无符号整数

%u

以 10 为基数

%o

以 8 为基数(八进制)

%x

以 16 为基数(十六进制)

%lu%lo%lx

64 位值,以 10、8 或 16 为基数

浮点数

%f

浮点字段可以包含下列任意项(不区分大小写):Inf-InfNaN-NaN

%e

%g

字符字段

下表列出了可用于字符输入的转换设定符。

字符字段类型转换设定符说明

字符向量或字符串标量

%s

读取所有字符,不包括空白。

%c

读取任何单个字符,包括空白。
要一次读取多个字符,请指定字段宽度。

模式匹配

%[...]

只读取方括号中的字符,直到遇到第一个不匹配的字符或空白。

示例:%[mus]'summer ' 读作 'summ'

如果 formatSpec 包含数值设定符和字符设定符的组合,则 fscanf 将每个字符转换为与其对等的数值。即使 format 显式跳过所有数值(例如,formatSpec'%*d %s'),也将进行此转换。

可选运算符

  • 要忽略的字段和字符

    fscanf 按顺序读取文件中的所有数值和字符,除非您要求它忽略特定字段或字段中的某一部分。要跳过字段,请在百分比符号 (%) 后插入星号 (*)。例如,要跳过整数,请指定 %*d

  • 字段宽度

    要指定一次读取的最大位数或文本字符数,请在百分比符号后插入数字。例如,%10c 一次最多读取 10 个字符,包括空白。%4f 一次最多读取 4 位数,包括小数点。

  • 要忽略的字面文本

    fscanf 忽略追加到 formatSpec 转换设定符的指定文本。

    示例:Level%u'Level1' 读作 1

    示例:%uStep'2Step' 读作 2

输出数组 A 的维度,指定为 Inf、整数或一个二元素行向量。

sizeA 输入的格式说明
Inf读取到文件末尾。
对于数值数据,输出 A 是一个列向量。
对于文本数据,A 是一个字符向量。
n最多读取 n 个数值或字符字段。
对于数值数据,输出 A 是一个列向量。
对于文本数据,A 是一个字符向量。
[m,n]最多读取 m*n 个数值或字符字段。n 可以为 Inf,但 m 不可以。输出 A 是按列顺序填充的 m×n 数组。

输出参数

全部折叠

文件数据,以列向量、矩阵、字符向量或字符数组形式返回。A 的类和大小取决于 formatSpec 输入:

  • 如果 formatSpec 仅包含数值设定符,则 A 为数值。如果指定 sizeA 参数,则 A 是指定大小的矩阵。否则,A 为列向量。如果输入包含的值数少于 sizeA 个,则 fscanf 将使用零填充 A

    • 如果 formatSpec 仅包含 64 位有符号整数设定符,则 Aint64 类。

    • 如果 formatSpec 仅包含 64 位无符号整数设定符,则 Auint64 类。

    • 否则,Adouble 类。

  • 如果 formatSpec 仅包含字符或文本设定符(%c%s),则 A 为字符数组。如果指定 sizeA 并且输入包含比其少的字符,则 fscanf 使用 char(0) 填充 A

  • 如果 formatSpec 包含数值设定符和字符设定符的组合,则 Adouble 类的数值,fscanf 将每个文本字符转换为与其对等的数值。即使 formatSpec 显式跳过所有数值字段(例如,formatSpec'%*d %s'),也将发生此情况。

  • 如果 MATLAB® 无法将文件数据与 formatSpec 相匹配,则 A 可以是数值或字符数组。A 的类取决于 fscanf 在停止处理之前读取的值。

读取的字符数,以标量值形式返回。

提示

  • 读取函数 sscanffscanf 的格式设定符不同于写入函数 sprintffprintf 的格式。读取函数不支持精度字段。宽度字段指定可写入的最小值和可读取的最大值。

算法

MATLAB 使用与文件相关联的编码方案读取字符。当使用 fopen 函数打开文件时,可以指定该编码。

扩展功能

在 R2006a 之前推出