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

MATLAB读取文本文件之fscanf函数

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
$ S6 h, P2 p+ ?. Y
fscanf# C. x* E. D0 S( L
按指定格式从文本文件中读取数据。用法:
/ j7 ^3 W+ ^: O$ R! Y  v9 n6 T; S
  • A = fscanf(fileID,formatSpec);
  • %通过指定读取格式formatSpec,从文本文件中读取数据至列向量A。fscanf会重复应用格式字符串formatSpec,直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取自动结束。
  • A = fscanf(fileID,formatSpec,sizeA);
  • %sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。* Q% O" e8 s* d0 R9 `
6 j1 u7 m4 q+ a7 j" B; _
( Y+ w4 N# f: F7 p! y
所要读取的文本文件被文件标识符 fileID 标识,通过 fopen 函数可以获取文件的 fileID。当结束读取时,一定要记得使用 fclose 函数关闭文件。
% k1 c2 o9 h: u7 r& [光看函数的用法介绍可能会比较难懂,通过下面的例子会比较容易理解。 例:文本文件 test.txt 包含以下数据:
7 Y6 T/ a/ b" t( \8 R16。2。3。139 U+ W6 ]. b9 X8 t! T
5。11。10。80 m; q9 ]0 [* X; ?' D, b0 h
9。7。6。12. G$ a* I1 x+ x3 `" }
4。14。15。1
8 |( q( R4 l( y. M
( ?$ S: i9 w6 d7 h
  • 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     16 x& E5 `- C3 I# |. r5 D7 F' p

7 R8 d* i2 M7 B( v# ~# ]0 x  u# y9 p* |! B3 ~! i' ^1 K
下面详细解释一下 fscanf 的读取原理:
7 Z8 e8 ], a: h6 @) N. n# K* w3 q8 b0 e* D
当用 fopen 打开文件时,会有一个文件指针在文件开头。fscanf 通过你设定的格式字符串 formatSpec 来读取数据(formatSpec 由字符串和转义说明符组成,其中转义说明符由 % 开头,以转换字母结尾。上面的例子中 %d 就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec 第一个字符块为转义说明符 %d,那么 fscanf 会先将第一个整数16读入进 A,之后文件指针跳至16右边,formatSpec 第2个字符块是字符串’。’,由于它不是转义说明符,文件指针会跳过’。’到达’。’右边。之后再是转义说明符 %d,则将2读入进 A,以此类推。
) v6 i, k  b5 a$ {$ M- y/ N# f1 ^用下面图片进行说明:' S/ V" M4 C) J& C, z) q4 l' Z
4 C7 ~. V9 ]% X) y1 {

; @$ I( y1 H4 I. J% B
6 C  ^; Y& O% j0 z$ T4 A" T
, U2 \( ^- k1 N+ T如果将这个例子的读取代码写成:
- ?+ f/ o& H* h% ^2 N% R, v6 `: \% f7 s! O: F" h0 ?# ]
  • fid = fopen('test.txt');
  • A = fscanf(fid,'%d。',[4,4])
  • fclose(fid);
  • A = A.'
    * [8 P. k5 a) ]& r) v- H- N
3 j( j7 [% b( o/ x  _
将会得到:
% f9 R4 m) g( \- g1 _
& o& ~8 v6 ^* g: E0 c4 D/ ?$ G
  • A =
  •     16     2     3    13' ~4 C" l: p4 n2 c  R
/ p- \6 S8 r5 Y' T9 f  S
' ]! s' t% H( |, Q6 C, m
原因就是当文件指针读取完13时,formatSpec 需要匹配的字符串是’。’,但是13的下一个字符串是5,匹配失败,fscanf 停止读取。
9 ]$ |3 G5 @. E) S: ]2 o0 Y& \再以一个比较复杂的文本文件为例:
! k0 B! L8 W% [& l( g  @8 ~例:文本文件test.txt包含以下数据:
  q# c" }! `* w, B; U& W$ ]8 Nlambda: 7.580000e-05
; k0 N# u& n8 `, }: U% GlambdaB: 8.000000e-05  E. J7 q4 a3 }- H
initial pulse width: 7.853636e-13+ y7 o7 P0 @6 \
output pulse width: 6.253030e-139 B2 _! A* N+ O- Q
dispersion length: 6.307732e-02( e/ L: K& ~3 i8 [6 T1 x( x
nonlinear length: 9.572495e-01
# O5 L( M6 o2 ~: @# O) n3 C8 Q' z% p7 S( R
lambda: 7.590000e-05
& A8 e8 z, W% QlambdaB: 8.000000e-05
- Q6 @; [2 S; n- K; v$ Ninitial pulse width: 7.848788e-13
& [) e" V1 w$ i4 d1 B9 F! k9 Aoutput pulse width: 5.778485e-13
$ q' a5 L; k' r. tdispersion length: 5.852858e-02
* x4 c) K$ H5 j9 P$ t/ t4 V5 y( rnonlinear length: 9.195277e-01' p, P! U* Y$ W5 n0 }2 m
' }, l) e3 F, {' {/ O# f$ M; a
- g! U1 x2 N  i# G; N

7 {) c% L9 o3 m$ J' M, [. U现在想要把所有的数字信息提取出来:: w# j8 H' _9 B. F: o4 H  u
1 ~" X0 Q8 u' e6 ~. t/ B7 `# K
  • 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);
    7 E* k$ X0 _/ H7 a' W

0 c# E0 O& B$ W  t# W5 j- C9 [; v2 g7 {' W) T. }) {
" ]4 h3 E5 G" [- ]2 h3 h# j7 |& Y
( I2 `% T6 `7 n& \0 @1 h# c0 O

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-30 04:31 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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