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

MATLAB读取文本文件之fscanf函数

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
( y' D9 X( ^+ H1 I) Y7 J- W
fscanf. W1 a& n$ z; K  M- {" @. e( H
按指定格式从文本文件中读取数据。用法:
  ^% t8 q, s( ~; z7 {2 k4 i" Z) B* X4 i
  • A = fscanf(fileID,formatSpec);
  • %通过指定读取格式formatSpec,从文本文件中读取数据至列向量A。fscanf会重复应用格式字符串formatSpec,直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取自动结束。
  • A = fscanf(fileID,formatSpec,sizeA);
  • %sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。9 ], T$ R5 s. W3 u. N* Y' @
8 w' F( ?6 |) \4 U
, c: p' Y1 v% Q0 X5 ~' X
所要读取的文本文件被文件标识符 fileID 标识,通过 fopen 函数可以获取文件的 fileID。当结束读取时,一定要记得使用 fclose 函数关闭文件。
3 Z' m6 r4 L: V' k) W2 P1 a% R# z光看函数的用法介绍可能会比较难懂,通过下面的例子会比较容易理解。 例:文本文件 test.txt 包含以下数据:
; M& M% J3 {* L- m; j( O/ W: U. ?16。2。3。13
& z/ `+ o! p. r' C& y1 T5。11。10。8
; i) ?, |5 z0 ]7 `/ x. v/ N9。7。6。12
4 z) Y% \+ {2 q! d4。14。15。1
' ~9 v4 ?7 u, |. T
8 K) Z& J1 ]5 L- t4 U' P/ 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
    2 k9 Y, ~2 \" A, R9 E7 H6 f

$ l4 D% ^3 o$ T2 O) w9 C: j6 J( r! s0 U4 C1 n$ I- E
下面详细解释一下 fscanf 的读取原理: 6 e$ r0 o3 s% I8 a5 K6 J
8 E" z+ c& g3 e4 ]! Y3 a
当用 fopen 打开文件时,会有一个文件指针在文件开头。fscanf 通过你设定的格式字符串 formatSpec 来读取数据(formatSpec 由字符串和转义说明符组成,其中转义说明符由 % 开头,以转换字母结尾。上面的例子中 %d 就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec 第一个字符块为转义说明符 %d,那么 fscanf 会先将第一个整数16读入进 A,之后文件指针跳至16右边,formatSpec 第2个字符块是字符串’。’,由于它不是转义说明符,文件指针会跳过’。’到达’。’右边。之后再是转义说明符 %d,则将2读入进 A,以此类推。
/ G# Z- ~* t  O# y) A8 F' h* K用下面图片进行说明:* H( m% r' |% q) h7 s8 d

* {4 r2 A6 ~3 ?; {0 j: m4 x$ c
  K  M, \: M' T* x
4 _# @2 C! r% d( K( a# Y
- ?# `* G1 Q3 U4 x* f如果将这个例子的读取代码写成:
" p; v2 O: I4 `/ L0 Y: E! f/ `
% u6 x: Y& T- ?
  • fid = fopen('test.txt');
  • A = fscanf(fid,'%d。',[4,4])
  • fclose(fid);
  • A = A.'
    8 s' r3 B8 p$ }* {

2 H5 b/ I$ h" |: T( R% d0 W) A将会得到:
6 W! g+ L  ]" i# K. b0 L3 U- n) Z
  X. Q- ^- C  F3 L4 r
  • A =
  •     16     2     3    136 c2 H+ W5 d) r! T( f' c

9 r( _6 R& s$ H9 g% p0 G1 \, d) p
原因就是当文件指针读取完13时,formatSpec 需要匹配的字符串是’。’,但是13的下一个字符串是5,匹配失败,fscanf 停止读取。
( g; c( }" g) K; i1 q再以一个比较复杂的文本文件为例:$ F& P5 h4 r$ @  _, E& U' _
例:文本文件test.txt包含以下数据:2 _% d( H' X1 A2 v
lambda: 7.580000e-05 0 B' c9 R/ O* z# Y! {- V5 _
lambdaB: 8.000000e-05: J" x& \8 b. {  S- ~, i5 L' R
initial pulse width: 7.853636e-13" z/ G% O: \% w0 x+ b. k
output pulse width: 6.253030e-13
; h( v3 ]1 ?5 E! x8 z* Odispersion length: 6.307732e-02
5 U% t9 P( C5 Pnonlinear length: 9.572495e-011 e2 J9 ~6 _! Q
/ G4 j1 q# o* P$ b% h! S0 C
lambda: 7.590000e-05
7 [& B; I' ]1 D; E/ plambdaB: 8.000000e-05
0 t. N8 Q" @: pinitial pulse width: 7.848788e-13; `2 O2 F2 l5 B& A8 Z: @
output pulse width: 5.778485e-13, d( h$ O- i# J6 |2 Q
dispersion length: 5.852858e-02  ]3 n( ]+ @9 w$ F0 G+ M0 O! p
nonlinear length: 9.195277e-01
, `! O. ~2 `; L% D
, b! C- @+ ?* ?! p/ \- K+ l4 J9 l' S2 o$ ~! E, d& q
  C- ?9 ^, W, t9 j6 b
现在想要把所有的数字信息提取出来:
6 P, `8 b$ H8 D! W7 S; j) G2 O+ U( u2 F2 K6 I
  • 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);. |' D( W7 c% p

4 G/ a- W; N* x; k+ ]# c6 d$ s9 l3 t& @4 m) ]: O0 ^$ R/ g
2 G' V: i/ O! b3 p
) F( C9 q2 R/ w

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-4 20:33 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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