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

MATLAB读取文本文件之fscanf函数

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

" r" q" W/ t- a! Ffscanf
- D" X) b1 w) Y/ `/ X按指定格式从文本文件中读取数据。用法:
$ \, [5 S6 v( s' |6 z) [
6 r7 `7 V) e" t8 X: ~1 }- ]4 }0 l: L
  • A = fscanf(fileID,formatSpec);
  • %通过指定读取格式formatSpec,从文本文件中读取数据至列向量A。fscanf会重复应用格式字符串formatSpec,直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取自动结束。
  • A = fscanf(fileID,formatSpec,sizeA);
  • %sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。
    ' R1 M/ W( U7 C- s# e$ B- R

0 |* @( {6 c, u( c! O* z, l6 D  S/ J- h$ R. b- U7 m
所要读取的文本文件被文件标识符 fileID 标识,通过 fopen 函数可以获取文件的 fileID。当结束读取时,一定要记得使用 fclose 函数关闭文件。
4 H: _; ?5 _  ]' v/ n8 G光看函数的用法介绍可能会比较难懂,通过下面的例子会比较容易理解。 例:文本文件 test.txt 包含以下数据:& U6 Y3 V& G7 z3 r8 k( N0 @3 i2 r
16。2。3。13. [- H' p4 a: m& Z/ A
5。11。10。8) c2 }- m: q: T( P
9。7。6。12% b, p4 C) }: Q9 @/ v9 C
4。14。15。1
6 Q- {8 n' x: [/ p! f
6 D+ M; @' X+ b  K
  • 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; R+ N- X; v; w8 E! W
5 U0 ?( G  q2 B/ s% y4 {

- z! Z' `. w( H8 S" E4 L1 v' I下面详细解释一下 fscanf 的读取原理:
  y  p5 n, D- a4 I# D* @
0 C  \- e- @& B, \当用 fopen 打开文件时,会有一个文件指针在文件开头。fscanf 通过你设定的格式字符串 formatSpec 来读取数据(formatSpec 由字符串和转义说明符组成,其中转义说明符由 % 开头,以转换字母结尾。上面的例子中 %d 就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec 第一个字符块为转义说明符 %d,那么 fscanf 会先将第一个整数16读入进 A,之后文件指针跳至16右边,formatSpec 第2个字符块是字符串’。’,由于它不是转义说明符,文件指针会跳过’。’到达’。’右边。之后再是转义说明符 %d,则将2读入进 A,以此类推。
0 P, J& _) [' R  g用下面图片进行说明:8 b- _+ K. o# x8 D8 P

- Y. j% o( g8 N4 @  S 3 y2 j6 J# t/ Y# x" \+ f& [

& ^5 s3 v9 S) x: K4 C- G6 ?- }- @  F) E& ]1 n+ N3 w
如果将这个例子的读取代码写成:
: ^  E0 F2 r/ R& j
4 `/ Z3 u4 B7 A$ m
  • fid = fopen('test.txt');
  • A = fscanf(fid,'%d。',[4,4])
  • fclose(fid);
  • A = A.'/ `6 }! G* N4 Z2 G

) x$ ]# r" d$ I' I$ U将会得到:
' h8 }+ c' u5 m" J1 C# R
( o0 u* Q+ f" {& R+ R: b+ k
  • A =
  •     16     2     3    13, K+ c1 j5 V5 \8 x. I  F3 K

$ ^3 G- g8 R- s1 h0 A# T* c0 [8 @- A) x& l7 ^9 ^. P
原因就是当文件指针读取完13时,formatSpec 需要匹配的字符串是’。’,但是13的下一个字符串是5,匹配失败,fscanf 停止读取。: w% S8 \( z: ?, {7 k1 @
再以一个比较复杂的文本文件为例:
5 S( F4 C$ L1 A& ?例:文本文件test.txt包含以下数据:
4 o# h, ?6 m9 W4 R. Elambda: 7.580000e-05 4 _3 i: h& b$ f+ k, c, p
lambdaB: 8.000000e-05  s+ Z4 i+ Y, C
initial pulse width: 7.853636e-13+ ^& |: g0 p/ T! ^2 i; u1 m9 k- i
output pulse width: 6.253030e-13
& {. a6 T% ?5 Fdispersion length: 6.307732e-023 D3 n) |3 t; O8 \5 t/ @
nonlinear length: 9.572495e-014 ?0 F% _- _4 I4 K  V) ^
3 `/ K7 o: p+ Y1 u5 w8 @
lambda: 7.590000e-05' i- Y* B  Z- w0 z( H
lambdaB: 8.000000e-05
1 v( u$ k2 ]1 T# \( |initial pulse width: 7.848788e-13( u* Q/ J7 G9 |' Q+ n* J$ P
output pulse width: 5.778485e-13* k4 H- a2 ~1 ^, l9 V% _5 {$ v$ A/ F
dispersion length: 5.852858e-02
$ d/ x7 ^1 e% Z' j: anonlinear length: 9.195277e-01
* M& c- n* f2 }. U8 x! E1 L0 E7 \
, ?) M9 l  U3 R6 g+ G& s  v- {/ D7 c8 ]$ q. d* c" [8 v7 S, U0 R

- x0 S" E" [( C; \9 I现在想要把所有的数字信息提取出来:
* F& f1 D- K8 L2 P" g) t+ q" i8 H3 T  S1 P. J/ s
  • 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);/ T/ R; P" X  [. u) D
6 X9 u. {6 R! _
$ R8 A1 ]9 }1 A2 M$ i5 }# _

- W0 n8 A$ C( _# \% X9 B/ L- C5 T* L' J, E. H- c

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-20 04:51 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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