fscanf

您所在的位置:网站首页 用fscanf读取的字符是乱码 fscanf

fscanf

2023-08-08 15:21| 来源: 网络整理| 查看: 265

读取文本文件中的数据

全页折叠

语法

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

创建一个包含浮点数的示例文本文件。

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); 将文件内容读取到数组中

View MATLAB Command

创建一个包含整数和浮点数的示例文本文件。

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 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 为基数)的表示形式。

数值字段类型转换设定符详细信息

有符号整数

%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

字符字段

下表列出了可用于字符输入的转换设定符。

字符字段类型转换设定符说明

字符向量或字符串标量

%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 位有符号整数设定符,则 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 导入文本数据文件

参考fscanf - 云+社区 - 腾讯云



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3