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
为正整数。
示例
将文件内容读取到列向量中
创建一个包含浮点数的示例文本文件。
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';
读取文件数据并按列顺序填充输出数组 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
是一个包含该文件中的数据的列向量。
关闭文件。
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];
读取文件数据并按列顺序填充输出数组 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
跳过文件中的特定字符
跳过示例文件中的特定字符并仅返回数值数据。
创建一个包含温度值的示例文本文件。
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 为基数)的表示形式。
数值字段类型 | 转换设定符 | 详细信息 |
---|---|---|
有符号整数 |
| 以 10 为基数 |
| 文件中的值确定相应基数:
| |
| 64 位值,以 10、8 或 16 为基数 | |
无符号整数 |
| 以 10 为基数 |
| 以 8 为基数(八进制) | |
| 以 16 为基数(十六进制) | |
| 64 位值,以 10、8 或 16 为基数 | |
浮点数 | | 浮点字段可以包含下列任意项(不区分大小写): |
| ||
|
字符字段
下表列出了可用于字符输入的转换设定符。
字符字段类型 | 转换设定符 | 描述 |
---|---|---|
字符向量或字符串标量 |
| 读取所有字符,不包括空白。 |
| 读取任何单个字符,包括空白。 | |
模式匹配 |
| 只读取方括号中的字符,直到遇到第一个不匹配的字符或空白。 示例: |
如果 formatSpec
包含数值设定符和字符设定符的组合,则 fscanf
将每个字符转换为与其对等的数值。即使 format 显式跳过所有数值(例如,formatSpec
为 '%*d %s'
),也将进行此转换。
可选运算符
要忽略的字段和字符
fscanf
按顺序读取文件中的所有数值和字符,除非您要求它忽略特定字段或字段中的某一部分。要跳过字段,请在百分比符号 (%
) 后插入星号 (*
)。例如,要跳过整数,请指定%*d
。字段宽度
要指定一次读取的最大位数或文本字符数,请在百分比符号后插入数字。例如,
%10c
一次最多读取 10 个字符,包括空白。%4f
一次最多读取 4 位数,包括小数点。要忽略的字面文本
fscanf
忽略追加到formatSpec
转换设定符的指定文本。示例:
Level%u
将'Level1'
读作1
。示例:
%uStep
将'2Step'
读作2
。
sizeA
— 输出数组的维度
Inf
(默认) | 整数 | 二元素行向量
输出数组 A
的维度,指定为 Inf
、整数或一个二元素行向量。
sizeA 输入的格式 | 描述 |
---|---|
Inf | 读取到文件末尾。 对于数值数据,输出 A 是一个列向量。对于文本数据, A 是一个字符向量。 |
| 最多读取 n 个数值或字符字段。对于数值数据,输出 A 是一个列向量。对于文本数据, A 是一个字符向量。 |
[ | 最多读取 个数值或字符字段。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++ 代码。
用法说明和限制:
对于 MEX 代码生成,代码生成器将
fscanf
视为外部函数。请参阅 使用 MATLAB 引擎在生成的代码中执行函数调用 (MATLAB Coder)。输入参量
formatSpec
必须为常量。不支持
%s
和%[...]
转换设定符。如果关闭动态内存分配,则必须提供输入参量
sizeA
并且它必须为常量。在某些情况下,生成的代码的行为可能不同于 MATLAB。在这些情况下,生成的代码的行为与 C 语言中
fscanf
的行为相匹配。下面给出了一些示例:在生成的代码中,如果
fscanf
读取到一个空字节,返回值可能会截断。如果您将整数值
x
读取到一种整数格式,而在该整数格式中intmax
小于x
,则 MATLAB 输出在intmax
处进行饱和处理。在生成的代码中,这种情况会导致溢出。在某些情况下,在
fscanf
读取文件后,文件指针的位置在 MATLAB 和生成的代码中可能会有所不同。例如,假设文件myFile.txt
包含字符向量'1+2I'
。您执行以下命令:fid = fopen('myFile.txt','r'); tmp = fscanf(fid, '%f')
tmp = 1 2
使用
ftell
确定位置指针在文件myFile.txt
中的当前位置。ftell(fid)
ans = 3
在 MATLAB 中,在
fscanf
执行后,文件指针位于第三个字符'2'
后。在生成的代码中,在fscanf
执行后,文件指针位于文件末尾的标记处。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
版本历史记录
在 R2006a 之前推出R2022b: 在基于线程的环境中使用函数
此函数支持基于线程的环境。
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)