fscanf

2022-09-02 20:30:26 浏览数 (1)

读取文本文件中的数据

全页折叠

语法

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 按列顺序填充 AsizeA 必须为正整数或采用 [m n] 的形式,其中 mn 为正整数。

示例

[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

代码语言:javascript复制
fileID = fopen('nums1.txt','r');

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

代码语言:javascript复制
formatSpec = '%f';

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

代码语言:javascript复制
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

代码语言:javascript复制
fileID = fopen('nums2.txt','r');

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

代码语言:javascript复制
formatSpec = '%d %f';
sizeA = [2 Inf];

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

代码语言:javascript复制
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 与文件中数据的方向匹配。

代码语言:javascript复制
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 表示度数符号。

代码语言:javascript复制
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 为基数。
  • 如果初始数字为 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
  • 字段宽度 要指定一次读取的最大位数或文本字符数,请在百分比符号后插入数字。例如,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 位有符号整数设定符,则 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 在停止处理之前读取的值。

count - 读取的字符数 标量

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

提示

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

算法

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

扩展功能

C/C 代码生成 使用 MATLAB® Coder™ 生成 C 代码和 C 代码。

另请参阅

fgetl | fgets | fopen | fprintf | fread | sscanf | textscan

主题

  • 使用低级 I/O 导入文本数据文件

0 人点赞