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

MATLAB读取文本文件之fscanf函数

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
4 F: d) @& ~( k: V3 ~2 [
fscanf  X* O# _( A% B! j
按指定格式从文本文件中读取数据。用法:
, v% R1 B1 @0 T  q8 R4 V
- w; W$ P5 V" p8 T9 X4 G. r* r
  • A = fscanf(fileID,formatSpec);
  • %通过指定读取格式formatSpec,从文本文件中读取数据至列向量A。fscanf会重复应用格式字符串formatSpec,直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取自动结束。
  • A = fscanf(fileID,formatSpec,sizeA);
  • %sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。
    + K: c& N9 M" T" J- a0 x2 H; H9 ?* _
, Q5 o# R7 J3 k2 f- M

! \. L7 l. A$ \$ {5 C所要读取的文本文件被文件标识符 fileID 标识,通过 fopen 函数可以获取文件的 fileID。当结束读取时,一定要记得使用 fclose 函数关闭文件。
' ~* _/ E6 ?9 z3 ^" ], S光看函数的用法介绍可能会比较难懂,通过下面的例子会比较容易理解。 例:文本文件 test.txt 包含以下数据:
" R( f5 i9 P$ y+ I5 ?16。2。3。131 S: A1 Q- i' t7 z( a- i& u
5。11。10。8# b3 p  K: \/ Y% P  c: ~
9。7。6。12
" ~3 _( B/ ^* d( s1 Z  d4 N4。14。15。1! y1 a" P' S$ G4 Y+ G! e5 L: k

, q: i' q' L0 M7 c& m
  • 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& y9 X; d- d8 L6 o7 D. v! C
% q6 I' x# w1 o' T% U

. Y8 d+ r8 r. ^$ Z7 e. U3 J下面详细解释一下 fscanf 的读取原理: 6 |. z6 G. \$ O) o! J+ I6 ^% S

1 A0 o9 ~+ a2 ^& V+ Y% j3 u当用 fopen 打开文件时,会有一个文件指针在文件开头。fscanf 通过你设定的格式字符串 formatSpec 来读取数据(formatSpec 由字符串和转义说明符组成,其中转义说明符由 % 开头,以转换字母结尾。上面的例子中 %d 就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec 第一个字符块为转义说明符 %d,那么 fscanf 会先将第一个整数16读入进 A,之后文件指针跳至16右边,formatSpec 第2个字符块是字符串’。’,由于它不是转义说明符,文件指针会跳过’。’到达’。’右边。之后再是转义说明符 %d,则将2读入进 A,以此类推。
4 U3 a7 O; \' j0 [用下面图片进行说明:
5 V2 h& e$ N  v* u" f. F( g# u2 N9 G$ P+ ~2 x$ m' J' E" |
$ g3 w9 j0 Q6 c
% F+ Y5 {8 T6 O2 c2 p

( j. `( A8 x# D: p* @如果将这个例子的读取代码写成:
7 M2 e0 i& Z& `
2 M) H$ |: S; J( _0 d( Y  W
  • fid = fopen('test.txt');
  • A = fscanf(fid,'%d。',[4,4])
  • fclose(fid);
  • A = A.'
    4 i" R0 N' J& j: O. D

5 w: U7 E6 u4 ]& J# E将会得到:
. r; Z2 G- l4 \, r1 _2 V* i( a2 v6 Q* U# z# Q
  • A =
  •     16     2     3    13
    6 t3 K" x* g, D

/ a# }% {; J5 j6 K+ L6 J
" T0 r: M4 A4 \: I  s- I" V; a9 I5 d原因就是当文件指针读取完13时,formatSpec 需要匹配的字符串是’。’,但是13的下一个字符串是5,匹配失败,fscanf 停止读取。
1 M% e8 k) s: e再以一个比较复杂的文本文件为例:
' f7 g' W( M' b: C! y例:文本文件test.txt包含以下数据:
( W# K6 {. Y) J3 ]( {lambda: 7.580000e-05
6 g0 c/ u" H" H' H  O* `; \7 alambdaB: 8.000000e-05
+ S$ {5 ]9 L4 hinitial pulse width: 7.853636e-13
7 ], k  t5 V% `8 c2 Y# r' T# koutput pulse width: 6.253030e-13
1 d* p2 y6 B& R! Gdispersion length: 6.307732e-02/ s. ?, j4 `! o9 o+ C$ d8 A
nonlinear length: 9.572495e-01
; M& `: G0 [, q. q* ~. M4 V0 {( }* z
lambda: 7.590000e-05
2 N, C* @3 ~8 G* b0 E& Q2 F3 G6 c8 VlambdaB: 8.000000e-05
9 y8 X1 E1 V( _) ginitial pulse width: 7.848788e-13% k6 x8 P# v* u9 P! t3 o7 K9 [
output pulse width: 5.778485e-130 ?- r6 i; w6 Q
dispersion length: 5.852858e-027 H2 Q" P2 g6 s6 a
nonlinear length: 9.195277e-015 N. I, o+ R# v% f6 ?( u

* k* ~/ q, R7 f" ~  I
: ]  P, q7 J' B; @3 {
; ?, T, V9 h; t+ P现在想要把所有的数字信息提取出来:
5 s$ M) H7 h9 J  w( C9 Y$ M. y* U! p" G/ f* j# z8 E
  • 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);6 s4 H+ N0 n, ^# f

5 p7 n* d7 i3 m& K
$ I1 s. ~' H0 @6 z5 ^
( }, A1 ~0 i4 K) b' `# }! w( H' i, D: G% B7 W2 \

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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