找回密码
 注册
关于网站域名变更的通知
查看: 1135|回复: 1
打印 上一主题 下一主题

MATLAB读取文本文件之fscanf函数

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-4-27 10:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

7 M# `/ \1 Z5 u. H, hfscanf
4 J7 }0 f8 n0 O! e! i, ^5 m! M. i按指定格式从文本文件中读取数据。用法:
, \. l, m' L" L
, m8 h" Z; H6 ]& n9 L$ ?' ^+ a% u
  • A = fscanf(fileID,formatSpec);
  • %通过指定读取格式formatSpec,从文本文件中读取数据至列向量A。fscanf会重复应用格式字符串formatSpec,直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取自动结束。
  • A = fscanf(fileID,formatSpec,sizeA);
  • %sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。* p0 i- p; |# f; V, X& u

! A: g5 i  e4 b: {* z+ F/ w4 q8 n3 W, K; t8 x8 E' c
所要读取的文本文件被文件标识符 fileID 标识,通过 fopen 函数可以获取文件的 fileID。当结束读取时,一定要记得使用 fclose 函数关闭文件。
' O1 p, }) K1 R; V0 G光看函数的用法介绍可能会比较难懂,通过下面的例子会比较容易理解。 例:文本文件 test.txt 包含以下数据:4 v, L8 v, K3 g, N
16。2。3。13
0 p$ A2 L! B4 ~7 X5。11。10。8
$ |2 _; P* b& O: `+ L! E+ K/ S  I; F9。7。6。12
+ i3 B# s/ y( D1 M, ^7 T0 z# U1 R* @4。14。15。11 L4 Q9 u  z6 L: P0 @

" o2 k" @: E2 A8 x6 r
  • fid = fopen('test.txt');              %通过fopen获取文件标识
  • formatSpec = '%d。%d。%d。%d';         %指定读取格式
  • A = fscanf(fid,formatSpec ,[4,4]);    %读取文件数据并存为4*4矩阵
  • fclose(fid);                          %调用fclose关闭文件
  • A = A.’                               %由于fscanf是列主序,因此读取完还需要进行转置
  • A =
  •     16     2     3    13
  •      5    11    10     8
  •      9     7     6    12
  •      4    14    15     1
    . i; K3 K: A2 [2 u; H& P; l6 Q3 W

, `! J& b% O' b  \# H, x2 C4 m7 k$ E, p+ t
下面详细解释一下 fscanf 的读取原理: . W5 a/ ~8 }7 d5 W* ?3 N
$ e& _6 V% J) y! m9 A
当用 fopen 打开文件时,会有一个文件指针在文件开头。fscanf 通过你设定的格式字符串 formatSpec 来读取数据(formatSpec 由字符串和转义说明符组成,其中转义说明符由 % 开头,以转换字母结尾。上面的例子中 %d 就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec 第一个字符块为转义说明符 %d,那么 fscanf 会先将第一个整数16读入进 A,之后文件指针跳至16右边,formatSpec 第2个字符块是字符串’。’,由于它不是转义说明符,文件指针会跳过’。’到达’。’右边。之后再是转义说明符 %d,则将2读入进 A,以此类推。
  p( M. N$ y' |0 j* s用下面图片进行说明:% o- k) ^, P( M

$ j) L7 V7 N) c; }- [$ r% i
2 f3 m  Z! {! g' w8 v1 k( D8 L" ~- ^: P( E

2 m7 U  a' p4 ], q4 d如果将这个例子的读取代码写成:
8 M6 e( t' R2 d1 l$ o+ p
' d) k8 j2 y. y! R3 g4 r5 |
  • fid = fopen('test.txt');
  • A = fscanf(fid,'%d。',[4,4])
  • fclose(fid);
  • A = A.'
    / g  D* v% s7 M4 G6 k' A: m
& V( Z* V& _1 q
将会得到:) }& W0 a# Q) a# X7 j
0 o6 ~  r% `" {- Z' `; q
  • A =
  •     16     2     3    13& K; N8 p( h9 F& a

; h% L' b; U5 z* E5 M+ I( N
7 @0 i! W8 ]- o1 r( w- `7 }' r原因就是当文件指针读取完13时,formatSpec 需要匹配的字符串是’。’,但是13的下一个字符串是5,匹配失败,fscanf 停止读取。
, [- u, W" A$ T/ k9 E  N再以一个比较复杂的文本文件为例:& N. q( d7 u, M" P4 |& M5 K
例:文本文件test.txt包含以下数据:
0 x: U7 R' C6 ?+ Qlambda: 7.580000e-05 0 X0 R' z; z; \7 ^; Z0 H
lambdaB: 8.000000e-05
+ \! B2 G+ H: J- B) q4 H- Rinitial pulse width: 7.853636e-13' \0 V8 K: w. N; w* V8 S7 A" ]$ O
output pulse width: 6.253030e-13* D$ i' l$ @( o6 ^- Z) `
dispersion length: 6.307732e-02$ v- |' v8 y. K* M
nonlinear length: 9.572495e-01
: j9 i' R4 P# F; q( J4 o. n7 R, c+ U( a: N0 N/ ^1 \" }
lambda: 7.590000e-05' W7 W8 Z9 Y) Q4 @
lambdaB: 8.000000e-05
1 z3 A- C8 j9 j, Finitial pulse width: 7.848788e-13, k1 _" N. K$ v/ h
output pulse width: 5.778485e-13
( L7 w, L% p$ {4 c% ^7 G+ r2 adispersion length: 5.852858e-02# O7 t3 E  |+ ?6 v
nonlinear length: 9.195277e-01
6 ~( d" o6 A  V0 p* x" B# G4 m; l
% l0 K& }) B6 s  ~) B( w! X
9 ?" c( w/ }3 }- N, ~1 z" [: E" L7 |3 T7 a6 q! z% Q
现在想要把所有的数字信息提取出来:& N; [2 e  b8 Y, V8 j
% j! g* C, Q/ t/ F. D4 z
  • fid = fopen('F:\test.txt');
  • c1 = '%*s %e';                       %第一行的转义说明符,’%’后面接一个’*’代表跳过这个数据,%*s即代表跳过第一个字符串’lambda:’,%e表示读取以科学计数法表示的数字。
  • c2 = '%*s %e';
  • c3 = '%*s %*s %*s %e';
  • c4 = '%*s %*s %*s %e';
  • c5 = '%*s %*s %e';
  • c6 = '%*s %*s %e';
  • formatSpec = [c1,c2,c3,c4,c5,c6];    %以6行为一组,重复读取,直至读取完整个文件
  • A = fscanf(fid,formatSpec,[6,inf])
  • fclose(fid);; k" a0 s- Q, |! S$ E

0 U% N; f# Q$ y! y& @0 M6 o3 z  }. {7 b
& B' y. C9 G% w# J! |

1 N; Q; V4 q  }; T

该用户从未签到

2#
发表于 2021-4-27 10:56 | 只看该作者
MATLAB读取文本文件之fscanf函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 23:08 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表