读取文本文件中的数据
全页折叠
语法
A = fscanf(fileID,formatSpec)
A = fscanf(fileID,formatSpec,sizeA)
[A,count] = fscanf(___)
说明
示例
A = fscanf(
fileID
,
formatSpec
)
将打开的文本文件中的数据读取到列向量 A
中,并根据 formatSpec
指定的格式解释文件中的值。fscanf
函数在整个文件中重新应用该格式,并将文件指针定位在文件结尾标记处。如果 fscanf
无法将 formatSpec
与数据相匹配,将只读取匹配的部分并停止处理。
该文本文件由文件标识符 fileID
指示。使用 fopen
打开文件,指定字符编码,以及获取 fileID
值。读取文件后,请调用 fclose(fileID)
来关闭文件。
示例
A = fscanf(
fileID
,
formatSpec
,
sizeA
)
将文件数据读取到维度为 sizeA
的数组 A
中,并将文件指针定位到最后读取的值之后。fscanf
按列顺序填充 A
。sizeA
必须为正整数或采用 [m n]
的形式,其中 m
和 n
为正整数。
示例
[
A
,
count
] = fscanf(___)
还将返回 fscanf
读取到 A
中的字段数。对于数值数据,这是已读取的值数。您可以将此语法与前面语法中的任何输入参数结合使用。
示例
全部折叠
将文件内容读取到列向量中
View MATLAB Command
创建一个包含浮点数的示例文本文件。
代码语言:javascript复制x = 100*rand(8,1);
fileID = fopen('nums1.txt','w');
fprintf(fileID,'%4.4fn',x);
fclose(fileID);
查看文件的内容。
代码语言:javascript复制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';
读取文件数据并按列顺序填充输出数组 A
。fscanf
在整个文件中重新应用格式 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
是一个包含该文件中的数据的列向量。
关闭文件。
代码语言:javascript复制fclose(fileID);
将文件内容读取到数组中
View MATLAB Command
创建一个包含整数和浮点数的示例文本文件。
代码语言:javascript复制x = 1:1:5;
y = [x;rand(1,5)];
fileID = fopen('nums2.txt','w');
fprintf(fileID,'%d %4.4fn',y);
fclose(fileID);
查看文件的内容。
代码语言:javascript复制type nums2.txt
2 0.9058
3 0.1270
4 0.9134
5 0.6324
打开要读取的文件并获取文件标识符 fileID
。
fileID = fopen('nums2.txt','r');
定义要读取的数据的格式和输出数组的形状。
代码语言:javascript复制formatSpec = '%d %f';
sizeA = [2 Inf];
读取文件数据并按列顺序填充输出数组 A
。fscanf
在整个文件中重新使用格式 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
跳过文件中的特定字符
跳过示例文件中的特定字符并仅返回数值数据。
创建一个包含温度值的示例文本文件。
代码语言:javascript复制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
读取五个值。
输入参数
全部折叠
fileID
- 文件标识符
整数
已打开文本文件的文件标识符,指定为整数。使用 fscanf
读取文件之前,您必须使用 fopen
打开文件并获取 fileID
。
数据类型: double
formatSpec
- 数据字段的格式
字符向量 | 字符串标量
文件中数据字段的格式,指定为字符向量或由一个或多个转换设定符组成的字符串标量。fscanf
在读取文件时,会尝试将数据与 formatSpec
指定的格式进行匹配。
数值字段
下表列出了可用于数值输入的转换设定符。fscanf
将值转换为其十进制(以 10 为基数)的表示形式。
数值字段类型 | 转换设定符 | 详细信息 |
---|---|---|
有符号整数 | %d | 以 10 为基数 |
%i | 文件中的值确定相应基数: 默认值以 10 为基数。 如果初始数字为 0x 或 0X,则值为十六进制(以 16 为基数)。 如果初始数字为 0,则值为八进制(以 8 为基数)。 | |
%ld 或 %li | 64 位值,以 10、8 或 16 为基数 | |
无符号整数 | %u | 以 10 为基数 |
%o | 以 8 为基数(八进制) | |
%x | 以 16 为基数(十六进制) | |
%lu、%lo、%lx | 64 位值,以 10、8 或 16 为基数 | |
浮点数 | %f | 浮点字段可以包含下列任意项(不区分大小写):Inf、-Inf、NaN 或 -NaN。 |
%e | ||
%g |
- 默认值以 10 为基数。
- 如果初始数字为
0x
或0X
,则值为十六进制(以 16 为基数)。 - 如果初始数字为
0
,则值为八进制(以 8 为基数)。
%ld
或 %li
64 位值,以 10、8 或 16 为基数
无符号整数
%u
以 10 为基数
%o
以 8 为基数(八进制)
%x
以 16 为基数(十六进制)
%lu
、%lo
、%lx
64 位值,以 10、8 或 16 为基数
浮点数
%f
浮点字段可以包含下列任意项(不区分大小写):Inf
、-Inf
、NaN
或 -NaN
。
%e
%g
字符字段
下表列出了可用于字符输入的转换设定符。
字符字段类型 | 转换设定符 | 说明 |
---|---|---|
字符向量或字符串标量 | %s | 读取所有字符,不包括空白。 |
%c | 读取任何单个字符,包括空白。 要一次读取多个字符,请指定字段宽度。 | |
模式匹配 | %[...] | 只读取方括号中的字符,直到遇到第一个不匹配的字符或空白。 示例:%[mus] 将 'summer ' 读作 'summ'。 |
如果 formatSpec
包含数值设定符和字符设定符的组合,则 fscanf
将每个字符转换为与其对等的数值。即使 format 显式跳过所有数值(例如,formatSpec
为 '%*d %s'
),也将进行此转换。
可选运算符
- 要忽略的字段和字符
fscanf
按顺序读取文件中的所有数值和字符,除非您要求它忽略特定字段或字段中的某一部分。要跳过字段,请在百分比符号 (%
) 后插入星号 (*
)。例如,要跳过整数,请指定%*d
。 - 字段宽度
要指定一次读取的最大位数或文本字符数,请在百分比符号后插入数字。例如,
c
一次最多读取 10 个字符,包括空白。O
一次最多读取 4 位数,包括小数点。 - 要忽略的字面文本
fscanf
忽略追加到formatSpec
转换设定符的指定文本。 示例:Level%u
将'Level1'
读作1
。 示例:%uStep
将'2Step'
读作2
。
sizeA
- 输出数组的维度
Inf
(默认) | 整数 | 二元素行向量
输出数组 A
的维度,指定为 Inf
、整数或一个二元素行向量。
sizeA 输入的格式 | 说明 |
---|---|
Inf | 读取到文件末尾。 对于数值数据,输出 A 是一个列向量。 对于文本数据,A 是一个字符向量。 |
n | 最多读取 n 个数值或字符字段。 对于数值数据,输出 A 是一个列向量。 对于文本数据,A 是一个字符向量。 |
[m,n] | 最多读取 m*n 个数值或字符字段。n 可以为 Inf,但 m 不可以。输出 A 是按列顺序填充的 m×n 数组。 |
输出参数
全部折叠
A
- 文件数据
列向量 | 矩阵 | 字符向量 | 字符数组
文件数据,以列向量、矩阵、字符向量或字符数组形式返回。A
的类和大小取决于 formatSpec
输入:
- 如果
formatSpec
仅包含数值设定符,则A
为数值。如果指定sizeA
参数,则A
是指定大小的矩阵。否则,A
为一个列向量。如果输入包含的值数少于sizeA
个,则fscanf
将使用零填充A
。- 如果
formatSpec
仅包含 64 位有符号整数设定符,则A
为int64
类。 - 如果
formatSpec
仅包含 64 位无符号整数设定符,则A
为uint64
类。 - 否则,
A
为double
类。
- 如果
- 如果
formatSpec
仅包含字符或文本设定符(%c
或%s
),则A
为字符数组。如果指定sizeA
并且输入包含比其少的字符,则fscanf
使用char(0)
填充A
。 - 如果
formatSpec
包含数值设定符和字符设定符的组合,则A
是double
类的数值,fscanf
将每个文本字符转换为与其对等的数值。即使formatSpec
显式跳过所有数值字段(例如,formatSpec
是'%*d %s'
),也将发生此情况。 - 如果 MATLAB® 无法将文件数据与
formatSpec
相匹配,则A
可以是数值或字符数组。A
的类取决于fscanf
在停止处理之前读取的值。
count
- 读取的字符数
标量
读取的字符数,以标量值形式返回。
提示
- 读取函数
sscanf
和fscanf
的格式设定符不同于写入函数sprintf
和fprintf
的格式。读取函数不支持精度字段。宽度字段指定可写入的最小值和可读取的最大值。
算法
MATLAB 使用与文件相关联的编码方案读取字符。当使用 fopen
函数打开文件时,可以指定该编码。
扩展功能
C/C 代码生成 使用 MATLAB® Coder™ 生成 C 代码和 C 代码。
另请参阅
fgetl
| fgets
| fopen
| fprintf
| fread
| sscanf
| textscan
主题
- 使用低级 I/O 导入文本数据文件