|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1 l3 v. [% w3 p3 Jfscanf
2 K& x$ j; k2 ^6 s按指定格式从文本文件中读取数据。用法:
- W+ M6 z& M" g9 O8 @. x: h- y. ^7 U/ \( E3 ~- Z! h
- A = fscanf(fileID,formatSpec);
- %通过指定读取格式formatSpec,从文本文件中读取数据至列向量A。fscanf会重复应用格式字符串formatSpec,直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取自动结束。
- A = fscanf(fileID,formatSpec,sizeA);
- %sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。
: O3 N/ G/ r: H& ~
3 l# f4 l) x, ]4 }9 ~7 d& o. ~0 p P* }
+ V) a$ t$ F" F0 H0 q# t L3 u所要读取的文本文件被文件标识符 fileID 标识,通过 fopen 函数可以获取文件的 fileID。当结束读取时,一定要记得使用 fclose 函数关闭文件。 , k8 p9 a6 \; Q$ R- s& ]9 e7 e
光看函数的用法介绍可能会比较难懂,通过下面的例子会比较容易理解。 例:文本文件 test.txt 包含以下数据:3 K0 E5 B" _: t' K# n. U3 o
16。2。3。13: G- i- f6 |1 w0 J
5。11。10。8! S. e& S4 r$ B! u6 g" M3 }
9。7。6。12
' j3 u7 ^9 O0 b$ n: g4。14。15。1$ l' A1 R& n/ g# _
/ Z& L" z' ~# P0 N- 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
* l1 k0 V" p \* y! t * @2 E S4 K1 h& U& d+ l; C. @
6 K! g; y: d, _( q, ]! ]7 a8 G3 D2 |下面详细解释一下 fscanf 的读取原理: 3 u8 G4 I8 P5 h6 z; j6 ?
* a- B" }! T m$ L# y' ^' Y! ~/ N当用 fopen 打开文件时,会有一个文件指针在文件开头。fscanf 通过你设定的格式字符串 formatSpec 来读取数据(formatSpec 由字符串和转义说明符组成,其中转义说明符由 % 开头,以转换字母结尾。上面的例子中 %d 就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec 第一个字符块为转义说明符 %d,那么 fscanf 会先将第一个整数16读入进 A,之后文件指针跳至16右边,formatSpec 第2个字符块是字符串’。’,由于它不是转义说明符,文件指针会跳过’。’到达’。’右边。之后再是转义说明符 %d,则将2读入进 A,以此类推。
4 ~( D* B7 C& G( }* T E用下面图片进行说明:
6 f6 V9 P) h d9 K# a# d2 Y2 j
. F9 w8 p4 S# t
" U! D# u5 Y7 F& T! k# P: k/ V' j! Z/ p' z0 s
5 Q! b- _' m& ~+ P) I
如果将这个例子的读取代码写成:6 y" Q& J8 N8 W; u) X
4 y/ Z; E# v" b/ R; W& C
- fid = fopen('test.txt');
- A = fscanf(fid,'%d。',[4,4])
- fclose(fid);
- A = A.'9 j7 y, o/ @, L. u* u
+ a8 S0 x7 N r3 W. k将会得到:
" P1 k S& |- U0 B' k) @+ W. ]. }3 z+ L
- A =
- 16 2 3 13
2 X! W" g2 v# o' r4 g: c
8 t* |5 {, v# U& k3 t' N. O
- f% ?- E6 F) ~' d原因就是当文件指针读取完13时,formatSpec 需要匹配的字符串是’。’,但是13的下一个字符串是5,匹配失败,fscanf 停止读取。1 Z- @! C, {0 W' K4 G+ }
再以一个比较复杂的文本文件为例:$ x% J& c$ z b4 ?% w! i- M9 @7 o
例:文本文件test.txt包含以下数据:* x: i5 z7 ]+ Q8 t1 V$ l5 W
lambda: 7.580000e-05
# ^3 y2 M" ]1 S3 ?, ?lambdaB: 8.000000e-059 m# g# ^, S7 E7 u& Q. C! _. w
initial pulse width: 7.853636e-13
& T6 F# E. `+ ?7 A t ~" W" j( xoutput pulse width: 6.253030e-13
& _8 H. w0 D5 g4 e" ydispersion length: 6.307732e-02
s# C/ r z2 {$ Anonlinear length: 9.572495e-01& c& o. ]4 l8 I. q
- X6 l; y. |5 _+ ?0 }$ E
lambda: 7.590000e-05
1 K4 Q8 M3 s( I# v! E0 t1 OlambdaB: 8.000000e-05
5 n7 m1 [9 F/ Pinitial pulse width: 7.848788e-139 D9 h+ V. w) _& M1 J) Z5 v
output pulse width: 5.778485e-131 P% ^. f; P8 [; x2 T) K$ Y) ~
dispersion length: 5.852858e-02# k1 D) U4 ]+ a% p5 I4 e# f6 E7 f
nonlinear length: 9.195277e-015 t4 ~, w8 r. c
… 1 Z& v% s7 M. h3 Q
+ h6 z* [% Y4 K& k( F
6 j/ H4 r% X+ f6 v8 d+ Q现在想要把所有的数字信息提取出来:6 d7 S7 Y1 j7 Z) f0 f1 f
: B l. r! n4 C+ ~; q6 I5 U" R1 M1 P
- 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);
5 x, o$ n9 U; J+ I) Y 4 \' u8 }( C+ O. g
- j5 A9 T% S1 W5 c8 Y. B
) S# O4 H. K6 f; M3 H& ~2 [7 a2 G U' l& Z) E; d' k
|
|