前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

fscanf

作者头像
狼啸风云
修改2022-09-02 20:30:26
3.4K0
修改2022-09-02 20:30:26
举报
文章被收录于专栏:计算机视觉理论及其实现

读取文本文件中的数据

全页折叠

语法

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.4f\n',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.4f\n',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
  • 字段宽度 要指定一次读取的最大位数或文本字符数,请在百分比符号后插入数字。例如,%10c 一次最多读取 10 个字符,包括空白。%4f 一次最多读取 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

主题

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 语法
  • 说明
  • 示例
    • 将文件内容读取到列向量中
      • 将文件内容读取到数组中
        • 跳过文件中的特定字符
        • 输入参数
          • fileID - 文件标识符 整数
            • formatSpec - 数据字段的格式 字符向量 | 字符串标量
              • sizeA - 输出数组的维度 Inf (默认) | 整数 | 二元素行向量
              • 输出参数
                • A - 文件数据 列向量 | 矩阵 | 字符向量 | 字符数组
                  • count - 读取的字符数 标量
                  • 提示
                  • 算法
                  • 扩展功能
                    • C/C++ 代码生成 使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
                    • 另请参阅
                      • 主题
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档