fread
读取二进制文件中的数据
语法
说明
示例
读取整个文件的 uint8 数据
将一个九元素向量写入到示例文件 nine.bin
中。
fileID = fopen('nine.bin','w'); fwrite(fileID,[1:9]); fclose(fileID);
将文件中的所有数据读取到 double
类的向量中。默认情况下,fread
一次读取文件中的 1 个字节,将每个字节解释为一个 8 位无符号整数 (uint8
),并返回一个 double
数组。
fileID = fopen('nine.bin');
A = fread(fileID)
A = 9×1
1
2
3
4
5
6
7
8
9
fread
返回一个列向量,文件中的每个字节对应一个元素。
查看 A
的相关信息。
whos A
Name Size Bytes Class Attributes A 9x1 72 double
关闭文件。
fclose(fileID);
读取包含双精度数据的整个文件
创建一个名为 doubledata.bin
并且包含九个双精度值的文件。
fileID = fopen('doubledata.bin','w'); fwrite(fileID,magic(3),'double'); fclose(fileID);
打开文件 doubledata.bin
,并将文件中的数据读取到一个 3×3 数组 A
。指定源数据为 double
类。
fileID = fopen('doubledata.bin'); A = fread(fileID,[3 3],'double')
A = 3×3
8 1 6
3 5 7
4 9 2
关闭文件。
fclose(fileID);
读取文件中的选定行或列
创建一个名为 nine.bin
并且包含 1 - 9 中的值的文件。以 uint16
值形式写入数据。
fileID = fopen('nine.bin','w'); fwrite(fileID,[1:9],'uint16'); fclose(fileID);
将前六个值读取到一个 3×2 数组中。指定源数据为 uint16
类。
fileID = fopen('nine.bin'); A = fread(fileID,[3,2],'uint16')
A = 3×2
1 4
2 5
3 6
fread
返回使用文件 nine.bin
中的前六个值逐列填充的一个数组。
返回到文件的开头。
frewind(fileID)
一次读取两个值,并在读取下一个值之前跳过一个值。使用 precision
值 '2*uint16'
指定此格式。因为数据为 uint16
类,所以一个值由 2 个字节表示。因此,将 skip
参数指定为 2
。
precision = '2*uint16';
skip = 2;
B = fread(fileID,[2,3],precision,skip)
B = 2×3
1 4 7
2 5 8
fread
返回使用 nine.bin
中的值逐列填充的一个 2×3 数组。
关闭文件。
fclose(fileID);
读取二进制编码的十进制值的位数
创建一个包含二进制编码小数 (BCD) 值的文件。
str = ['AB'; 'CD'; 'EF'; 'FA']; fileID = fopen('bcd.bin','w'); fwrite(fileID,hex2dec(str),'ubit8'); fclose(fileID);
一次读取 1 个字节。
fileID = fopen('bcd.bin'); onebyte = fread(fileID,4,'*ubit8');
显示 BCD 值。
disp(dec2hex(onebyte))
AB CD EF FA
使用 frewind
返回到文件的开头。如果在 little-endian 系统上一次读取 4 位数,则结果将以错误顺序显示。
frewind(fileID)
err = fread(fileID,8,'*ubit4');
disp(dec2hex(err))
B A D C F E A F
使用 frewind
返回到文件的开头。与之前一样一次读取数据的 4 位,但指定 big-endian 排序以显示正确的结果。
frewind(fileID) correct = fread(fileID,8,'*ubit4','ieee-be'); disp(dec2hex(correct))
A B C D E F F A
关闭文件。
fclose(fileID);
输入参数
fileID
— 文件标识符
整数
已打开二进制文件的文件标识符,指定为整数。使用 fread
读取文件之前,您必须使用 fopen
打开文件并获取 fileID
。
数据类型: double
sizeA
— 输出数组的维度
Inf
(默认) | 整数 | 二元素行向量
输出数组 A
的维度,指定为 Inf
、整数或一个二元素行向量。
sizeA 输入的格式 | 输出数组 A 的维度。 |
---|---|
Inf | 列向量,其中的每个元素包含文件中的一个值。 |
| 具有 n 个元素的列向量。 |
| m ×n 矩阵,按列顺序填充。n 可以为 Inf ,但 m 不能为该值。 |
precision
— 要读取的值的类和大小
'uint8=>double'
(默认) | 字符向量或字符串标量
要读取的值的类和大小(以位为单位),以下列形式之一指定为字符向量或字符串标量。(可选)输入可指定输出矩阵 A
的类。
precision 输入的格式 | 描述 |
---|---|
source | 输入值属于 source 指定的类。输出矩阵 A 为类 double 。示例: 'int16' |
source =>output | 输入值属于 source 指定的类。输出矩阵 A 的类由 output 指定。示例: 'int8=>char' |
* | 输入值和输出矩阵 A 属于 source 指定的类。对于 bit 或 ubit 精度,输出具有可包含输入的最小类。示例: '*ubit18' 这等同于 'ubit18=>uint32' |
| 在跳过 |
下表显示了 source
和 output
的可能值。
值类型 | 精度 | 位(字节) |
---|---|---|
无符号整数 |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
有符号整数 |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
浮点数 |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
字符 |
|
|
| MATLAB® |
对于 source
的大多数值,如果 fread
在读取完整值之前达到文件的末尾,则不会返回最终值的结果。但是,如果 source
是 bit
或 n
ubit
,则 n
fread
将返回最后一个值的部分结果。
注意
要在 MATLAB 中保留 NaN
和 Inf
值,请读取和写入 double
或 single
类的数据。
数据类型: char
| string
skip
— 要跳过的字节数
0 (默认) | 标量
读取每个值之后要跳过的字节数,指定为标量。如果将 precision
指定为 bit
或 n
ubit
,请以位为单位指定 n
skip
。
使用 skip
参数从固定长度记录的非连续字段中读取数据。
machinefmt
— 读取字节的顺序
'n'
(默认) | 'b'
| 'l'
| 's'
| 'a'
| ...
读取文件中的字节的顺序,指定为字符向量或字符串标量。将 machinefmt
指定为下表中列出的值之一。对于 bit
和 n
ubit
精度,n
machinefmt
指定字节中位的读取顺序,而字节的读取顺序仍与系统字节顺序相同。
| 系统字节排序方式(默认) |
| Big-endian 排序 |
| Little-endian 排序 |
| Big-endian 排序,64 位长数据类型 |
| Little-endian 排序,64 位长数据类型 |
默认情况下,当前支持的所有平台都使用 little-endian 排序方式对新文件进行排序。现有二进制文件可以使用 big-endian 或 little-endian 排序方式。
数据类型: char
| string
输出参数
A
— 文件数据
列向量 | 矩阵
文件数据,以列向量形式返回。如果指定 sizeA
参数,则 A
是指定大小的矩阵。A
中的数据为类 double
,除非在 precision
参数中指定不同的类。
count
— 读取的字符数
标量
读取的字符数,以标量值形式返回。
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
输入参数
precision
必须为常量。precision
指定的source
和output
类不能具有以下值:'long'
、'ulong'
、'unsigned long'
、'bit
或n
''ubit
。n
'不能使用
machinefmt
输入。如果
precision
指定的source
或output
为 C 类型,例如int
,则该类型的目标和生产大小必须:匹配。
直接映射到 MATLAB 类型。
precision
指定的source
类型必须直接映射到目标硬件上的 C 类型。如果
fread
调用读取整个文件,则所有数据都必须能够放入可供代码生成使用的最大数组中。如果
sizeA
不是常量,或者包含非有限元,则需要动态分配内存。fread
函数的代码生成器将source
或output
的char
值视为带符号的8
位整数。只能使用介于0
和127
之间的值。生成的代码不会报告文件读取错误。因此,您必须在自己的 MATLAB 代码中自行编写文件读取错误处理程序。在您的错误处理代码中,可以考虑检查读取的字节数是否与您请求的字节数匹配。例如:
... N = 100; [vals, numRead] = fread(fid, N, '*double'); if numRead ~= N % fewer elements read than expected end ...
基于线程的环境
使用 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)